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 }

 

你可能感兴趣的:(fzu 2171 防守阵地 II)