1232 - SKYLINE
2013-10-21 22:38
141 查看
算法竞赛训练指南P247 //#pragma comment(linker, "/STACK:1024000000,1024000000") #include <iostream> #include <stack> #include <queue> #include <cstdio> #include <cstdlib> #include <cmath> #include <set> #include <vector> #include <cstring> #include <algorithm> #define INF 0x3fffffff #define N 100010 #define M (100010 << 2) #define LL long long #define mod 95041567 using namespace std; struct Node{ int set, MAX; }; Node p[M]; int cnt; int arr [3]; void build(int rt, int l, int r){ if(l == r){ p[rt].set = p[rt].MAX = 0; return; } int mid = (r - l) / 2 + l; int lc = rt << 1; int rc = lc + 1; build(lc, l, mid); build(rc, mid + 1, r); p[rt].set = p[rt].MAX = 0; } void maintain(int rt){ if(! p[rt].set) return; int lc = rt << 1; int rc = lc + 1; p[lc] = p[rt]; p[rc] = p[rt]; p[rt].set = 0; } void dfs(int rt, int l, int r, int val){ if(p[rt].MAX <= val){ p[rt].MAX = val; p[rt].set = val; cnt += r - l + 1; // printf("%d %d %d\n", l, r, p[rt].MAX); // printf("%d\n", cnt); return; } if(r <= l) return; if(p[rt].set > val) return; maintain(rt); int mid = (r - l) / 2 + l; int lc = rt << 1; int rc = lc + 1; dfs(lc, l, mid, val); dfs(rc, mid + 1, r, val); p[rt].MAX = max(p[lc].MAX, p[rc].MAX); } void update(int rt, int l, int r, int L, int R, int val){ int mid = (r - l) / 2 + l; int lc = rt << 1; int rc = lc + 1; if(l == L && r == R){ dfs(rt, l, r, val); return; } if(p[rt].set > val) return; maintain(rt); if(L > mid) update(rc, mid + 1, r, L, R, val); else if(R <= mid) update(lc, l, mid, L, R, val); else { update(lc, l, mid, L, mid, val); update(rc, mid + 1, r, mid + 1, R, val); } p[rt].MAX = max(p[lc].MAX, p[rc].MAX); } int main() { // freopen("in.txt","r",stdin); int t; while(scanf("%d", &t) != EOF){ if(! t) break; while(t --){ int n, right = 0, left = INF; scanf("%d", &n); for(int i = 0; i < n; ++ i){ scanf("%d %d %d", &arr[i][0], &arr[i][1], &arr[i][2]); left = min(left, arr[i][0]); right = max(right, arr[i][1]); } -- right; cnt = 0; build(1, left, right); for(int i = 0; i < n; ++ i) update(1, left, right, arr[i][0], arr[i][1] - 1, arr[i][2]); printf("%d\n", cnt); } } return 0; }
相关文章推荐
- 1232 - SKYLINE
- UVA 1232 Skyline (线段树)
- Uva 1232 SKYLINE
- uva 1232 - SKYLINE(线段树)
- UVa:1232 SKYLINE
- UVA1232 - SKYLINE(段树部分的变化)
- uva1232 - SKYLINE 线段树
- uva1232 la4108 skyline (线段树区间更新,维护最值)
- UVA 1232 - SKYLINE
- UVA 1232 - SKYLINE(线段树区间更新)
- UVA 1232 - SKYLINE
- UVA 1232 - SKYLINE(线段树)
- UVA1232 - SKYLINE(线段树区间修改)
- UVA1232,LA4108,Skyline,线段树
- UVa 1232 SKYLINE (线段树区间修改)
- 【UVA】1232 - SKYLINE(线段树减枝)
- 说说Skyline的秘密
- 【转】Skyline软件介绍
- hdu 1232 畅通工程 解题报告
- HDU 1232 畅通工程