1512: 奇怪的导弹

时间限制: 3 Sec  内存限制: 32 MB
提交: 31  解决: 13
[提交][状态][讨论版]

题目描述

最近国际形势比较紧张,就拿中国来说,比如南海问题,钓鱼岛事件等等,由此看出海防是国防中的重要一块

为了加强海防,我国最近研制出了一种非常厉害且奇怪的导弹,导弹可以跳跃式打击,每次可以杀死c个人,假设

海岸线上有n个敌军的阵地,如果现在中弹的敌军阵地是第i个,那么下一个中弹的敌军阵地就是第i+k个,由于导

弹的能量有限,所以它打击的最远距离不会超过第r个敌军阵地;我国海军最高指挥官有两件事要做,我们暂且把它

定义为1号事件,2号事件;

1号事件:发射一枚每次可以杀死c个人的导弹打击敌军的第L个阵地,估计这枚导弹最远能到达敌军的第R

个阵地(但第R个阵地不一定打得到,因为导弹是跳跃式的)

2号事件:刺探第i个敌军阵地还剩多少人;

(c可以为负数,每个敌军阵地的人数也可能是负数,虽然有点不符合常理,但是为了解题的需要,就...) 
 
当指挥官做第2号事情的时候,每次想要知道第i个敌军阵地的现有人数,你能帮助他解决这个问题吗?

输入

有多组测试数据,输入到文件尾结束,每组测试数据表述如下

第一行输入两个数n和k代表敌军阵地的个数和导弹的跳跃距离

第二行输入n个数a1....an,表示第1-n个敌军阵地的现有人数;

第三行输入一个数m表示指挥官要做的m件事;

下面m行每行表示一件事情 (事情就是上面的1号或2号事件)

1号事件输入格式是:1 L R c
2号事件输入格式是:2 i

(1,2号事件的参数描述如上)

(c,ai为整数,其他的输入数据皆为正整数,-500<c,ai<500,0<m<=100000,0<k<=n<100000,0<l<=r<n,0<i<=n)

输出

输出只包含一行,输出2号事情的结果,也就是第i个敌军阵地的现有人数

样例输入

5 1
1 2 3 4 5
3
1 1 5 -2
1 1 2 1
2 2 5 2
1 2 3 4 5
4
1 1 5 -2
1 1 2 1
2 1
2 3

样例输出

3
2
5
这题貌似是线段树的题,结果上来就敲线段树,结果问的竟然是单点。。。汗。。。学长在搞什么鬼。。。直接暴力就能过。。。
#include<iostream>
#include<cstring>
#include<cstdio> using namespace std;
const int N = + ;
int sum[N << ], M; void Build(int n){
for(M = ; M <= n + ; M *= );
for(int i = M + ; i <= M + n; ++ i) scanf("%d", &sum[i]);
for(int i = M - ; i > ; -- i) sum[i] = sum[i << ] + sum[i << |];
} void Updata(int n, int V){
for(sum[n+=M] += V, n /= ; n > ; n /= )
sum[n] = sum[n << ] + sum[n << |];
}
int Query(int n){
return sum[M + n];
}
int main(){
int n, k, m;
while(scanf("%d %d", &n, &k) == ){
Build( n );
scanf("%d", &m);
int p, l, r, c;
while(m --){
scanf("%d", &p);
if(p == ){
scanf("%d %d %d", &l, &r, &c);
for(int i = l; i <= r; i += k)
Updata(i, -c);
}else{
scanf("%d", &c);
printf("%d\n", Query(c));
}
}
}
}
#include<iostream>
#include<cstring>
#include<cstdio> using namespace std;
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1|1 const int N = + ;
int sum[N << ], col[N]; void PushUP(int rt){
sum[rt] = sum[rt << ] + sum[rt << |];
} void Build(int l, int r, int rt){
if(l == r){
scanf("%d", &sum[rt]);
col[l] = sum[rt];
return;
}
int m = (l + r) >> ;
Build(lson);
Build(rson);
PushUP(rt);
} void Updata(int p, int c, int l, int r, int rt){
if(l == r){
sum[rt] += c;
col[l] = sum[rt];
return;
}
int m = (l + r) >> ;
if(p <= m) Updata(p, c, lson);
else Updata(p, c, rson);
PushUP(rt);
} int main(){
int n, k, m;
while(scanf("%d %d", &n, &k) == ){
Build(, n, );
scanf("%d", &m);
int p, l, r, c;
while(m --){
scanf("%d", &p);
if(p == ){
scanf("%d %d %d", &l, &r, &c);
for(int i = l; i <= r; i += k)
Updata(i, -c, , n, );
}else{
scanf("%d", &c);
printf("%d\n", col[c]);
}
}
}
}
#include<iostream>
#include<cstring>
#include<cstdio> using namespace std;
const int N = + ; int sum[N]; void Init(int n){
for(int i = ; i <= n; i++) scanf("%d", &sum[i]);
} void Updata(int l, int r, int c, int k){
for(int i = l; i <= r; i += k) sum[i] += c;
} int main(){
int n, k, m;
while(scanf("%d %d", &n, &k) == ){
Init( n );
scanf("%d", &m);
int p, l, r, c;
while(m --){
scanf("%d", &p);
if(p == ){
scanf("%d %d %d", &l, &r, &c);
Updata(l, r, -c, k);
}else{
scanf("%d", &c);
printf("%d\n", sum[c]);
}
}
}
}
 

最新文章

  1. HTML3
  2. 【转】T-SQL查询进阶—理解SQL Server中的锁
  3. select问题总结
  4. AngularJS快速入门指南15:API
  5. 九度oj 题目1034:寻找大富翁
  6. C# XML序列化操作菜单
  7. [问题]编译报错:clang: error: linker command failed with exit code 1及duplicate symbol xxxx in错误解决方法之一
  8. ubuntu 配置android开发环境
  9. rotatelogs分割apache日志文件
  10. vuex state使用
  11. 通过sort()方法实现升序和降序排列
  12. mac安装postman
  13. 你不知道的JS(2)深入了解闭包
  14. AviSynth AVS Importer Plugin for Adobe Premiere Pro CC 2015 x64
  15. 光纤网卡、HBA卡和RAID卡的区别(图)
  16. 网页图表Highcharts实践教程之外层图表区
  17. Linux设备驱动剖析之IIC(四)
  18. 使用ApiPost测试接口时需要先登录怎么办?利用Cookie模拟登陆!
  19. RPC框架之Thrift分析(转)
  20. 控制器中添加DB类才可以操作数据库表中的数据

热门文章

  1. python学习之路(11)
  2. 并发量,tps,qps
  3. Android动态广播的注册与销毁
  4. LeetCode 96. 不同的二叉搜索树(Unique Binary Search Trees )
  5. In an ASP.NET website with a codebehind at what point are the .cs files compiled?
  6. spark 笔记 6: RDD
  7. windows环境安装nexus
  8. leetcode-easy-others-268 Missing Number
  9. leetcode-easy-math-326. Power of Three
  10. 如何解决Struts2和Servlet共存问题