【ZZULIOJ 2171 】 举世伐唐 【线段树 区间修改+区间最大值】

Description

夫子将人间之气注入桑桑体内后,便再也无法隐瞒踪迹,昊天终于发现了他。
“恭请夫子显圣!”
西陵神国桃山最高处,庄严肃穆的神殿外,石坪上跪着黑压压的人群,往常骄横的红衣神官和神殿执事们。就像最虔诚的信徒,以额触地。
“恭请夫子显圣!”
极西荒原深处,天坑中央的巨峰之巅。悬空寺讲经首座的手中没有握着锡杖,而是诚心诚意地双手合什,无比恭敬地祝祷着。
遥远的南海某处。
青衣道人沉默看着陆地的方向,脸上的神情显得异常凝重。
他没有说那句话,因为他很紧张。
他看到一道大幕正在缓缓落下。
为了这一刻,他已经等待了太长时间,不到最后,他无法放心。

泗水畔。
黑色的罩衣在空中飘舞,夫子乘风而上。
桑桑随之而去,无数光明金花,从她的身体里溢出,洒向人间。
陈皮皮跪在知守观里的湖畔,对着天空不停流泪,双肩塌着,身体不停颤抖,眼睛哭到红肿,就像被雪迷了眼睛的兔子。
中年道人站在他身后,叹息安慰说道:“夫子既然已经显圣登天,那么你父亲便可以回来,至少这算是一件好事……陈皮皮的父亲是知守观观主。
他叫陈某,无数年来身上都是一袭青色道衣,故号青衣道人。
 。。。
夫子升天后 , 陈某回来了。开始了举世伐唐。
现在唐国情况危急,北方的金帐王国 , 南方的晋国 , 西方的月轮国兵员调动密集 , 一时间唐国边境线上烽火重重。

已知唐国边境上共有 n 个关卡 , 编号为别为 1 ... n。你现在是唐国军机处的一员情报人员 , 在你面前共有 m 份情报 ,每份情报有两个数 L , R表示有一股兵力将要袭击 L 到 R 区间里的所有关卡 ,对于每个关卡 ,每被袭击一次他的危险度就加一。

Input

  t( t<= 5)代表有 t 组数据.

每组数据 先输入 n , m(n<=100000 m<=100000) , 然后输入 m 行 , 每行 两个数 L , R(1<= L <= R <= n).
Output

输出所有关卡里危险度最高的关卡的危险度。

Sample Input

2
2 3
1 2
1 1
2 2
5 5
1 2
1 2
1 2
1 5
1 5
Sample Output

2
5

一看就是线段树吧 【ps 手感还不错,稍微调试点一次就过了,平常要调试半天 TAT 】

代码

#include<bits/stdc++.h>
#define ll o<<1
#define rr o<<1|1
#define lson o<<1,le,mid
#define rson o<<1|1,mid+1,ri
#define LL long long
using namespace std;
const int MAXN =100000+10;
const int MAXM = 200000;
struct Tree{// 线段树
    int l,r,lazy,maxx;
}tree[MAXN<<2];
void up(int o){ 
    tree[o].maxx=max(tree[ll].maxx,tree[rr].maxx);
} 
void down(int o){
    if(tree[o].lazy){
        tree[ll].lazy+=tree[o].lazy;
        tree[ll].maxx+=tree[o].lazy;

        tree[rr].lazy+=tree[o].lazy;
        tree[rr].maxx+=tree[o].lazy;
        tree[o].lazy=0;
    }
}
void build(int o,int le,int ri){
    tree[o]={le,ri,0,0};
    if(le==ri) return ;
    int mid=(le+ri)>>1;
    build(lson);
    build(rson);
    up(o);
} 

void update(int o,int le,int ri,int val){
    if(tree[o].l>=le&&tree[o].r<=ri) {
        tree[o].maxx+=val;
        tree[o].lazy+=val;
        return ;
    }
    down(o);
    int mid=(tree[o].l+tree[o].r)>>1;
    if(le>mid) update(rr,le,ri,val);
    else if(ri<=mid)  update(ll,le,ri,val);
    else  {
        update(ll,le,mid,val);
        update (rr,mid+1,ri,val);
    }
    up(o);
}
int query(int o,int le,int ri){
    down(o);
    if(tree[o].l>=le&&tree[o].r<=ri) return tree[o].maxx;
    int mid=(tree[o].l+tree[o].r)>>1;
    if(le>mid) query(rr,le,ri);
    else if(ri<=mid)  query(ll,le,ri);
    else return max(query(ll,le,mid),query(rr,mid+1,ri)) ;
}
int main(){
   int t;cin>>t;
   while(t--){
    int n,m;cin>>n>>m;
    build(1,1,n);
    int a,b;
    while(m--){
        scanf("%d%d",&a,&b);
        update(1,a,b,1);
    }
    //puts("-=======");
    int ans=query(1,1,n);   
    printf("%d\n",ans);
   } 
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值