fzu 2171 防守阵地 II

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\n",k);
101         }
102     }
103     return 0;
104 }

 

posted @ 2014-04-28 10:42  芷水  阅读(230)  评论(0编辑  收藏  举报