HDU 5861 Road(线段树)
来源:互联网 发布:乐清市知临学校招聘 编辑:程序博客网 时间:2024/05/23 16:15
代码
#include <map>#include <set>#include <stack>#include <queue>#include <cmath>#include <string>#include <vector>#include <cstdio>#include <cctype>#include <cstring>#include <sstream>#include <cstdlib>#include <iostream>#include <algorithm>#pragma comment(linker,"/STACK:102400000,102400000")using namespace std;#define MAX 200005#define MAXN 1000005#define maxnode 205#define sigma_size 26#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define lrt rt<<1#define rrt rt<<1|1#define middle int m=(r+l)>>1#define LL long long#define ull unsigned long long#define mem(x,v) memset(x,v,sizeof(x))#define lowbit(x) (x&-x)#define pii pair<int,int>#define bits(a) __builtin_popcount(a)#define mk make_pair#define limit 10000//const int prime = 999983;const int INF = 0x3f3f3f3f;const LL INFF = 0x3f3f;const double pi = acos(-1.0);const double inf = 1e18;const double eps = 1e-4;const LL mod = 1e9+7;const ull mx = 133333331;/*****************************************************/inline void RI(int &x) { char c; while((c=getchar())<'0' || c>'9'); x=c-'0'; while((c=getchar())>='0' && c<='9') x=(x<<3)+(x<<1)+c-'0'; }/*****************************************************/int a[MAX];int sum[MAX<<2];int mini[MAX<<2],maxv[MAX<<2];int l[MAX],r[MAX];int tot;struct Edge{ int ti,x,flag; bool operator<( const Edge&e)const{ if(ti==e.ti) return flag<e.flag; return ti<e.ti; }}p[MAX*2];void pushup(int rt){ sum[rt]=sum[lrt]+sum[rrt];}void build(int l,int r,int rt){ sum[rt]=0; mini[rt]=INF; maxv[rt]=0; if(l==r){ return; } middle; build(lson); build(rson);}void pushdown(int rt){ if(mini[rt]!=INF){ mini[lrt]=min(mini[lrt],mini[rt]); mini[rrt]=min(mini[rrt],mini[rt]); } if(maxv[rt]!=0){ maxv[lrt]=max(maxv[lrt],maxv[rt]); maxv[rrt]=max(maxv[rrt],maxv[rt]); }}void update(int l,int r,int rt,int L,int R,int d){ if(L<=l&&r<=R){ mini[rt]=min(mini[rt],d); maxv[rt]=max(maxv[rt],d); return; } pushdown(rt); middle; if(L<=m) update(lson,L,R,d); if(R>m) update(rson,L,R,d);}void query(int l,int r,int rt){ if(l==r){ if(mini[rt]!=INF) p[tot++]=(Edge){mini[rt],l,1}; if(maxv[rt]!=0) p[tot++]=(Edge){maxv[rt]+1,l,0}; //cout<<maxv[rt]<<" "<<mini[rt]<<" "<<l<<endl; return ; } middle; pushdown(rt); query(lson); query(rson);}void up(int l,int r,int rt,int pos,int d){ if(l==r){ sum[rt]+=d; return; } middle; if(pos<=m) up(lson,pos,d); else up(rson,pos,d); pushup(rt);}int main(){ int n,m; while(cin>>n>>m){ for(int i=1;i<n;i++) scanf("%d",&a[i]); build(1,n-1,1); for(int i=1;i<=m;i++){ scanf("%d%d",&l[i],&r[i]); if(l[i]>r[i]) swap(l[i],r[i]); r[i]--; update(1,n-1,1,l[i],r[i],i); } tot=0; query(1,n-1,1); sort(p,p+tot); int tmp=0; build(1,n-1,1); for(int i=1;i<=m;i++){ while(tmp<tot&&p[tmp].ti<=i){ if(p[tmp].flag==1) up(1,n-1,1,p[tmp].x,a[p[tmp].x]); else up(1,n-1,1,p[tmp].x,-a[p[tmp].x]); tmp++; } printf("%d\n",sum[1]); } } return 0;}
0 0
- HDU 5861 Road(线段树)
- HDU 5861 Road(线段树)
- hdu 5861 Road 线段树区间更新
- HDU 5861 Road(线段树)
- HDU 5861 Road (线段树+树状数组)
- HDU 5861 Road (线段树或并查集)
- HDU 5861 Road (线段树区间设值)
- HDU 5861 Road (线段树) 2016 Multi-University Training Contest 10
- hdu 5861Road(2016 Multi-University Training Contest 10——线段树+扫描线)
- hdu5861 Road【线段树】
- 线段树 高速公路(road)
- 2016 Multi-University Training Contest 10 [HDU 5861] Road (线段树区间更新+差分数组)
- bzoj2752 高速公路(road) 线段树
- Hdu 5861 Road
- HDU - 5861 Road
- hdu-5861 线段树
- HDU 5861 Road 解题报告
- [TOJ]3243 Blocked Road --线段树
- 【java】xml文件表建立及读取环境搭建并采用DOM4J完成XML文件导入到数据库
- js通过key-value取值
- 自己动手编写仿QQ的app -1注册界面by sdust iot zhl
- Interesting drink--二分
- poj 1260 Pearls
- HDU 5861 Road(线段树)
- CF 696E ...Wait for it... 链剖练手题
- mysql远程可登录,本地无法登陆问题
- 使用strace, ltrace寻找故障原因的线索
- 哈哈,我也开通了博客
- CodeForces 686B Little Robber Girl's Zoo
- QT对象模型和一个小细节
- C++ 引用的作用和用法
- poj 1159 Palindrome