HLG 2256 南西群岛海域 -冲之岛近海(数组运用)(hash应用)

感觉这个题写了题解~也是没有人看T T我们理工OJ刷题的人真的是一点都不多T T

也算是整理留给自己的东西吧

南西群岛海域·冲之岛近海
Time Limit: 3000 MS Memory Limit: 32768 K
Total Submit: 70(27 users) Total Accepted: 28(25 users) Rating: Special Judge: No
Description

报告称本海域有敌人反攻的前兆。编成以巡洋舰为中心的警戒部队,探明敌舰队动向。

假定当前敌舰采用了排成一行的阵型,m只敌舰分别在从1m的位置上。(包括1m。)在一场战斗的炮击阶段,每个舰娘都可以对一个范围内的所有敌舰造成一定的伤害。如果敌舰受到的伤害大于了自己的血量,就会被击沉。可是愚蠢、调皮又二次元的提督小林,他想知道任意一个区间有多少只敌舰被击沉了。你能帮助他么?

Input
输入由有多组数据组成,每组数据的第一行包括了三个整数m、n和q,分别表示敌舰的个数、舰娘的个数和小林的询问的个数。(1≤m,n≤10^5,q≤1000)
接下来的一行包括m个整数,表示每个敌舰的血量a。(1≤a≤10^9)
接下来的n行,每行包括了三个整数,L、R、x,表示对[L,R]范围内的所有敌舰造成x点伤害。(1≤L,R≤m, 1≤x≤100)
接下来的q行,每行包括了两个整数,L和R。你需要输出[L,R]范围内被击沉的敌舰的个数。
Output
对于每个查询输出包括一行,有一个整数,表示被击沉的敌舰的个数。
Sample Input

2 1 1

1 1

1 2 2

1 2

3 1 1

1 2 3

1 3 2

1 3
Sample Output

2

1

Source
“尚学堂杯”2015级程序设计竞赛(10月)正式赛
Author

TwIStOy

转自大牛代码:

#include <stdio.h>
#include <string.h>
    int n,m,q,hash[100005],num[100005],a[100005],l,r,x;
int main()
{
    while(scanf("%d%d%d",&n,&m,&q)!=EOF)
    {
        memset(hash,0,sizeof(hash));
        memset(num,0,sizeof(num));
        for(int i = 1; i <= n; ++i)
            scanf("%d",&a[i]);
        while(m--)
        {
            scanf("%d%d%d",&l,&r,&x);
            hash[l]+=x;
            hash[r+1]-=x;
        }
        int temp = 0,all = 0;
        for(int i = 1; i <= n; ++i)
        {
            temp+=hash[i];
            if(temp>a[i])
                all++;
            num[i] = all;
        }
        while(q--)
        {
            scanf("%d%d",&l,&r);
            printf("%d\n",num[r]-num[l-1]);
        }
    }
    return 0;
}


}



你可能感兴趣的:(hash,OJ,哈理工,2256)