Tunnel Warfare

HDOJ-1540

  • 这题关于线段树的操作有一定的难度,需要较好的思维能力。
  • 关于题目的详细解答已经在代码中体现了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
const int maxn=50004;
int n,m;
int llen[maxn<<2];//左端点起的最大长度
int rlen[maxn<<2];//右端点起的最大长度
void pushup(int id,int l,int r){
int lc=id<<1;
int rc=id<<1|1;
int ch=r-l+1;//ch表示id(父亲)结点的覆盖长度
llen[id]=llen[lc];//左端点起的最大长度等于左儿子左端点起的最大长度
rlen[id]=rlen[rc];
if(llen[id]==ch-(ch>>1))//如果左儿子最大长度为结点整个区间,那么父亲结点要加上右儿子左端点起的最大长度
llen[id]+=llen[rc];
if(rlen[id]==(ch>>1)) //如果右儿子最大长度为结点整个区间,那么父亲结点要加上左儿子右端点起的最大长度
rlen[id]+=rlen[lc];
}
void build(int id,int l,int r){
if(l==r){
llen[id]=1;
rlen[id]=1;
return;
}
//长度全部初始化为结点覆盖的长度
llen[id]=r-l+1;
rlen[id]=r-l+1;
int mid=(l+r)>>1;
int lc=id<<1;int rc=id<<1|1;
build(lc,l,mid);
build(rc,mid+1,r);
}
void update(int id,int l,int r,int p,int v){
if(l==r){
llen[id]=v;
rlen[id]=v;
return;
}
int mid=(l+r)>>1;
int lc=id<<1;
int rc=id<<1|1;
if(p<=mid){
update(lc,l,mid,p,v);
}else{
update(rc,mid+1,r,p,v);
}
pushup(id,l,r);
}
int queryL(int id,int l,int r,int p,int q){//查询右边区间左端点起的最大长度
if(p<=l&&q>=r){
return llen[id];
}
int mid=(l+r)>>1;
int lc=id<<1;
int rc=id<<1|1;
if(q<=mid){//表示待查询的区间完全在左边
return queryL(lc,l,mid,p,q);
}else if(p>mid){//表示待查询的区间完全在右边
return queryL(rc,mid+1,r,p,q);
}else{//mid在待查询区间之内
int lans=queryL(lc,l,mid,p,mid);
int rans=queryL(rc,mid+1,r,mid+1,q);
if(lans==mid-p+1){//如果左区间最大长度为整个区间,这个时候才需要加上右边区间左端点起的最大长度
return lans+rans;
}else return lans; }
}
int queryR(int id,int l,int r,int p,int q){//查询右边区间左端点起的最大长度
if(p<=l&&q>=r){
return rlen[id];
}
int mid=(l+r)>>1;
int lc=id<<1;
int rc=id<<1|1;
if(q<=mid){
return queryR(lc,l,mid,p,q);
}else if(p>mid){
return queryR(rc,mid+1,r,p,q);
}else{
int lans=queryR(lc,l,mid,p,mid);
int rans=queryR(rc,mid+1,r,mid+1,q);
if(rans==q-mid){//同理,如果有区间的最大长度为整个区间,这个时候才需要加上左边区间右端点起的最大长度
return lans+rans;
}else return rans;
}
}
int main(){
while(cin>>n>>m){
vector<int> v;
build(1,1,n);
for(int i=0;i<m;i++){
char c;int x;
cin>>c;
if(c=='D'){//update
cin>>x;
v.push_back(x);
update(1,1,n,x,0);
}else if(c=='Q'){//query
cin>>x;
int ans=queryL(1,1,n,x,n)+queryR(1,1,n,1,x);//相当于查询左边区间右端点起最大长度加上右边区间左端点起最大长度
cout<<(ans>0?ans-1:0)<<endl;
}else if(c=='R'&&v.size()>0){//update
x=v[v.size()-1];
v.pop_back();
update(1,1,n,x,1);
}
}
}
return 0;
}

