[统计]hunnu 10571 Counting Girls#树状数组

来源:互联网 发布:环形器三个端口 编辑:程序博客网 时间:2024/04/29 10:18
/**[统计]hunnu 10571 Counting Girls#树状数组command 0--60 x插入x1 x删除x2 x询问x的个数3 x询问第x大4 x,y 询问[x,y]区间个数5 x,y 询问[xth,yth]大的平均数6 询问数组大小用树状数组需要注意,输入的x可能为0,这里把所有的x处理成了x+1其次,题目描述坑爹,输入的x应该是小于200000*/#include <stdio.h>#include <string.h>using namespace std;#define N 200002#define lowbit(i) (i & -i)__int64 s[N],r[N];void add(int i,int c,__int64 *arr){    for(; i < N; i += lowbit(i))        arr[i] += c;}__int64 sum(int i,__int64 *arr){    __int64 ans = 0LL;    for(; i > 0; i -= lowbit(i))        ans += arr[i];    return ans;}int total;int getK(int x){    int l = 1,rr = N - 1,mid;    while(l < rr)    {        mid = ( l + rr) >> 1;        if(sum(mid,r) < x )            l = mid + 1;        else            rr = mid;    }    return rr;}int main(){    int n,t,com,x,y;    int s1,s2;    __int64 ss;    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        total = 0;        memset(s,0,sizeof(s));        memset(r,0,sizeof(r));        while(n--)        {            scanf("%d",&com);            switch(com){                case 0 :                    scanf("%d",&x);                    ++x;                    add(x,x,s);                    add(x,1,r);                    ++total;                    break;                case 1 :                    scanf("%d",&x);                    ++x;                    add(x,-x,s);                    add(x,-1,r);                    --total;                    break;                case 2 :                    scanf("%d",&x);                    ++x;                    printf("%I64d\n",sum(x,r) - sum(x-1,r));                    break;                case 3 :                    scanf("%d",&x);                    x = total - x + 1;                    printf("%d\n",getK(x) - 1);                    break;                case 4 :                    scanf("%d%d",&x,&y);                    printf("%I64d\n",sum(y+1,r) - sum(x,r));                    break;                case 5 :                    scanf("%d%d",&x,&y);                    x = total - x + 1;                    y = total - y + 1;                    s1 = getK(x);                    s2 = getK(y);                    if(s1 == s2)                    {                        printf("%d.00\n",s1 - 1);                        break;                    }                    ss = sum(s1,s) - sum(s2-1,s) - x + y - 1;                    if(sum(s2,r) - sum(s2 -1,r) > 1)                        ss -= (y - sum(s2-1,r) - 1) * s2;                    if(sum(s1,r) - sum(s1 -1,r) > 1)                        ss -= (sum(s1,r) - x) * s1;                    printf("%.2lf\n",ss * 1.0 / (x - y + 1.0));                    break;                default :                    printf("%d\n",total);                    break;            }        }    }    return 0;}

原创粉丝点击