博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线段树做题总结
阅读量:4982 次
发布时间:2019-06-12

本文共 2440 字,大约阅读时间需要 8 分钟。

A.敌兵布阵 HDU-1166

B.I HATE IT HDU-1754

C.Mayor's posters

D.Billboard(单点修改,区间最大)

 

#include
#include
#include
#include
#include
#include
#define maxn 200010#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1using namespace std;int sgt[maxn<<2],h,w,n,ww;void build(int l,int r,int rt){ sgt[rt]=w; if(r==l) return; int m=(l+r)>>1; build(lson); build(rson);}void update(int l,int r,int rt,int x){ if(l==r) {printf("%d\n",l);sgt[rt]-=x;return;} int m=(l+r)>>1; if(x<=sgt[rt<<1]) update(lson,x); else update(rson,x); sgt[rt]=max(sgt[rt<<1],sgt[rt<<1|1]);}int main(){ while(~scanf("%d%d%d",&h,&w,&n)) { h=min(h,n); build(1,h,1); for(int i=1;i<=n;i++) { scanf("%d",&ww); if(sgt[1]>=ww) update(1,h,1,ww); else printf("-1\n"); } } }
View Code

 

E.

Tunnel Warfare(单点修改,区间连续数字个数)

 

#include
#include
#include
#include
#include
#include
#define maxn 50010#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1using namespace std;int sgt[maxn<<2],pre[maxn<<2],suf[maxn<<2],a[maxn<<2];int n,m,x,tot;char op[10];void push_up(int rt,int len){ pre[rt]=pre[rt<<1]; suf[rt]=suf[rt<<1|1]; if(pre[rt<<1]==(len+1)>>1) pre[rt]=pre[rt<<1]+pre[rt<<1|1]; if(suf[rt<<1|1]==len>>1) suf[rt]=suf[rt<<1]+suf[rt<<1|1]; } void build(int l,int r,int rt){ if(l==r) {sgt[rt]=pre[rt]=suf[rt]=1;return;} int m=(l+r)>>1; build(lson);build(rson);push_up(rt,r-l+1);}void update(int l,int r,int rt,int pos,int x){ if(l==r) {sgt[rt]=pre[rt]=suf[rt]=x;return;} int m=(l+r)>>1; if(pos<=m) update(lson,pos,x); else update(rson,pos,x); push_up(rt,r-l+1);}int query(int l,int r,int rt,int pos){ //printf("%d %d %d %d\n",l,r,suf[rt<<1],pre[rt<<1|1]); if(l==r) return sgt[rt]; int m=(l+r)>>1; if(pos<=m) { if(pos+suf[rt<<1]>m) return suf[rt<<1]+pre[rt<<1|1]; else return query(lson,pos); } else{ if(m+pre[rt<<1|1]>=pos) return suf[rt<<1]+pre[rt<<1|1]; else return query(rson,pos); }}int main(){ while(~scanf("%d%d",&n,&m)) { build(1,n,1); tot=0; while(m--) { scanf("%s",op); if(op[0]=='Q') { scanf("%d",&x); printf("%d\n",query(1,n,1,x)); } if(op[0]=='D') { scanf("%d",&x); a[++tot]=x; update(1,n,1,x,0); } if(op[0]=='R') { x=a[tot--]; update(1,n,1,x,1); } } }}
View Code

 

F.

 

  

转载于:https://www.cnblogs.com/The-Pines-of-Star/p/10353167.html

你可能感兴趣的文章
使用cmd查看电脑连接过的wifi密码并将密码发送至指定邮箱(三)
查看>>
u3d 场景资源打包
查看>>
123
查看>>
hdu 1874
查看>>
最优比例生成树最优比率生成树 01分数规划问题
查看>>
ARM函数调用过程分析
查看>>
css样式重置方案 -解决浏览器差异
查看>>
distpicker使用记录
查看>>
[BZOJ3282]Tree(LCT)
查看>>
最终版详细设计
查看>>
GenePix Pro 3.0
查看>>
html移动端 -- meta-模板 + rem
查看>>
js-控制浏览器和移动端的后退按钮 . popstate
查看>>
[QT][SQLITE]学习记录二 日期查询
查看>>
hdu 4455 Substrings
查看>>
web传参
查看>>
Python 查找binlog文件
查看>>
Git——如何将本地项目提交至远程仓库
查看>>
Convert CString to std::string
查看>>
3 - Selenium元素定位和操作
查看>>