现在的位置: 首页 > 综合 > 正文

hdu 4883

2019年09月06日 ⁄ 综合 ⁄ 共 1240字 ⁄ 字号 评论关闭
#include <iostream>
#include <cstdio>
using namespace std;
const int MAX=100010;
struct Line {
    int left;
    int right;
    int cnt;  //延迟标记
}a[MAX];

int n,m,l,r; //n长度,m线段数
int sum;

//函数中的num是节点编号


//构建
void Build(int l, int r, int num) {
    a[num].left = l;
    a[num].right = r;
    a[num].cnt = 0;
    if(l==r)
        return ;
    int mid = (a[num].left + a[num].right)/2;
    Build(l, mid, num*2);
    Build(mid+1, r, num*2+1);
}


//查询
void Query(int l, int r, int num) {
    if(a[num].cnt!=0) {
        sum += a[num].cnt*(r-l+1);
    }
    if(a[num].left == a[num].right)
        return ;
    int mid = (a[num].left + a[num].right)/2;
    if(r<=mid)
        Query(l, r, num*2);
    else if(l>mid)
        Query(l, r, num*2+1);
    else {
        Query(l, mid, num*2);
        Query(mid+1, r, num*2+1);
    }
}


//更新
void Change(int l, int r, int num, int add) {
    if(l==a[num].left && r==a[num].right) {
        a[num].cnt+=add;
        return ;
    }
    if(a[num].left == a[num].right)
        return ;
    int mid = (a[num].left + a[num].right)/2;
    if(r<=mid)
        Change(l, r, num*2, add);
    else if(l>mid)
        Change(l, r, num*2+1, add);
    else {
        Change(l, mid, num*2, add);
        Change(mid+1, r, num*2+1, add);
    }
}

int main()
{
    // freopen("in","r",stdin);
    // freopen("out","w",stdout);
    int ans,n,m,t,i,x,y,add,a1,a2,a3,a4;
    scanf("%d",&t);
    while( t-- )
    {
        Build(0,1440,1);
        scanf("%d",&m);
        while( m-- ){
            scanf("%d %d:%d %d:%d",&add,&a1,&a2,&a3,&a4);
            a1=60*a1+a2; a2=60*a3+a4;
            Change(a1,a2-1,1,add);
        }

        ans=0;
        for(i=0;i<=1440;i++){
            sum=0;
            Query(i,i,1);
            ans=(ans>sum?ans:sum);
        }
        printf("%d\n",ans);
        
    }
    return 0;
}

抱歉!评论已关闭.