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
 
 
 #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 ;
}

最新文章

  1. 从C++实现Ping开始说起
  2. C# XML技术总结之XDocument 和XmlDocument
  3. IT青年深圳销售求职经历
  4. Linux中 groupadd 和 useradd 的命令说明
  5. OpenCV人形检测Hog
  6. deleteRow
  7. 2015GitWebRTC编译实录8
  8. 结构体dtuple_t
  9. Android - N级树形结构实现
  10. mnist数据集转换bmp图片
  11. 【转载】ASP.NET MVC重写URL制作伪静态网页,URL地址以.html结尾
  12. 當 Alexa 遇上 ESP8266 (一)
  13. NodeJS简单爬虫
  14. Maven教程2(Eclipse配置及maven项目)
  15. 去掉HTML标记 .
  16. Servlet基本_画面遷移
  17. 树莓派进阶之路 (029) - 语音识别模块 LD3320(原创)
  18. 在EBS里新建一个OU的步骤
  19. eclipse 无法解析导入 javax.servlet 的解决方法
  20. Python——脚本(calculator)

热门文章

  1. cell点击按钮崩的一种情况
  2. [原创]Scala学习:数组的基本操作,数组进阶操作,多维数组
  3. [转]Chrome 控制台console的用法
  4. Extjs布局
  5. Hashtable和HashMap区别
  6. linux时间的查看与修改
  7. GitHub和SourceTree入门教程——(转载),希望能帮到有需要的人
  8. 05---Net基础加强
  9. sql查询所有表以及表名的模糊查询
  10. 夺命雷公狗---Thinkphp----11之管理员的增删改查的完善