POJ 2528 Mayor's posters

xiaoxiao2021-02-28  79

#ifdef _DEBUG #pragma warning(disable : 4996) #endif #include <iostream> #include <string> #include <vector> #include <stack> #include <queue> #include <deque> #include <set> #include <map> #include <algorithm> #include <functional> #include <sstream> #include <utility> #include <cstring> #include <cstdio> #include <cstdlib> #include <ctime> #include <cmath> #include <cctype> #define CLEAR(a, b) memset(a, b, sizeof(a)) #define CLOSE() ios::sync_with_stdio(false) #define IN() freopen("in.txt", "r", stdin) #define OUT() freopen("out.txt", "w", stdout) #define PF(a) printf("%d\n", a) #define SF(a) scanf("%d", &a) #define SFF(a, b) scanf("%d%d", &a, &b) #define FOR(i, a, b) for(int i = a; i < b; ++i) #define LL long long #define MAXN 10005 #define MAXM 100005 #define MOD 1000007 #define INF 2147483648 using namespace std; //-------------------------CHC------------------------------// //POJ 2528 Mayor's posters //思路:由于区间更新后都PushDown到了最底层,所以查询也得到最底层逐个计数,比较耗时。 #define Lson cur<<1, l, mid #define Rson cur<<1|1, mid+1, r int n, m; int low[MAXN], high[MAXN]; int col[MAXN << 4]; int cnt[MAXN << 4]; vector<int> v; void PushDown(int cur) { col[cur << 1] = col[cur << 1 | 1] = col[cur]; col[cur] = 0; } void Update(int L, int R, int c, int cur, int l, int r) { if (L <= l && r <= R) { col[cur] = c; //printf("col = %d\n", col[cur]); return; } if (col[cur]) PushDown(cur); int mid = (l + r) >> 1; if (L <= mid) Update(L, R, c, Lson); if (R > mid) Update(L, R, c, Rson); } void Query(int cur, int l, int r) { if (l == r) { if(col[cur]) cnt[col[cur]]++; //printf("col = %d\n", col[cur]); return; } if(col[cur]) PushDown(cur); int mid = (l + r) >> 1; Query(Lson); Query(Rson); } void Hash() { v.clear(); FOR(i, 0, n) v.push_back(low[i]), v.push_back(high[i]); sort(v.begin(), v.end()); int t = v.size(); FOR(i, 1, t) { if (v[i] - v[i - 1] > 1) v.push_back(v[i - 1] + 1); } sort(v.begin(), v.end()); v.erase(unique(v.begin(), v.end()), v.end()); //for (auto i : v) printf("%d ", i); puts(""); m = v.size(); FOR(i, 0, n) { int L, R; L = find(v.begin(), v.end(), low[i]) - v.begin(); R = find(v.begin(), v.end(), high[i]) - v.begin(); //printf("(%d, %d)\n", L + 1, R + 1); Update(L+1, R+1, i + 1, 1, 1, m); } } int main() { int T; SF(T); while (T--) { CLEAR(col, 0); CLEAR(cnt, 0); SF(n); FOR(i, 0, n) SFF(low[i], high[i]); Hash(); Query(1, 1, m); int ans = 0; FOR(i, 1, m + 1) if (cnt[i]) ans++; PF(ans); } return 0; }仅仅是更改了查询方式,就快了很多了。 存在部分点,没有pushdown到叶子节点。 (还是有点不清楚,感觉并没有太多的点能直接返回的诶) void query(int cur, int l, int r) { if (res[cur]) cnt[res[cur]] = 1; else { if (l == r) return; int mid = Mid(l, r); PushDown(cur); query(lson); query(rson); } }
转载请注明原文地址: https://www.6miu.com/read-80179.html

最新回复(0)