Problem 2171 防守阵地 II
Accept: 31 Submit: 112
Time Limit: 3000 mSec Memory Limit : 32768 KB
Problem Description
部队中总共有N个士兵,每个士兵有各自的能力指数Xi,在一次演练中,指挥部确定了M个需要防守的地点,指挥部将选择M个士兵依次进入指定地点进行防守任务,获得的参考指数即为M个士兵的能力之和。随着时间的推移,指挥部将下达Q个指令来替换M个进行防守的士兵们,每个参加完防守任务的士兵由于疲惫等原因能力指数将下降1。现在士兵们排成一排,请你计算出每次进行防守的士兵的参考指数。
Input
输入包含多组数据。
输入第一行有两个整数N,M,Q(1<=N<=100000,1<=M<=1000,1<=Q<=100000),第二行N个整数表示每个士兵对应的能力指数Xi(1<=Xi<=1000)。
接下来Q行,每行一个整数X,表示在原始队列中以X为起始的M个士兵替换之前的士兵进行防守。(1<=X<=N-M+1)
对于30%的数据1<=M,N,Q<=1000。
Output
输出Q行,每行一个整数,为每次指令执行之后进行防守的士兵参考指数。
Sample Input
5 3 3
2 1 3 1 4
1
2
3
Sample Output
6
3
5
1 #include<iostream> 2 #include<stdio.h> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cstdlib> 6 using namespace std; 7 8 int date[100002]; 9 struct node 10 { 11 int l,r; 12 int color; 13 int len; 14 int sum; 15 }f[100002*4]; 16 void build(int l,int r,int n) 17 { 18 int mid=(l+r)/2; 19 f[n].l=l; 20 f[n].r=r; 21 f[n].color=0; 22 f[n].len=f[n].r-f[n].l+1; 23 if(l==r){ 24 f[n].sum=date[l]; 25 return; 26 } 27 build(l,mid,n*2); 28 build(mid+1,r,n*2+1); 29 f[n].sum=f[n*2].sum+f[n*2+1].sum; 30 } 31 void pudown(int n) 32 { 33 f[n*2].color+=f[n].color; 34 f[n*2+1].color+=f[n].color; 35 f[n].color=0; 36 37 if(f[n*2].l==f[n*2].r && f[n*2].color>0) 38 { 39 f[n*2].sum-=f[n*2].color; 40 f[n*2].color=0; 41 } 42 if(f[n*2+1].l==f[n*2+1].r && f[n*2+1].color>0) 43 { 44 f[n*2+1].sum-=f[n*2+1].color; 45 f[n*2+1].color=0; 46 } 47 } 48 int query(int l,int r,int n) 49 { 50 int mid=(f[n].l+f[n].r)/2; 51 int tmp; 52 if(f[n].l==l && f[n].r==r) 53 { 54 return f[n].sum-f[n].len*f[n].color; 55 } 56 if(f[n].color!=0) 57 pudown(n); 58 if(mid>=r) 59 tmp = query(l,r,n*2); 60 else if(mid<l) 61 tmp = query(l,r,n*2+1); 62 else{ 63 tmp = query(l,mid,n*2)+query(mid+1,r,n*2+1); 64 } 65 return tmp; 66 } 67 void update(int l,int r,int n) 68 { 69 int mid=(f[n].l+f[n].r)/2; 70 if(f[n].l==l && f[n].r==r) 71 { 72 f[n].color++; 73 return; 74 } 75 if(mid>=r) 76 update(l,r,n*2); 77 else if(mid<l) 78 update(l,r,n*2+1); 79 else 80 { 81 update(l,mid,n*2); 82 update(mid+1,r,n*2+1); 83 } 84 f[n].sum=f[n*2].sum-f[n*2].color*f[n*2].len + f[n*2+1].sum-f[n*2+1].len*f[n*2+1].color; 85 } 86 int main() 87 { 88 int n,m,q,k,i,l,r; 89 while(scanf("%d%d%d",&n,&m,&q)>0) 90 { 91 for(i=1;i<=n;i++) 92 scanf("%d",&date[i]); 93 build(1,n,1); 94 while(q--) 95 { 96 scanf("%d",&l); 97 r=l+m-1; 98 k=query(l,r,1); 99 update(l,r,1); 100 printf("%d ",k); 101 } 102 } 103 return 0; 104 }