【HDOJ】1540 Tunnel Warfare
还不错的一道线段树区间合并。挺巧妙的用法。
/* 1540 */
#include <iostream>
#include <string>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <deque>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <climits>
#include <cctype>
#include <cassert>
#include <functional>
#include <iterator>
#include <iomanip>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,1024000") #define sti set<int>
#define stpii set<pair<int, int> >
#define mpii map<int,int>
#define vi vector<int>
#define pii pair<int,int>
#define vpii vector<pair<int,int> >
#define rep(i, a, n) for (int i=a;i<n;++i)
#define per(i, a, n) for (int i=n-1;i>=a;--i)
#define clr clear
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define lson l, mid, rt<<1
#define rson mid+1, r, rt<<1|1 const int maxn = ;
int ls[maxn<<], rs[maxn<<], ms[maxn<<];
int S[maxn], top; void Build(int l, int r, int rt) {
ls[rt] = rs[rt] = ms[rt] = r - l + ;
if (l == r)
return ; int mid = (l + r) >> ;
Build(lson);
Build(rson);
} void PushUp(int l, int r, int rt) {
int mid = (l + r) >>;
int lb = rt<<;
int rb = lb |; ls[rt] = ls[lb];
rs[rt] = rs[rb];
if (ls[lb] == mid-l+)
ls[rt] += ls[rb];
if (rs[rb] == r-mid)
rs[rt] += rs[lb]; ms[rt] = max(ms[lb], ms[rb]);
ms[rt] = max(ms[rt], rs[lb]+ls[rb]);
} void update(int x, int delta, int l, int r, int rt) {
if (l == r) {
ls[rt] = rs[rt] = ms[rt] = delta;
return ;
} int mid = (l + r) >> ; if (x <= mid) {
update(x, delta, lson);
} else {
update(x, delta, rson);
} PushUp(l, r, rt);
} int Query(int x, int l, int r, int rt) {
if (l==r || ms[rt]== || ms[rt]==r-l+)
return ms[rt]; int mid = (l + r) >> ;
int lb = rt<<;
int rb = lb |; if (x <= mid) {
if (x >= mid-rs[lb]+) {
return Query(x, lson) + Query(mid+, rson);
} else {
return Query(x, lson);
}
} else {
if (x <= mid+ls[rb]) {
return Query(mid, lson) + Query(x, rson);
} else {
return Query(x, rson);
}
}
} int main() {
ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif int n, m, x;
char cmd[];
int ans; while (scanf("%d %d", &n, &m)!=EOF) {
Build(, n, );
top = ;
while (m--) {
scanf("%s", cmd);
if (cmd[] == 'D') {
scanf("%d", &x);
S[top++] = x;
update(x, , , n, );
} else if (cmd[] == 'Q') {
scanf("%d", &x);
ans = Query(x, , n, );
printf("%d\n", ans);
} else {
if (top > ) {
x = S[--top];
update(x, , , n, );
}
}
}
} #ifndef ONLINE_JUDGE
printf("time = %d.\n", (int)clock());
#endif return ;
}
【HDOJ】1540 Tunnel Warfare的更多相关文章
- 【POJ】2892 Tunnel Warfare
[算法]平衡树(treap) [题解]treap知识见数据结构 在POJ把语言从G++换成C++就过了……??? #include<cstdio> #include<algorith ...
- hdu 1540 Tunnel Warfare (区间线段树(模板))
http://acm.hdu.edu.cn/showproblem.php?pid=1540 Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) ...
- HDU 1540 Tunnel Warfare(最长连续区间 基础)
校赛,还有什么途径可以申请加入ACM校队? Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/ ...
- hdu 1540 Tunnel Warfare 线段树 单点更新,查询区间长度,区间合并
Tunnel Warfare Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pi ...
- HDU 1540 Tunnel Warfare 平衡树 / 线段树:单点更新,区间合并
Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Lim ...
- HDU 1540 Tunnel Warfare 线段树区间合并
Tunnel Warfare 题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少 思路:一个节点的最大连续区间由(左儿子的最大的连续区间,右儿子的最大连续区 ...
- hdu 1540 Tunnel Warfare(线段树区间统计)
Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- hdu 1540 Tunnel Warfare (线段树 区间合并)
Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- hdu 1540 Tunnel Warfare 线段数区间合并
Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) P ...
随机推荐
- 基于游标的定位DELETE/UPDATE语句
如果游标是可更新的(也就是说,在定义游标语句中不包括Read Only 参数),就可以用游标从游标数据的源表中DELETE/UPDATE行,即DELETE/UPDATE基于游标指针的当前位置的操作: ...
- 2.1 JavaScript应用开发实践指南
创建交互层 循环 示例代码如下: var people = family, peopleCount = items.length, i; if(peopleCount>0){ for(i=0; ...
- 关于Ionic的安装
Ionic是一个前端的框架,帮助开发者使用HTML5, CSS3和JavaScript做出原生应用. http://ionicframework.com/getting-started/ 这里介绍了如 ...
- HDU 1069 Monkey and Banana(动态规划)
Monkey and Banana Problem Description A group of researchers are designing an experiment to test the ...
- yiic创建YII应用 "php.exe"不是内部或外部命令 解决办法
第一步:运行CMD命令. 第二步:进入Yiic文件的目录 (例如在D盘里面 D:/yii/framework) 第三步:D:\yii\framework>yiic webapp D: ...
- STL 常见容器
vector: 是一种在结尾处高效插入.删除的容器,本质上是一个动态数组,可以自动维护数组的空间分配.它也允许在开头和中间插入.删除数据,但是效率极低. <span style="fo ...
- Oracle if else if for case
------------------游标+for+if else if DECLARE cursor s_cursor is SELECT * from emp;--定义游标 begin for r ...
- iPad知识点记录
这两天玩了玩虚拟机安装Mac OS系统.iPad1的越狱以及利用iTunes将iPad2的系统升级到iOS8.1,这里将一些参考资源以及关键点记录一下. 一.虚拟机安装Mac OS 首先你的系统要能够 ...
- yii2 model常用验证规则
//字段必填[['username'],'required','message'=>'{attribute}不能为空!'][['username','password'], 'required' ...
- building Utils {{ant+ivy}、{maven}}怎么样手动将下载下来的 JAR 包添加到 Maven、ivy 的本地仓库
mvn install:install-file -Dfile=jar包的位置 -DgroupId=上面的groupId -DartifactId=上面的artifactId -Dversion=上面 ...