H - Tunnel Warfare HDU - 1540

H - Tunnel Warfare HDU - 1540

题意:

n个数顺序排列,左右数相连,
现在有三个操作:
1.摧毁一个位置上的数
2.回复上一次摧毁的数
3.查询包含该位置的最长连续区间长度

题解:

有两个方法,第一个是区间的最大值-最小值-1,这个就不讲了
第二个方法是区间合并更新答案
参考文章
利用线段树 求出每个线段左端点长度lsum(自左端点向右的连续长度),右端点长度rsum(自右端点向左连续长度) 以及区间内最长连续长度sum(以为可能存在一个连续长度既不包含左端点也不包含右端点)
破坏和修复的区别其实就是lsum,rsum,sum的值
我们用一个函数来求,1表示存在,0表示被破坏
详细讲讲过程:
如果区间合并更新答案?
我们已经定义了lsum,rsum,和sum
我们更新lsum,rsum,然后用来更新sum
如果左子树满了,root的lsum的长度就等于左子树(root<<1)的长度加上右子树(root<<1|1)的lsum
在这里插入图片描述
右子树同理
最长区间是三部分取最大值
1.左子树从左端点开始的最长连续区间
2.右子树从右端点开始的最长连续区间
(上面这俩就是刚才讲的更新)
3.左子树的右端点向左+右子树的左端点向右 (如图)
在这里插入图片描述
更新时就将lsum,rsum,sum更新为所指坐标,如果是摧毁就赋值为0
查询就是找点在哪个区间,输出答案就行

代码:

