HNUSTOJ-1512 奇怪的导弹(暴力)

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 = 100000 + 5;
int sum[N << 2], M;
 
void Build(int n){
    for(M = 1; M <= n + 1; M *= 2);
    for(int i = M + 1; i <= M + n; ++ i) scanf("%d", &sum[i]);
    for(int i = M - 1; i > 0; -- i) sum[i] = sum[i << 1] + sum[i << 1|1];
}
 
void Updata(int n, int V){
    for(sum[n+=M] += V, n /=2 ; n > 0; n /= 2)
        sum[n] = sum[n << 1] + sum[n << 1|1];
}
int Query(int n){
    return sum[M + n];
}
int main(){
    int n, k, m;
    while(scanf("%d %d", &n, &k) == 2){
        Build( n );
        scanf("%d", &m);
        int p, l, r, c;
        while(m --){
            scanf("%d", &p);
            if(p == 1){
                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 = 100000 + 5;
int sum[N << 2], col[N];
 
void PushUP(int rt){
    sum[rt] = sum[rt << 1] + sum[rt << 1|1];
}
 
void Build(int l, int r, int rt){
    if(l == r){
        scanf("%d", &sum[rt]);
        col[l] = sum[rt];
        return;
    }
    int m = (l + r) >> 1;
    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) >> 1;
    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) == 2){
        Build(1, n, 1);
        scanf("%d", &m);
        int p, l, r, c;
        while(m --){
            scanf("%d", &p);
            if(p == 1){
                scanf("%d %d %d", &l, &r, &c);
                for(int i = l; i <= r; i += k)
                    Updata(i, -c, 1, n, 1);
            }else{
                scanf("%d", &c);
                printf("%d\n", col[c]);
            }
        }
    }
}
#include<iostream>
#include<cstring>
#include<cstdio>
 
using namespace std;
const int N = 100000 + 5;
 
int sum[N];
 
void Init(int n){
    for(int i = 1; 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) == 2){
        Init( n );
        scanf("%d", &m);
        int p, l, r, c;
        while(m --){
            scanf("%d", &p);
            if(p == 1){
                scanf("%d %d %d", &l, &r, &c);
                Updata(l, r, -c, k);
            }else{
                scanf("%d", &c);
                printf("%d\n", sum[c]);
            }
        }
    }
}
 

 

 
posted @ 2017-08-30 21:09  Pretty9  阅读(208)  评论(0编辑  收藏  举报