• HDU 1556 线段树/树状数组/区间更新姿势 三种方法处理


    Color the ball

    Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 15145    Accepted Submission(s): 7540


    Problem Description
    N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色。但是N次以后lele已经忘记了第I个气球已经涂过几次颜色了,你能帮他算出每个气球被涂过几次颜色吗?
     
    Input
    每个测试实例第一行为一个整数N,(N <= 100000).接下来的N行,每行包括2个整数a b(1 <= a <= b <= N)。
    当N = 0,输入结束。
     
    Output
    每个测试实例输出一行,包括N个整数,第I个数代表第I个气球总共被涂色的次数。
     
    Sample Input
    3
    1 1
    2 2
    3 3
    3
    1 1
    1 2
    1 3
    0
     
    Sample Output
    1 1 1
    3 2 1
     
    Author
    8600
     
    Source
    题意: 区间更新 单点查询
    题解:
    1.线段树 处理:
     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<map>
     5 #include<queue>
     6 #include<stack>
     7 using namespace std;
     8 struct node
     9 {
    10     int l,r,value;
    11 }tree[400005];
    12 int ans[100005];
    13 int n;
    14 int aa,bb;
    15 int jishu=0;
    16 void buildtree(int root,int left,int right)
    17 {    
    18   tree[root].l=left;
    19   tree[root].r=right;
    20   tree[root].value=0;
    21   if(left==right)
    22     return ;
    23   int mid=(left+right)>>1;
    24   buildtree(root<<1,left,mid);
    25   buildtree(root<<1|1,mid+1,right);    
    26 }
    27 void updata(int c,int left,int right,int root)
    28 {
    29     if(tree[root].l==left&&tree[root].r==right)
    30     {
    31         tree[root].value+=c;
    32          return ;
    33     }    
    34     int mid=(tree[root].l+tree[root].r)>>1;
    35     if(right<=mid)
    36     updata(c,left,right,root<<1);
    37     else
    38     {
    39         if(left>mid)
    40         updata(c,left,right,root<<1|1);
    41         else
    42         {
    43         updata(c,left,mid,root<<1);
    44         updata(c,mid+1,right,root<<1|1);
    45         }
    46     }   
    47 }
    48 void sum(int root)
    49 {  
    50     if(tree[root].l==tree[root].r)
    51       {
    52           ans[jishu]=tree[root].value;
    53           jishu++;
    54           return ;
    55       } 
    56       tree[root<<1].value+=tree[root].value;
    57       tree[root<<1|1].value+=tree[root].value;    
    58       sum(root<<1);
    59       sum(root<<1|1);
    60 }
    61 int main()
    62 {
    63     while(scanf("%d",&n)!=EOF)
    64     {
    65         if(n==0)
    66         break;
    67     // memset(ans,0,sizeof(ans));
    68         buildtree(1,1,n);
    69         for(int i=1;i<=n;i++)
    70         {
    71           scanf("%d %d",&aa,&bb);
    72          updata(1,aa,bb,1);
    73         }
    74         jishu=1;
    75         sum(1);
    76         printf("%d",ans[1]);
    77         for(int i=2;i<=n;i++)
    78         printf(" %d",ans[i]);
    79         printf("
    ");
    80     }
    81     return 0;
     2.树状数组 处理
     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 using namespace std;
     5 int tree[1000005];
     6 int lowbit (int x)
     7 {
     8     return x&(-x);
     9 }
    10 void hsd (int a,int b,int c)
    11 {
    12     while(a<=c)
    13     {
    14         tree[a]+=b;
    15         a+=lowbit(a);
    16     }
    17 }
    18 int get(int x)
    19 { int sum=0;
    20     while(x>0)
    21     {
    22         sum+=tree[x];
    23         x-=lowbit(x);
    24     }
    25 return sum;
    26 
    27 }
    28 int main()
    29 {
    30     int n,i,a,b,x;
    31     while(scanf("%d",&n)!=EOF)
    32     {  if(n==0)
    33       break;
    34         memset(tree,0,sizeof(tree));
    35         for(i=1; i<=n; i++)
    36         {
    37             scanf("%d%d",&a,&b);
    38             hsd(a,1,n);
    39             hsd(b+1,-1,n);
    40         }
    41         printf("%d",tree[1]);
    42         for(i=2;i<=n;i++)
    43         {
    44             x=get(i);
    45             printf(" %d",x);
    46         }
    47         cout<<endl;
    48 
    49     }
    50     return 0;
    51 }

    3. 区间更新姿势  处理

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<map>
     5 #include<queue>
     6 #include<stack>
     7 using namespace std;
     8 int a[100005];
     9 int b[100005];
    10 int aa,bb;
    11 int n;
    12 int main()
    13 {
    14     while(scanf("%d",&n)!=EOF)
    15     {
    16         if(n==0)
    17          break;
    18          memset(a,0,sizeof(a));
    19          memset(b,0,sizeof(b));
    20          for(int i=1;i<=n;i++)
    21          {
    22              scanf("%d %d",&aa,&bb);
    23             b[aa]++;
    24             b[bb+1]--;
    25          }
    26          int q=0;
    27          for(int i=1;i<=n;i++)
    28          {
    29               q+=b[i];
    30               a[i]=q;         
    31          }
    32          printf("%d",a[1]);
    33          for(int i=2;i<=n;i++)
    34          printf(" %d",a[i]);
    35          printf("
    ");
    36     }
    37         return 0;
    38 } 
     
     
  • 相关阅读:
    AngularJS(三)——指令实战及自定义指令
    AngularJS(二)——常见指令以及下拉框实现
    AngularJS(一)理论篇
    【leetcode】8 integer to roman
    【leetcode】7 Roman to Integer
    【leetcode】6 Palindrome Number
    【leetcode】5 atoi
    【leetcode】4 Reverse Ingeger
    【leetcode】3 minstack
    【leetcode】2 数组元素右移
  • 原文地址:https://www.cnblogs.com/hsd-/p/5388889.html
Copyright © 2020-2023  润新知