//题意就是给你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\n",k++,s); } return 0; }