题意  :一段区间  操作1 切断点 操作2 恢复最近切断的一个点 操作3 单点查询该点所在最大连续区间

思路:  主要是push_up :  设区间x 为母区间  x<<1 ,x<<1|1分别为两个子区间

x的左端连续子段和 :当x<<1区间没有断开 也就是 x<<1 的最大连续子段ml ==tree[x<<1].r-tree[x<<1].l+1 等于区间长度时 x左端连续字段和tree[x].ll=tree[x<<1].ll+tree[x<<1|1].ll如果断开了直接就等于左子区间

最大子段和

x的右端连续子区间同理

x的最大连续子区间   x的最大连续子区间只可能在  1. 以x的Mid为分界   左子区最大连续和  2.右子区最大连续和 3.横跨mid  前两个分别直接区子区间的就能 第三个长度等于tree[x<<1].rl+tree[x<<1|1].ll 取三个里面最大即可

查询: 如果查询的点t 当前所查询的区间tree[x].ml最大连续子段和直接等于0 或者 tree[x].l==tree[x].r时 或者  区间是完整的 也就是tree[x].ml=tree[x].r-tree[x].l+1 时都可以直接返回

不然  令mid=l+r>>1  如果要查询的点t 在mid左边(包括Mid)那么当t 位于区间tree[x<<1]的从右开始的最长连续区间时  还可以把与其相邻的子区间tree[x<<1|1].ll接上  如果不位于 直接往下面查即可

如果要查询的点t 在mid右边(不包括Mid)同理

记得循环输入

 #include<bits/stdc++.h>
using namespace std;
const int maxn=;
struct Node{
int l,r;
long long ll,rl,ml;
}tree[maxn*];
void build(int x,int l,int r){
tree[x].l=l,tree[x].r=r;
tree[x].ll=tree[x].rl=tree[x].ml=r-l+;
if(l==r)return ;
else {
int mid=l+r>>;
build(x<<,l,mid);
build(x<<|,mid+,r);
}
}
void push_up(int x){
tree[x].ll=tree[x<<].ll;
tree[x].rl=tree[x<<|].rl;
tree[x].ml=max(tree[x<<].ml,tree[x<<|].ml);
tree[x].ml=max(tree[x].ml,tree[x<<].rl+tree[x<<|].ll);
if(tree[x<<].ll==tree[x<<].r-tree[x<<].l+)tree[x].ll+=tree[x<<|].ll;
if(tree[x<<|].rl==tree[x<<|].r-tree[x<<|].l+)tree[x].rl+=tree[x<<].rl;
}
void update(int x,int t,int val){
if(tree[x].l==tree[x].r){
if(val==)tree[x].ll=tree[x].rl=tree[x].ml=;
else tree[x].ll=tree[x].rl=tree[x].ml=;
return ;
}
else {
int mid=tree[x].l+tree[x].r>>;
if(t<=mid)update(x<<,t,val);
else update(x<<|,t,val);
push_up(x);
}
}
long long query(int x,int t){
if(tree[x].l==tree[x].r||tree[x].ml==||tree[x].ml==tree[x].r-tree[x].l+){
return tree[x].ml;
}
else {
int mid=tree[x].l+tree[x].r>>;
if(t<=mid){
if(t>=tree[x<<].r-tree[x<<].rl+){
return query(x<<,t)+query(x<<|,mid+);
}
else return query(x<<,t);
}
else {
if(t<=tree[x<<|].l+tree[x<<|].ll-){
return query(x<<|,t)+query(x<<,mid);
}
else return query(x<<|,t);
}
} }
int Q[maxn];
int main(){
int n,q;
while(scanf("%d%d",&n,&q)==){
build(,,n);
int t=;
//int last=0;
int top=;
for(int i=;i<=q;i++){
char s[];
scanf("%s",s);
if(s[]=='D'){
scanf("%d",&t);
Q[top++]=t;
update(,t,);
}
if(s[]=='Q'){
scanf("%d",&t);
printf("%lld\n",query(,t));
}
if(s[]=='R'){
update(,Q[--top],);
}
}
}
return ;
}

