HackerEarth挑战计划 - 帮助戈登船长 - 我错过了哪个角落?

时间:2014-03-10 15:06:33

标签: algorithm

这是一个HackerEarth编程挑战问题。这是link

这是问题

  

一个庞大的罪犯网络正在JOKER下工作以摧毁和摧毁   拆除高谭市。戈登船长对这些事情非常紧张   罪犯可以做到高谭市。幸运的是,蝙蝠侠来到他的身边   救援并在蝙蝠侠的帮助下,他能够救援N.   被JOKER工作的罪犯困住的人质。他   使他们排成一列,每个N人质都被赋予身份   在1到N之间(包括)和没有2个人质具有相同的id。你是一个   新雇用的程序员被分配了跟踪的任务   作为戈登船长的人质的健康状况通过捐赠治愈他们   他们每次都服用阿司匹林。最初,每个人质的健康状况为0.然后   执行以下操作 -

     

•给予阿斯匹林有价值的人质   在x和y之间具有id(包括两者),它们增加了它们   通过v。呈现健康。

     

他要求你给他健康的总和   所有具有x和y之间的id的人质(包括两者)你能吗?   写一个跟踪戈登行动的程序?

     

INPUT 1st Line包含N-no。人质第二行包含M-no。的   戈登船长的行动。接下来的M行包含   “1 x y v”形式的行动,表示行动1或“   2 x y“表示行动2。

     

输出对于戈登船长所做的每一个动作,如果动作1是   执行,输出什么,但如果行动2执行,   程序必须输出Gordon要求的结果。

     

约束

     

1)N <= 10 ^ 5

     

2)M <= 10 ^ 5

     

3)1&lt; = x&lt; Y'LT; = N

     

4)0 <= v <= 100

Sample Input
5
6
2 1 5
1 3 4 5
2 2 4
1 1 3 10
1 1 5 5
2 1 5

Sample Output
0
10
65

有一个示例输入和示例输出。在提交答案之前,您可以编译代码并在那里进行测试。我的代码传递了它。然后你可以提交你的答案。提交答案后,您的代码将针对各种测试用例进行测试。

在10次测试中,我的代码成功通过了6次测试,部分4次测试。问题是你看不到哪些测试!!

有人可以发现我的代码有什么问题,或者我错过了哪些角落案例。这是代码

#include <stdio.h>

int main() {

    int N, M, i, j, x, y, v, sum, actn, arr[100001] = {0};

    scanf("%d%d", &N, &M);

    for (i = 1; i <= M; i++) {
        scanf("%d", &actn);

        if (actn == 1) {
            scanf("%d%d%d", &x, &y, &v);
            for (j = x; j <= y; j++)
                arr[j] += v;
        } else {
            scanf("%d%d", &x, &y);
            sum = 0;
            for (j = x; j <= y; j++)
                sum += arr[j];
            printf("%d\n", sum);
        }
    }

    return 0;
}

提前致谢

1 个答案:

答案 0 :(得分:0)

当输入范围为10 ^ 5时,可以使用segment trees完成这些类型的问题。

我们的想法是在树形结构中保持所有中间范围值的总和,并且当查询范围时,只需添加两个或三个子范围即可得到答案。