HUD-4217-Data Structure?

7959 ワード

//題意はあなたに1-nの数をあげて、毎回K番目の小さい数を削除して、これらの数の和//を削除することを求めます
ACコード:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
const int MAX=262145; int sum[MAX<<2]; void build(int l,int r,int rt) {
    sum[rt]=r-l+1;// 
 if(l==r) { return; } int m=(l+r)>>1;
    build(lson);
    build(rson); } int updata(int x,int l,int r,int rt) {
    sum[rt]--; if(l==r) { return l; } int m=(l+r)>>1; if(sum[rt<<1]>=x)
        updata(x,lson); else
        updata(x-sum[rt<<1],rson);//x-sum[rt<<1] 
} int main() { int t;
    scanf("%d",&t); int k=1; while(t--) { int n,m;
        scanf("%d%d",&n,&m);
        build(1,n,1); int i; int x;
        LL s=0; for(i=1;i<=m;i++) {
            scanf("%d",&x);
            s+=updata(x,1,n,1); }
        printf("Case %d: %lld
"
,k++,s); } return 0; }