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

xiaoxiao2021-02-28  104

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; }
转载请注明原文地址: https://www.6miu.com/read-64342.html

最新回复(0)