【HDOJ】1540 Tunnel Warfare
2015-10-31 23:05
393 查看
还不错的一道线段树区间合并。挺巧妙的用法。
/* 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 = 50005; int ls[maxn<<2], rs[maxn<<2], ms[maxn<<2]; int S[maxn], top; void Build(int l, int r, int rt) { ls[rt] = rs[rt] = ms[rt] = r - l + 1; if (l == r) return ; int mid = (l + r) >> 1; Build(lson); Build(rson); } void PushUp(int l, int r, int rt) { int mid = (l + r) >>1; int lb = rt<<1; int rb = lb |1; ls[rt] = ls[lb]; rs[rt] = rs[rb]; if (ls[lb] == mid-l+1) 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) >> 1; 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]==0 || ms[rt]==r-l+1) return ms[rt]; int mid = (l + r) >> 1; int lb = rt<<1; int rb = lb |1; if (x <= mid) { if (x >= mid-rs[lb]+1) { return Query(x, lson) + Query(mid+1, 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[5]; int ans; while (scanf("%d %d", &n, &m)!=EOF) { Build(1, n, 1); top = 0; while (m--) { scanf("%s", cmd); if (cmd[0] == 'D') { scanf("%d", &x); S[top++] = x; update(x, 0, 1, n, 1); } else if (cmd[0] == 'Q') { scanf("%d", &x); ans = Query(x, 1, n, 1); printf("%d\n", ans); } else { if (top > 0) { x = S[--top]; update(x, 1, 1, n, 1); } } } } #ifndef ONLINE_JUDGE printf("time = %d.\n", (int)clock()); #endif return 0; }
相关文章推荐
- HDU 5522 Numbers(暴力)——BestCoder Round #61(div.2)
- tyvj1084数字三角形4
- 使用 openssl 命令行构建 CA \b及证书 (二)
- SSH框架搭建图文详解
- 机器学习之回归分析——Logistic regression
- BestCoder Round #61 (div.2) 1001
- Oracle实战——数据查询与更新
- Systems
- Java 三大框架SSH,自学先学哪个?
- MOOC PTA 08-图8 How Long Does It Take
- tyvj1079数字三角形3
- 一组数据中只有一个数字出现一次,其他数成对出现,找出这个数
- Memcached入门(一)
- cvStereoRectify 报错
- NSFileManager文件操作
- Servlet 生命周期、工作原理
- URL、URI和URN三者之间的区别
- 使用 openssl 命令行构建 CA \b及证书(一)
- tyvj1044数字三角形
- LightOJ - 1060 nth Permutation(计数)