I - Tunnel Warfare HDU - 1540 线段树最大连续区间的更多相关文章

  1. POJ 2892 Tunnel Warfare || HDU 1540(树状数组+二分 || 线段树的单点更新+区间查询)

    点我看题目 题意 :N个村子连成一条线,相邻的村子都有直接的地道进行相连,不相连的都由地道间接相连,三个命令,D x,表示x村庄被摧毁,R  ,表示最后被摧毁的村庄已经重建了,Q x表示,与x直接或间 ...

  2. E - Tunnel Warfare HDU - 1540 F - Hotel G - 约会安排 HDU - 4553 区间合并

    E - Tunnel Warfare HDU - 1540 对这个题目的思考:首先我们已经意识到这个是一个线段树,要利用线段树来解决问题,但是怎么解决呢,这个摧毁和重建的操作都很简单,但是这个查询怎么 ...

  3. Tunnel Warfare HDU 1540 区间合并+最大最小值

    Tunnel Warfare HDU 1540 区间合并+最大最小值 题意 D x是破坏这个点,Q x是表示查询以x所在的最长的连续的点的个数,R是恢复上一次破坏的点. 题解思路 参考的大佬博客 这里 ...

  4. Tunnel Warfare HDU - 1540 (线段树处理连续区间问题)

    During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the vast a ...

  5. Tunnel Warfare HDU - 1540(线段树最长连续区间)

    题意: 一条线上的点,D x是破坏这个点,Q x是表示查询以x所在的最长的连续的点的个数,R是恢复上一次破坏的点.   解析: 线段树结点 设置一个  lq记录区间左端点开始的最大连续个数,  rq ...

  6. Tunnel Warfare(hdu1540 线段树)

    Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

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

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

  8. HDU - 1540 线段树的合并

    这个题题意我大概解释一下,就是一开始一条直线,上面的点全是联通的,有三种操作 1.操作D把从左往右第x个村庄摧毁,然后断开两边的联通. 2.询问Q节点相联通的最长长度 3.把最后破坏的村庄重建. 这个 ...

  9. hdu 1540 线段树

    这题的意思是现在有一些村庄成一条直线排列,现在有三个操作,D:摧毁一个指定的村庄,Q:询问与指定村庄相连的村庄个数, 就是这个村庄向左和向右数村庄数量,遇到尽头或损坏的村庄为止,这个就是与这个村庄相连 ...

随机推荐

  1. WIFI智能配网 - SmartConfig

    要开始IoT项目的第一步是什么?当然不是硬件,而是硬件与硬件的连接!即使有各种各样的通信协议没有好的连接方式绝对不行.那外设上没有的屏幕,没有键盘怎末输入密码怎末选择网络?对,这就是WIFI模块最重要 ...

  2. Omi 拥抱 60FPS 的 Web 动画

    写在前面 Omi 框架 正式发布了 → omi-transform. Made css3 transform super easy. Made 60 FPS easy. 作为 Omi 组件化开发特效运 ...

  3. 【开源】微信小程序、小游戏以及 Web 通用 Canvas 渲染引擎 - Cax

    Cax 小程序.小游戏以及 Web 通用 Canvas 渲染引擎 Github → https://github.com/dntzhang/cax 点我看看 DEMO 小程序 DEMO 正在审核中敬请 ...

  4. WEB学习感受

    web学习感受 1.html前端知识比较好学,各种标签只需要记住关键的就行例如:body h1,p,div,tr,td,ul,li,就行了. 2.css学习前期还好, 后期关键布局和样式知识点较多,而 ...

  5. [转]WINDOWS服务器安全加固实战(WINDOWS SERVER 2008 R2和WINDOWS SERVER 2012)

    主机安全 启用防火墙 阿里云windows Server 2008 R2默认居然没有启用防火墙.2012可能也是这样的,不过这个一定要检查! 补丁更新 启用windows更新服务,设置为自动更新状态, ...

  6. 使用insert ignore来避免向数据库重复插入数据

    mysql中 insert ignore 的使用示例如下: INSERT IGNORE INTO `table_name` (`reportid`, `content`) VALUES (‘11111 ...

  7. C. Ayoub and Lost Array

    链接 [https://codeforces.com/contest/1105/problem/C] 题意 给你n,表示数组长度,元素的值是l到r,问有多少种方案使得所有元素和整除3 分析 思维dp, ...

  8. (第十三周)Final阶段成员贡献分

    项目名:食物链教学工具 组名:奋斗吧兄弟 组长:黄兴 组员:李俞寰.杜桥.栾骄阳.王东涵 个人贡献分=基础分+表现分 基础分=5*5*0.5/5=2.5 成员得分如下: 成员 基础分 表现分 个人贡献 ...

  9. iframe跨域解决方案

    公司某个功能用的是iframe,由于跨域的原因,我们不能直接设置父级页面iframe的高度,所以用了一个中间页home来完成父级页面iframe的高度设置,这种中间页其实很多时候不好用,因为涉及到页面 ...

  10. Django 中的 cookie 和 session

    一.cookie 由于HTTP协议是无状态的,而服务器端的业务必须是要有状态的.Cookie诞生的最初目的是为了存储web中的状态信息,以方便服务器端使用.比如判断用户是否是第一次访问网站.目前最新的 ...