hdu 1540 Tunnel Warfare

记录每个节点的最大左连续值、最大右连续值、最大连续值,向上更新的是常规的区间合并处理方式

关键是想到如何去查询,如果查询节点落在左儿子节点的右连续段中,则代表右儿子节点的左连续段也要算上,同样的如果查询节点落在右儿子的左连续段中,则代表左儿子的右连续段也要算上

#include<cstdio>
#include<cstring>
#include<stack>
using namespace std;
#define MAXN 50005
#define lch p<<1
#define rch p<<1|1
#define mid (t[p].l+t[p].r)>>1
struct node
{int l,r;int lmx,mx,rmx;int getlen() {return r-l+1;}
}t[MAXN*4];
void construct(int l,int r,int p)
{t[p].l=l,t[p].r=r;t[p].lmx=t[p].rmx=t[p].mx=t[p].getlen();if(l==r) return ;int m=mid;construct(l,m,lch);construct(m+1,r,rch);
}
int max(int a,int b) {return a>b?a:b;}
void pushup(int p)
{t[p].mx=max(t[lch].mx,t[rch].mx);t[p].mx=max(t[p].mx,t[lch].rmx+t[rch].lmx);t[p].lmx=t[lch].lmx;if(t[lch].mx==t[lch].getlen()) t[p].lmx+=t[rch].lmx;t[p].rmx=t[rch].rmx;if(t[rch].mx==t[rch].getlen()) t[p].rmx+=t[lch].rmx;
}
void modify(int x,int p,int v)
{if(t[p].l==t[p].r){t[p].lmx=t[p].rmx=t[p].mx=v;return ;}int m=mid;if(x<=m) modify(x,lch,v);else modify(x,rch,v);pushup(p);
}
int query(int x,int p)
{if(t[p].l==t[p].r||t[p].mx==0||t[p].mx==t[p].getlen())return t[p].mx;int m=mid;if(x<=m){if(t[lch].r-t[lch].rmx+1<=x)return query(x,lch)+query(m+1,rch);else return query(x,lch);}else{if(t[rch].l+t[rch].lmx-1>=x)return query(x,rch)+query(m,lch);else return query(x,rch);}
}
stack<int> stc;
int main()
{int n,m,x;char op[3];while(scanf("%d%d",&n,&m)!=EOF){construct(1,n,1);while(!stc.empty()) stc.pop();while(m--){scanf("%s",op);if(op[0]=='D'){scanf("%d",&x);modify(x,1,0);stc.push(x);}else if(op[0]=='Q'){scanf("%d",&x);printf("%d\n",query(x,1));}else{if(!stc.empty()){modify(stc.top(),1,1);stc.pop();}}}}return 0;
}

hdu 1540 Tunnel Warfare(线段树区间合并)相关推荐

  1. HDU 1540 Tunnel Warfare 线段树区间合并

    Tunnel Warfare 题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少 思路:一个节点的最大连续区间由(左儿子的最大的连续区间,右儿子的最大连续区 ...

  2. HDU - 1540 Tunnel Warfare(线段树+区间合并)

    题目链接:点击查看 题目大意:给定n个村庄,初始化全部连接为一条直线,需要依次执行m个操作,D表示摧毁第i个村庄的连接,R表示恢复最后一 个被摧毁的村庄的连接,Q表示询问包括本身在内,与第i个村庄相连 ...

  3. HDOJ1540 - Tunnel Warfare 线段树区间合并

    HDOJ 1540 题目大意:给定两个整数N,M, 其中N表示一共有N个村庄,M代表有M次操作,操作有以下: 1.    D x  销毁村庄x 2.    Q x  询问与村庄x相邻的村庄总数 3.  ...

  4. HDU - 3397 Sequence operation(线段树+区间合并)

    题目链接:点击查看 题目大意:给定一个初始的数列,然后依次进行m次操作: 0 a b:将闭区间[a,b]内的点都变为0 1 a b:将闭区间[a,b]内的点都变为1 2 a b:将闭区间[a,b]内的 ...

  5. HDU - 2871 Memory Control(线段树+区间合并)好题!

    题目链接:点击查看 题目大意:给定n个内存和m个操作,分别是: New x:从内存编号1开始向右查找,分配一个长度为x的空间,若找到输出区间的首地址,否则输出Reject New: Free x:释放 ...

  6. Tunnel Warfare(HDU1540+线段树+区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1540 题目: 题意:总共有n个村庄,有q次操作,每次操作分为摧毁一座村庄,修复一座村庄,和查询与询问的 ...

  7. HDU3308 线段树区间合并

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 ,简单的线段树区间合并. 线段树的区间合并:一般是要求求最长连续区间,在PushUp()函数中实 ...

  8. 树链剖分——线段树区间合并bzoj染色

    线段树区间合并就挺麻烦了,再套个树链就更加鬼畜,不过除了代码量大就没什么其他的了.. 一些细节:线段树每个结点用结构体保存,pushup等合并函数改成返回一个结构体,这样好写一些 struct Seg ...

  9. SPOJ GSS3-Can you answer these queries III-分治+线段树区间合并

    Can you answer these queries III SPOJ - GSS3 这道题和洛谷的小白逛公园一样的题目. 传送门: 洛谷 P4513 小白逛公园-区间最大子段和-分治+线段树区间 ...

最新文章

  1. js之浅拷贝和深拷贝
  2. 微软为什么要公开AI系统测试数据集和度量指标?
  3. BZOJ2208:[JSOI2010]连通数——题解
  4. 从创业到成功,SaaS巨头Salesforce靠的是这七大秘诀
  5. ubuntu8.04中texmacs装置
  6. redis源码之util
  7. [html] HTML5的触屏事件有哪些?
  8. android 中间凹背景_Android实现边缘凹凸的View
  9. CV Code|计算机视觉开源周报20200601期
  10. Springboot整合RocketMQ实战
  11. VS2003驱动开发环境配置
  12. 【数据结构】班级管理系统
  13. Fedora9 问题集锦
  14. 融合黄金正弦混合变异的自适应樽海鞘群算法
  15. 微信小程序下拉刷新简单
  16. python-指数分布介绍(scipy.stats.expon)
  17. scrapy 爬取大型图片网站(http://5442.com/)
  18. GIS中快速添加天地图、查看历史影像
  19. 1435 牛刀小试结构体
  20. ImageMagick将多张图片拼接成一张图片_爱剪辑如何把图片制作成视频

热门文章

  1. 图解:Elasticsearch 8.X 如何求解环比上升比例?
  2. 上海老大杜月笙——教你看穿一个人...
  3. python token过期_Python token及token验证
  4. python对医疗数据进行分析,看看男女生病几率
  5. Android 推送 - Activity 跳转控制处理
  6. 情报工程模型算法摘抄
  7. python 字符串函数split_字符串截取函数split(python截取字符串)
  8. html弹窗口并获取返回值,Js 弹出框口并返回值的两种常用方法
  9. 代理记账会计如何有效与企业客户沟通
  10. ❤️STP❤️RSTP❤️MSTP✏️拿好你的小本本记下来哦✔️