fzu 2171 防守阵地 II

Problem 2171 防守阵地 II

Accept: 31    Submit: 112
Time Limit: 3000 mSec    Memory Limit : 32768 KB

fzu 2171 防守阵地 II Problem Description

部队中总共有N个士兵,每个士兵有各自的能力指数Xi,在一次演练中,指挥部确定了M个需要防守的地点,指挥部将选择M个士兵依次进入指定地点进行防守任务,获得的参考指数即为M个士兵的能力之和。随着时间的推移,指挥部将下达Q个指令来替换M个进行防守的士兵们,每个参加完防守任务的士兵由于疲惫等原因能力指数将下降1。现在士兵们排成一排,请你计算出每次进行防守的士兵的参考指数。

fzu 2171 防守阵地 II 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。

fzu 2171 防守阵地 II Output

输出Q行,每行一个整数,为每次指令执行之后进行防守的士兵参考指数。

fzu 2171 防守阵地 II Sample Input

5 3 3
2 1 3 1 4
1
2
3

fzu 2171 防守阵地 II Sample Output

6
3
5
 
 
 #include<iostream>
#include<stdio.h>
#include<cstring>
#include<cstdlib>
#include<cstdlib>
using namespace std; int date[];
struct node
{
int l,r;
int color;
int len;
int sum;
}f[*];
void build(int l,int r,int n)
{
int mid=(l+r)/;
f[n].l=l;
f[n].r=r;
f[n].color=;
f[n].len=f[n].r-f[n].l+;
if(l==r){
f[n].sum=date[l];
return;
}
build(l,mid,n*);
build(mid+,r,n*+);
f[n].sum=f[n*].sum+f[n*+].sum;
}
void pudown(int n)
{
f[n*].color+=f[n].color;
f[n*+].color+=f[n].color;
f[n].color=; if(f[n*].l==f[n*].r && f[n*].color>)
{
f[n*].sum-=f[n*].color;
f[n*].color=;
}
if(f[n*+].l==f[n*+].r && f[n*+].color>)
{
f[n*+].sum-=f[n*+].color;
f[n*+].color=;
}
}
int query(int l,int r,int n)
{
int mid=(f[n].l+f[n].r)/;
int tmp;
if(f[n].l==l && f[n].r==r)
{
return f[n].sum-f[n].len*f[n].color;
}
if(f[n].color!=)
pudown(n);
if(mid>=r)
tmp = query(l,r,n*);
else if(mid<l)
tmp = query(l,r,n*+);
else{
tmp = query(l,mid,n*)+query(mid+,r,n*+);
}
return tmp;
}
void update(int l,int r,int n)
{
int mid=(f[n].l+f[n].r)/;
if(f[n].l==l && f[n].r==r)
{
f[n].color++;
return;
}
if(mid>=r)
update(l,r,n*);
else if(mid<l)
update(l,r,n*+);
else
{
update(l,mid,n*);
update(mid+,r,n*+);
}
f[n].sum=f[n*].sum-f[n*].color*f[n*].len + f[n*+].sum-f[n*+].len*f[n*+].color;
}
int main()
{
int n,m,q,k,i,l,r;
while(scanf("%d%d%d",&n,&m,&q)>)
{
for(i=;i<=n;i++)
scanf("%d",&date[i]);
build(,n,);
while(q--)
{
scanf("%d",&l);
r=l+m-;
k=query(l,r,);
update(l,r,);
printf("%d\n",k);
}
}
return ;
}
上一篇:HDU 4691 正解后缀数组(暴力也能过)


下一篇:创建一个点状注记(MarkerElement)