HDOJ-1540(线段树+较复杂的单点修改和区间查询)的更多相关文章

  1. 线段树:Segment Tree(单点修改/区间修改模板) C++

    线段树是非常有效的数据结构,可以快速的维护单点修改,区域修改,查询最大值,最小值等功能. 同时,它也很重要.如果有一天比赛,你卡在了一道线段树模板题目上,这就真的尴尬了.不过,随着时代的进步,题目也越 ...

  2. P3374 【模板】树状数组 1 单点修改与区间查询

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...

  3. Billboard HDU - 2795(树状数组,单点修改,区间查询)

    题目链接:https://vjudge.net/problem/HDU-2795 思路:h = 1e9行不通,因为广告是1*w的,所以n个广告最多只需要 h = n的高度,那么h=2e5就可以接受了. ...

  4. 【模板】cdq分治代替树状数组(单点修改,区间查询)

    #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #in ...

  5. 【算法系列学习】线段树vs树状数组 单点修改,区间查询 [kuangbin带你飞]专题七 线段树 A - 敌兵布阵

    https://vjudge.net/contest/66989#problem/A 单点修改,区间查询 方法一:线段树 http://www.cnblogs.com/kuangbin/archive ...

  6. HUD.2795 Billboard ( 线段树 区间最值 单点更新 单点查询 建树技巧)

    HUD.2795 Billboard ( 线段树 区间最值 单点更新 单点查询 建树技巧) 题意分析 题目大意:一个h*w的公告牌,要在其上贴公告. 输入的是1*wi的w值,这些是公告的尺寸. 贴公告 ...

  7. HDU - 1166 敌兵布阵 方法一:(线段树+单点修改,区间查询和) 方法二:利用树状数组

    C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于 ...

  8. ZOJ - 1610 Count the Colors(线段树区间更新,单点查询)

    1.给了每条线段的颜色,存在颜色覆盖,求表面上能够看到的颜色种类以及每种颜色的段数. 2.线段树区间更新,单点查询. 但是有点细节,比如: 输入: 2 0 1 1 2 3 1 输出: 1 2 这种情况 ...

  9. 校内模拟赛T5:连续的“包含”子串长度( nekameleoni?) —— 线段树单点修改,区间查询 + 尺取法合并

    nekameleoni 区间查询和修改 给定N,K,M(N个整数序列,范围1~K,M次查询或修改) 如果是修改,则输入三个数,第一个数为1代表修改,第二个数为将N个数中第i个数做修改,第三个数为修改成 ...

随机推荐

  1. python的re模块一些方法 && Tkinter图形界面设计 && 终止python运行函数 && python读写文件 && python一旦给字符串赋值就不能单独改变某个字符,除非重新给变量赋值

    Tkinter图形界面设计见:https://www.cnblogs.com/pywjh/p/9527828.html#radiobutton 终止python运行函数: 采用sys.exit(0)正 ...

  2. httprunner(9)运行测试用例的方式总结

    前言 用过pytest的小伙伴都知道,pytest的运行方式是非常丰富的,可以说是你想怎么运行怎么运行,想运行哪些运行哪些,那httprunner是否同样可以呢? 运行用例的各种方式 运行指定路径的用 ...

  3. Python 3的f-Strings:增强的字符串格式语法(指南)

    最近也在一个视频网站的爬虫,项目已经完成,中间有不少需要总结的经验. 从Python 3.6开始,f-Strings是格式化字符串的一种很棒的新方法.与其他格式化方式相比,它们不仅更具可读性,更简洁且 ...

  4. DNS域名解析10步

    第一步:浏览器缓存中检查有没有对应这个域名的解析过的IP地址,如有,结束 第二步:如浏览器缓存没有查到,则访问本地操作系统,window下通过C:\Windows\System32\drivers\e ...

  5. codeforces 10C Digital Root(非原创)

    Not long ago Billy came across such a problem, where there were given three natural numbers A, B and ...

  6. 痞子衡嵌入式:我的博文总量终于追平了jicheng0622

    自打2016年10月选定清爽又复古的博客园平台作为痞子衡的个人博客主战场之后,痞子衡就一直坚持在博客园首发原创技术文章,然后再同步到其他平台(CSDN,知乎,微信公众号...),在坚持更文近四年半(2 ...

  7. vue 二级子路由跳转不了 bug

    vue 二级子路由跳转不了 bug @click.prevent 阻止原生事件的冒泡 <li class="tools-hover-box-list-item" v-for= ...

  8. 如何强制删除 baidu/tempdata/con.dat 的垃圾文件! How to fix locked SD card: 读卡器 损坏,补救措施!

    https://www.youtube.com/watch?v=y2c37dcxNto&feature=youtu.be 使用windows command prompt 强制删除 baidu ...

  9. React Hooks: useContext All In One

    React Hooks: useContext All In One useContext https://reactjs.org/docs/hooks-reference.html#useconte ...

  10. Next.js Conf 2020

    Next.js Conf 2020 Next.js Conf Ticket https://nextjs.org/conf Conf Schedule https://confs.tech/javas ...