#include <iostream>
#include <bits/stdc++.h>
using namespace std;const int maxn = 50005;struct node {int L, R, lsum, rsum, sum;//左端点长度lsum(自左端点向右的连续长度)//区间内最长连续长度int Mid() {return (L+R)/2;}int Len() {return (R-L+1);}
}a[maxn*4];
void pushup(int p) {a[p].lsum = a[p << 1].lsum;a[p].rsum = a[p << 1|1].rsum;if (a[p << 1].lsum == a[p << 1].Len())//左子树满 a[p].lsum = a[p << 1].Len()+a[p << 1|1].lsum;if (a[p << 1|1].rsum == a[p << 1|1].Len())//右子树满 a[p].rsum =a[p << 1|1].Len()+a[p << 1].rsum;/*然后是三部分取最大值1.左子树从左端点开始的最长连续区间2.右子树从右端点开始的最长连续区间3.左子树的右端点向左+右子树的左端点向右 */int len=a[p<<1].rsum+a[p<<1|1].lsum;a[p].sum = max(a[p].lsum, max(a[p].rsum, len));
}void Build(int p, int l, int r) {a[p].L = l;a[p].R = r;a[p].lsum = a[p].rsum = a[p].sum = a[p].Len();if (l == r) return;Build(p << 1, l, a[p].Mid());Build(p << 1|1, a[p].Mid()+1, r);
}void Insert(int p, int k, int x) {if (a[p].L == a[p].R) {a[p].lsum = a[p].rsum = a[p].sum = x;return;}if (k <= a[p].Mid())Insert(p << 1, k, x);elseInsert(p << 1|1, k, x);pushup(p);
}int Query(int p, int k) {if (a[p].sum == 0) return 0;//先查看k是否被左右俩个区间包括在内 if (k < a[p].L+a[p].lsum) return a[p].lsum;if (k > a[p].R-a[p].rsum) return a[p].rsum;//然后查看左子树有部分+右子树左部分 if (k > a[p << 1].R-a[p << 1].rsum&&k < a[p << 1|1].L+a[p << 1|1].lsum)return a[p << 1].rsum+a[p << 1|1].lsum;if (k <= a[p].Mid())return Query(p << 1, k);elsereturn Query(p << 1|1, k);
}
int main() {int n, m;while (~scanf("%d%d", &n, &m)) {int x;char s[10];stack <int> sta;Build(1, 1, n);while (m--) {scanf("%s", s);if (s[0] == 'D') {scanf("%d", &x);Insert(1, x, 0);sta.push(x);} else if (s[0] == 'R'&&sta.size()) {Insert(1, sta.top(), 1);sta.pop();} else if (s[0] == 'Q') {scanf("%d", &x);printf("%d\n", Query(1, x));}}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317595.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CF802C-Heidi and Library(hard)【费用流】

正题 题目链接:https://www.luogu.com.cn/problem/CF802C 题目大意 你有一个可以放kkk本书的书架&#xff0c;第iii天要求书架上有第aia_iai​种书&#xff0c;购买第iii种书的价格为cic_ici​。 求满足nnn天要求的最小花费。 1≤n,k≤80,1≤ci≤1061\leq n,k\leq 80,1\leq …

2019年1月已到,Java 8 要收费了吗?

根据此前开源中国发起的 Java 版本使用调查&#xff0c;国内的 Java 主力版本仍是 Java 8&#xff0c;有近 70% 的用户表示仍在使用 Java 8。所以对于「Java 8 是否要收费」这个问题&#xff0c;十分有必要阐述清楚&#xff0c;以消除不必要的恐慌。首先要明确一点&#xff0c;…

[NOI2007] 货币兑换 (dp+李超树维护凸包)

description 小Y最近在一家金券交易所工作。该金券交易所只发行交易两种金券&#xff1a;A纪念券&#xff08;以下简称A券&#xff09;和 B纪念券&#xff08;以下简称B券&#xff09;。每个持有金券的顾客都有一个自己的帐户。金券的数目可以是一个实数。每天随着市场的起伏波…

CF1379F1 Chess Strikes Back (easy version)(鸽笼原理、线段树)

解析 很神奇的一道题 关键在于把22的正方形看成一个单位的转化 由于每个22最多有一个国王 因此每个2*2都一定有一个国王 这是本题的关键 个人感觉这个思想很像鸽笼原理 至于后面的线段树就水到渠成了 代码 #include<bits/stdc.h> using namespace std; #define ll l…

[ZJOI2008]树的统计

[ZJOI2008]树的统计 题意&#xff1a; 题解&#xff1a; 树链剖分模板题&#xff0c;好久没打都忘了 代码&#xff1a; #include <algorithm> #include <cstdio> #include <cstring> #define lc o << 1 #define rc o << 1 | 1 const int max…

AT3860-[AGC020F]Arcs on a Circle【dp】

正题 题目链接:https://www.luogu.com.cn/problem/AT3860 题目大意 有一个周长为mmm的圆&#xff0c;nnn条线段&#xff0c;第iii条长度为aia_iai​&#xff0c;将线段贴在圆的随机位置上&#xff0c;求整个圆都被覆盖的概率。 1≤n≤6,1≤m≤501\leq n\leq 6,1\leq m\le 501…

带你学习AOP框架之Aspect.Core[1]

在软件业&#xff0c;AOP为Aspect Oriented Programming的缩写&#xff0c;意为&#xff1a;面向切面编程&#xff0c;通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续&#xff0c;是软件开发中的一个热点&#xff0c;是函数式编程的一种衍生…

「雅礼集训 2017 Day7」事情的相似度(后缀自动机+LCT+树状数组)

description 点击查看题目内容 solution Step1 无脑建SAMSAMSAM 两个前缀的最长公共后缀就是parent−treeparent-treeparent−tree上两点的lcalcalca&#xff0c;定义知显然 Step2 离线询问&#xff0c;按右端点从小到大排序 Step3 每加入一个字母&#xff0c;就将tatata在p…

CF1396B Stoned Game(博弈论)

解析 上午模拟被博弈论虐&#xff0c;下午被黄色的博弈论虐 qwq 首先的一个结论是&#xff1a; 如果有一堆超过总体的一半&#xff0c;那么先手只需要守住这堆就稳赢了 如果没有这样的一堆&#xff0c;可以证明&#xff0c;最后一定可以全部拿完 假设最后有一堆k没拿完&…

主席树

大一寒假的时候学了主席树&#xff0c;当时还录了视频发b站上&#xff0c;过了好久没用都忘了差不多 这篇文章讲的非常详细&#xff0c;我就直接借用过来 静态主席树 总结一下就是&#xff1a; 代码&#xff1a; 对于每一种状态建立一个线段树&#xff0c;为了防止mle&#xf…

P7735-[NOI2021]轻重边【树链剖分,线段树】

前言 之前线上赛就A的题现在才写博客 正题 题目链接:https://www.luogu.com.cn/problem/P7735 题目大意 有nnn个点的一棵树&#xff0c;开始所有边都是轻边&#xff0c;mmm次操作。 把x→yx\rightarrow yx→y路径上所有点连接的重边都变为轻边&#xff0c;然后再把路径上的…

.NET Core实战项目之CMS 第十六章 用户登录及验证码功能实现

前面为了方便我们只是简单实现了基本业务功能的增删改查&#xff0c;但是登录功能还没有实现&#xff0c;而登录又是系统所必须的&#xff0c;得益于 ASP.NET Core的可扩展性因此我们很容易实现我们的登录功能。今天我将带着大家一起来实现下我们的ASP.NET Core2.2开发的CMS系统…

CF508D Tanya and Password(欧拉回路)

解析 之前模拟考过的一道题 把字符串当成前后缀之间的连边即可 注意即使图的度数符合要求&#xff0c;也可能由于不连通而无解&#xff0c;需要再特判一下 #include<bits/stdc.h> using namespace std; #define ll long long #define ull unsigned long long const int…

[HEOI2016/TJOI2016]字符串 (后缀数组+主席树+二分)

description 佳媛姐姐过生日的时候&#xff0c;她的小伙伴从某东上买了一个生日礼物。生日礼物放在一个神奇的箱子中。箱子外边写了一个长为 n 的字符串 s&#xff0c;和 m 个问题。佳媛姐姐必须正确回答这 m 个问题&#xff0c;才能打开箱子拿到礼物&#xff0c;升职加薪&…

[SDOI2014]旅行

[SDOI2014]旅行 题意&#xff1a; n个城市&#xff0c;n-1条边&#xff0c;任意两个城市互通&#xff0c;每个城市有所信奉的宗教和城市评级&#xff0c;有四种指令&#xff1a; 1.将城市x的居民改信为c教 2.将城市x的评级调整为w 3.统计x到y&#xff0c;路上所有的城市的评级…

YbtOJ-染色计划【树链剖分,线段树,tarjan】

正题 题目大意 给出nnn个点的一棵树&#xff0c;每个点有个颜色aia_iai​&#xff0c;你每次可以选择一个颜色全部变成另一个颜色。 求最少多少次操作可以把一种颜色变成一个完整的连通块。 1≤k≤n≤21051\leq k\leq n\leq 2\times 10^51≤k≤n≤2105 解题思路 考虑如果我们…

张高兴的 .NET Core IoT 入门指南:环境配置、Blink、部署

如何在 Raspberry Pi 的 Raspbian 上构建使用 GPIO 引脚的 IoT 程序&#xff1f;你可能会回答使用 C 或 Python 去访问 Raspberry Pi 的引脚。现在&#xff0c;C# 程序员可以使用 .NET Core 在 Raspbian(Linux) 上构建 IoT 应用程序。只需要引入 System.Device.GPIONuGet 包即可…

CF183C:Diverse Permutation(构造)

解析 首先考虑如何构造kn-1的情况 发现令排列为1,n,2,n-1…即可 那么在k不等于n-1时 只需要让前k项与上面的序列相同&#xff0c;后面公差为1即可 代码 #include<bits/stdc.h> using namespace std; #define ll long long #define ull unsigned long long const int N…

CF603E-Pastoral Oddities【CDQ分治,可撤销并查集】

正题 题目链接:https://www.luogu.com.cn/problem/CF603E 题目大意 开始时有nnn个点&#xff0c;没有边。 依次加入mmm条带权的边&#xff0c;每次加入后询问是否存在一个边集&#xff0c;满足每个点的度数均为奇数&#xff0c;求使得这个边集的最大权值最小。 1≤n≤105,1≤…

2020ICPC 江西省大学生程序设计竞赛

2020ICPC 江西省大学生程序设计竞赛