全球防御 (树状数组,成段更新,单点求值)

来源:互联网 发布:sql脚本怎么执行 编辑:程序博客网 时间:2024/06/06 15:04

问题 F: 全球防御

时间限制: 1 Sec  内存限制: 128 MB
提交: 104  解决: 28
[提交][状态][讨论版]

题目描述

在25世纪人类科技高速发展,探知到未知的外星智能生物,科学家把他们称为XX,XX星球BOSS很没节操,他喜欢上地球美女Ting(真的beautiful),打算在七夕佳节不惜一切代价征服地球。然后抢占美女Ting。地球联军情报部门预先得到信息,七夕那天BOSS将派遣n个军团对地球发起进攻,每个军团进攻有起始时间si和终止时间ei,根据每个军团的数量、能力和武器等,情报部门计算出防御每个军团需要的太空舰艇数mi。由于费用和时间问题,地球联军希望用最小的太空舰艇数量防御住所有的军团进攻。

输入

第一行包含一个正整数T(T<=30),代表测试用例的个数。

    每个测试用例包含一个正整数n(1<=n<=100000),代表军团数量。

    接下来n行,每行三个整数,分别为起始时间si、终止时间ei和太空舰艇数mi,代表第i个军团进攻的起始时间si和终止时间ei以及防御该军团需要的太空舰艇数mi。

    0<si<ei<100000,mi<=1000

    注意:每个太空舰艇在防御完一个军团进攻后,可立即转入对另一个军团的防御,并且每个太空舰艇在每个时间点只能对一个军团进行防御,为了简化问题,我们不考虑防御每个军团的太空舰艇损失。

输出

对每个测试用例,输出所需太空舰艇的最小数量。

样例输入

3    2    3 4 5    4 5 6    2    3 5 5    4 5 6    3    3 5 4    4 5 3    6 7 7

样例输出

6117
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <string>using namespace std;int num[100010],n=100000;int lowbite(int i){    return i&-i;}void change(int i,int zhi)//更新{    while(i<=n)    {        num[i]+=zhi;        i+=lowbite(i);    }}int query(int i)//查询{    int sum=0;    while(i>0)    {        sum+=num[i];        i-=lowbite(i);    }    return sum;}int main(){    int t;    cin>>t;    while(t--)    {        int m;        cin>>m;        int max=0;        memset(num,0,sizeof(num));        for(int i=0,begin,end,w;i<m;i++)        {            scanf("%d%d%d",&begin,&end,&w);            change(end+1,-w);            change(begin+1,w);            if(end>max)                max=end;        }        int ans=0;        for(int i=1;i<=max;i++)        {            int x=query(i);            if(ans<x)                ans=x;        }        cout<<ans<<endl;    }    return 0;}

0 0
原创粉丝点击