题意:给你一个N,K;然后又有K个数i;表示从1,2,3…N个数 经过K次操作,每次操作是去掉第i小的数。求所有去掉数的之和;
思路:用线段树写的,具体看代码吧
#include<iostream> #include<cstdio> using namespace std; const int maxn=272144; int tree[maxn<<2]; int pos; void build(int l,int r, int rt) { tree[rt]=r-l+1; if(l==r) return ; int m = ( l + r ) >> 1; build( l , m , rt << 1 ); build( m+1 , r , rt << 1 | 1 ); } void update(int p,int l,int r, int rt) { tree[rt]--; if(l == r) { pos = l; return ; } int m = ( l + r ) >> 1; if(tree[rt << 1] >= p) update( p , l , m , rt<<1 ); else { p -= tree[rt << 1]; update(p,m+1,r,rt << 1 | 1); } } int main() { int t,n,k,ki; __int64 sum; scanf("%d",&t); for(int T=1;T<=t;T++) { sum=0; scanf("%d%d",&n,&k); build(1,n,1); for(int i=1;i<=k;i++) { scanf("%d",&ki); update(ki,1,n,1); sum+=pos; } printf("Case %d: %I64d\n",T,sum); } }