現在的位置: 首頁 > 綜合 > 正文

HNOJ Beads

2014年10月30日 ⁄ 綜合 ⁄ 共 2958字 ⁄ 字型大小 評論關閉
Beads
Time Limit: 1000ms, Special Time Limit:2500ms,Memory Limit:65366KB
Problem description
A game consists of putting beads in boxes. The rules of the game are too complex to describe here, but all you need to know is that keeping track of the number of beans in adjacent boxes are very important to the outcome of the game.
You are asked by a friend to write a program to help him win the game every time. At the start of a game, all boxes are empty.
Input
The first line of the input consists of a single number T, the number of games played. Each game start with a line describing B, P and Q, the number of boxes, put requests and query requests, respectively. Then follows P + Q lines with either P i a, saying
a beads are put in box number i,or Q i j, a query request for the number of beads in boxes i through j, inclusive.
Output
For each query request, output the number of beads in boxes a through b, inclusive, that are in the boxes at this point of the game.
Sample Input
1
7 5 3
P 2 1
P 3 3
P 4 7
Q 1 4
P 7 6
Q 4 4
P 6 4
Q 1 7
Sample Output
11
7
21
Judge Tips
0 < T 100 0 < B 100000 0 < P 30000 0 < Q <= 30000 0 <= a <= 100 0 < i <= j <= B Note that boxes are 1-indexed. This is an I/O-heavy problem. For Java programmers, this means
that you should use BufferedReader for input reading (not Scanner). It is also bene cial to build all output in a StringBuilder before printing in a single print statement.
Problem Source

IDIOPEN 2011

 

 

題目大意:赤裸裸的樹狀數組模板啊,但是不會碼,只好碼線段樹了,第一次碼線段樹,糾結~~囧。。調試了1個小時,囧。。

思路:cover:表示的是如果插入的數在某個區間內,該區間的cover就要相應加上該值。我無限調試在mid用的是線段的那一種情況,所以在分左右子樹的時候沒有mid+1.囧。。。

 

program:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
int sum;
struct node
{
  int a,b,cover;      
}tt[1000000];
void first(int p,int a,int b)
{
   int mid=(a+b)/2;
   tt[p].a=a;
   tt[p].b=b;
   tt[p].cover=0;
   if(a==b)
       return ;
   first(p*2,a,mid);
   first(p*2+1,mid+1,b);
    
}
void insert(int p,int i,int w)
{
     int mid=(tt[p].a+tt[p].b)/2;
    /* if(tt[p].a==a&&tt[p].b==b)
        {
          tt[p].cover++;                    
        }*/
     if(i>=tt[p].a  && i<=tt[p].b )
        {
           tt[p].cover+=w;            
        }
     if(tt[p].a==tt[p].b)
        return;
     if(i<=mid)
        insert(p*2,i,w);
     else if(i>=mid+1)
        insert(p*2+1,i,w);
}
void query(int p,int a,int b )
{
     int mid=(tt[p].a+tt[p].b)/2;
     //cout<<endl<<endl;
     //cout<< "tt[p].a tt[p].b tt[p].cover "<<tt[p].a<<' '<<tt[p].b<<' '<<tt[p].cover<<endl;
     if(tt[p].a==a&&tt[p].b==b)
        {
          sum+=tt[p].cover;//cout<<tt[p].cover<<endl;
          return;
        }
     if(tt[p].a==tt[p].b)////////////
        return;
     //cout<<"a b  "<<a<<' '<<b<<endl;
     //cout<<"mid   "<<mid<<endl;
     if(b<=mid)
        query(p*2,a,b);
     else if(a>=mid+1)///CAOCAOCAO  就是在這裡敗了,o(╯□╰)o
        query(p*2+1,a,b);
     else
        {
          query(p*2,a,mid);
          query(p*2+1,mid+1,b);               
        } 
          
}
int main()
{
int test;
scanf("%d",&test);
while(test--)
{  
   int B,P,Q;
   scanf("%d%d%d",&B,&P,&Q);
   first(1,1,B);
   char oder;int i,w;
   for(int k=1;k<=P+Q;k++)
   { 
     getchar();
     scanf("%c%d%d",&oder,&i,&w);
     if(oder=='P')
        insert(1,i,w);
     else if(oder=='Q')
        {
          sum=0;
          query(1,i,w);
          printf("%d\n",sum);
        }
   }           
}
//system("pause");
return 0;
}

抱歉!評論已關閉.