zoukankan      html  css  js  c++  java
  • hdu 4288 Coder

    http://acm.hdu.edu.cn/showproblem.php?pid=4288

    题意:add 就是在集合里面加上一个数x; del 就是从集合里删去一个数x; sum是求位置i%5==3的数的和。

    tree[i].sum[5] 里面数组存的是不同位置%5之后分别对应的和。

      1 #include <cstdio>
      2 #include <cstring>
      3 #include <algorithm>
      4 #define maxn 100010
      5 using namespace std;
      6 
      7 char str[maxn][4];
      8 int x[maxn],xx[maxn];
      9 struct node
     10 {
     11     int r,l;
     12     __int64 sum[6];
     13     int cnt;
     14 }tree[maxn*4];
     15 
     16 void build(int i,int l,int r)
     17 {
     18     tree[i].l=l;tree[i].r=r;
     19     for(int j=0; j<5; j++) tree[i].sum[j]=0;
     20     tree[i].cnt=0;
     21     if(l==r) return ;
     22     int mid=(l+r)>>1;
     23     build(i<<1,l,mid);
     24     build(i<<1|1,mid+1,r);
     25 }
     26 
     27 void update(int i,int l,int r,int c,int num)
     28 {
     29     tree[i].cnt+=num;
     30     if(tree[i].l==l&&tree[i].r==r)
     31     {
     32         tree[i].sum[0]+=c;
     33         return ;
     34     }
     35     int mid=(tree[i].l+tree[i].r)>>1;
     36     if(r<=mid)
     37     {
     38         update(i<<1,l,r,c,num);
     39     }
     40     else if(l>mid)
     41     {
     42         update(i<<1|1,l,r,c,num);
     43     }
     44     else
     45     {
     46         update(i<<1,l,mid,c,num);
     47         update(i<<1|1,mid+1,r,c,num);
     48     }
     49     for(int j=0; j<5; j++)
     50     {
     51         tree[i].sum[j]=tree[i<<1].sum[j]+tree[i<<1|1].sum[((j-tree[i<<1].cnt)%5+5)%5];
     52     }
     53 }
     54 int bs(int l,int r,int data)
     55 {
     56     while(l<=r)
     57     {
     58         int mid=(l+r)>>1;
     59         if(xx[mid]==data)
     60         {
     61             return mid;
     62         }
     63         else if(xx[mid]>data)
     64         {
     65             r=mid-1;
     66         }
     67         else
     68             l=mid+1;
     69     }
     70 }
     71 int main()
     72 {
     73     int n;
     74     while(scanf("%d",&n)!=EOF)
     75     {
     76         int t1=0;
     77         for(int i=0; i<n; i++)
     78         {
     79             scanf("%s",str[i]);
     80             if(strcmp(str[i],"sum"))
     81             {
     82                 scanf("%d",&x[i]);
     83                 xx[t1++]=x[i];
     84             }
     85         }
     86         sort(xx,xx+t1);
     87         t1=unique(xx,xx+t1)-xx;
     88         build(1,1,t1);
     89         for(int i=0; i<n; i++)
     90         {
     91             int l1=bs(0,t1-1,x[i]);
     92             if(!strcmp(str[i],"add"))
     93             {
     94                 update(1,l1+1,l1+1,x[i],1);
     95             }
     96             else if(!strcmp(str[i],"del"))
     97             {
     98                 update(1,l1+1,l1+1,-x[i],-1);
     99             }
    100             else if(!strcmp(str[i],"sum"))
    101             {
    102                 printf("%I64d
    ",tree[1].sum[2]);
    103             }
    104         }
    105     }
    106     return 0;
    107 }
    View Code
  • 相关阅读:
    导包Scanner类---Java
    标准类组成---Java
    Educational Codeforces Round 54 (Rated for Div. 2) A. Minimizing the String
    [专题总结] 二分搜索专题
    [最大权森林] [POJ] 3723 Conscription
    [模板] 快读快写
    [模板] 常用数论 -> gcd、exgcd、乘法逆元、快速幂、快速乘、筛素数、快速求逆元、组合数
    [模板] 堆 heap
    牛客小白月赛8 F-数列操作 (有序表)
    [模板] 字符串处理函数
  • 原文地址:https://www.cnblogs.com/fanminghui/p/3913871.html
Copyright © 2011-2022 走看看