Mayor's posters 【POJ - 2528】【線段樹:講解離散化後TLE的原因】
阿新 • • 發佈:2018-11-20
題目連結
題目是一道很好的題,他用很神奇的資料告訴了我們——少用map,會TLE的。。。所以,這道題怎樣避免N*log(N)的map??我們可以換成lower_bound()來進行優化,但是在此之前可以用unique()進行去重操作(自己懶,所以用已有的STL檔案)。
順便說一句,這有一組資料(這組資料在常理上應該是正解,但是好像在本題中視作假的。。。)
1
3
1 10
1 3
6 10
正解應當是3,而很多人應該會得到2——離散化的問題,但是不管它,能過就是了。
#include <iostream> #include <cstdio> #include <cmath> #include <string> #include <cstring> #include <algorithm> #include <limits> #include <vector> #include <stack> #include <queue> #include <set> #include <map> #define lowbit(x) ( x&(-x) ) #define pi 3.141592653589793 #define e 2.718281828459045 using namespace std; typedef unsigned long long ull; typedef long long ll; const int maxN = 10005; int N, bit[maxN<<1], cnt, diff, tree[maxN<<3]; bool cmp_bit(int e1, int e2) { return e1<e2; } bool vis[maxN<<1]; int ans; struct node { int l, r, id; node(int a=0, int b=0, int c=0):l(a), r(b), id(c) {} }a[maxN]; void init() { cnt=0; ans=0; memset(vis, false, sizeof(vis)); } void buildTree(int rt, int l, int r) { tree[rt] = 0; if(l == r) return; int mid = (l + r)>>1; buildTree(rt<<1, l, mid); buildTree(rt<<1|1, mid+1, r); } void pushdown(int rt) { if(tree[rt]) { tree[rt<<1] = tree[rt<<1|1] = tree[rt]; tree[rt] = 0; } } void update(int rt, int l, int r, int ql, int qr, int val) { if(ql<=l && qr>=r) { tree[rt] = val; return; } pushdown(rt); int mid = (l + r)>>1; if(ql<=mid) update(rt<<1, l, mid, ql, qr, val); if(qr>mid) update(rt<<1|1, mid+1, r, ql, qr, val); } void query(int rt, int l, int r, int ql, int qr) { if(tree[rt]) { if(!vis[tree[rt]]) ans++; vis[tree[rt]] = true; return; } if(l == r) { if(!vis[tree[rt]] && tree[rt]) ans++; vis[tree[rt]] = true; return; } int mid = (l + r)>>1; query(rt<<1, l, mid, ql, mid); query(rt<<1|1, mid+1, r, mid+1, qr); } int main() { int T; scanf("%d", &T); while(T--) { scanf("%d", &N); init(); for(int i=1; i<=N; i++) { scanf("%d%d", &a[i].l, &a[i].r); a[i].id = i; bit[++cnt] = a[i].l; bit[++cnt] = a[i].r; } sort(bit+1, bit+1+cnt, cmp_bit); diff = (int)(unique(bit+1, bit+cnt+1) - bit - 1); buildTree(1, 1, diff); for(int i=1; i<=N; i++) { update(1, 1, diff, (int)(lower_bound(bit+1, bit+1+diff, a[i].l) - bit), (int)(lower_bound(bit+1, bit+1+diff, a[i].r) - bit), i); } query(1, 1, diff, 1, diff); printf("%d\n", ans); } return 0; }