HDU
来源:互联网 发布:友盟推送 php服务器端 编辑:程序博客网 时间:2024/06/05 17:04
第一次做区间合并,对于这种保存区间的还是很不熟悉,向上更新的时候还是没有头绪。
区间合并的题目还是需要多写。
对于本题而言,就是求一个包含查询节点的连续区间的长度。
pushup的时候 需要注意的是,向上更新的时候,一个区间全是没被破坏的情况。
#include <bits/stdc++.h>#define INF 0x3f3f3f3fusing namespace std;int n , m;int q;const int maxn = 50000+10;stack<int>st;struct SegTree{ int lx,rx,mx,l,r;}t[maxn << 2];void build(int l,int r,int i){ t[i].l = l;t[i].r = r;t[i].lx = t[i].rx = t[i].mx = r-l+1;// cout << "WWWW: " << t[i].mx << endl; if(l == r) return; int mid = (l + r) >> 1; build(l,mid,i<<1); build(mid+1,r,i<<1|1);}void pushup(int i){ t[i].lx = t[i<<1].lx; t[i].rx = t[i<<1|1].rx; t[i].mx = max(t[i<<1].mx , t[i<<1|1].mx); t[i].mx = max(t[i].mx , t[i<<1].rx + t[i<<1|1].lx); if(t[i<<1].lx == t[i<<1].r - t[i<<1].l + 1) t[i].lx += t[i<<1|1].lx; if(t[i<<1|1].rx == t[i<<1|1].r - t[i<<1|1].l + 1 ) t[i].rx += t[i<<1].rx;// cout << "AAAAA: " << t[i].mx << endl;}void update(int t1, int i, int val){ if(t[i].l == t[i].r) { if(val == 1) { t[i].lx = t[i].rx = t[i].mx = 1; } else { t[i].lx = t[i].rx = t[i].mx = 0; }// cout << t[i].l << "*****" << t[i].lx << endl; return ; } int mid = (t[i].l + t[i].r) / 2; if(t1 <= mid) update(t1,i<<1,val); if(t1 > mid) update(t1,i<<1|1,val); pushup(i);}int query(int t1, int i){// if(t[i].l==3 && t[i].r == 4) cout << " YES " << t[i].mx << endl; if(t[i].l == t[i].r || t[i].mx == 0 || t[i].mx == t[i].r - t[i].l + 1) { return t[i].mx; } int mid = (t[i].l + t[i].r) >> 1;// cout << "LR: " << t[i].l << " " << t[i].r << endl; if(t1 <= mid) { if(t1 >= t[i<<1].r - t[i<<1].rx + 1) {// cout << "A" <<endl; return query(t1,i<<1) +query(mid+1,i<<1|1); } else {// cout << "B" <<endl; return query(t1,i<<1); } } else {// cout << "T1 : " << t1 << " " << t[i<<1|1].lx + t[i<<1|1].l - 1 << endl; if(t1 <= t[i<<1|1].lx + t[i<<1|1].l - 1) {// cout << "C" <<endl; return query(t1,i<<1|1) + query(mid , i<<1); } else {// cout << "D" <<endl;// cout << " %%%%%% " << t[i<<1|1].l << " " << t[i<<1|1].r << " " << t1 << endl; return query(t1,i<<1|1); } }}int main(){ char ch; int k; while(cin >> n >> m) { while(!st.empty()) { st.pop(); } build(1,n,1); for(int i = 0 ; i < m ; i++) { cin >> ch; if(ch == 'D') { cin >> k; st.push(k);// cout << "k :" << "|" << k << "|" << endl;// cout << st.top() << endl; update(k,1,0); } else if(ch == 'R') { if(st.empty()) continue; int p = st.top();st.pop();// cout << "R :" << "|" << p << "|" << endl; update(p,1,1); } else { cin >> k; cout << query(k,1) << endl; } } } return 0;}
阅读全文
1 0
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- Hdu
- hdu
- hdu-
- hdu
- hdu
- hdu
- HDU
- (一)Web框架-龙卷风Tornado之安装
- Ajax随笔,介绍ajax的优缺点和详细的工作原理
- 简单封装本地存储的方法
- effective C++ 条款十解读
- 【Data_Structure笔记1】线性表的顺序存储【顺序表】
- HDU
- SpringBoot 实战 (二) :web 综合应用(配置Servlet、Listener、Filter,Log)
- HDU_6154 CaoHaha's staff
- android 关于apk 打包后的地图定位和导航失败的问题
- 自定义标签实现按钮权限
- Java集合源码分析→ArrayList
- C++学习笔记系列四
- API生命周期第三阶段:API实施:使用swagger codegen生成可部署工程,择取一个作为mock service
- nyoj 49开心的小明