ST表10pts求助

P2471 [SCOI2007] 降雨量

我也一样(线段树) ```cpp #include <bits/stdc++.h> using namespace std; const int N = 5e4 + 5; int n, m, X, Y, maxn[N << 2], id[N << 2]; map <int, int> mp; struct node{ int y, r; } a[N]; void push_up(int k){ if(maxn[k << 1] > maxn[k << 1 | 1]){ maxn[k] = maxn[k << 1]; id[k] = id[k << 1]; } else{ maxn[k] = maxn[k << 1 | 1]; id[k] = id[k << 1 | 1]; } } void build(int k, int l, int r){ if(l == r){ maxn[k] = a[l].r; id[k] = a[l].y; return; } int mid = (l + r) >> 1; build(k << 1, l, mid); build(k << 1 | 1, mid + 1, r); push_up(k); } pair <int, int> query(int k, int l, int r, int x, int y){ if(x <= l && r <= y) return make_pair(maxn[k], id[k]); int mid = (l + r) >> 1, res = 0, p = 0; if(x <= mid){ pair <int, int> qwq = query(k << 1, l, mid, x, y); res = qwq.first; p = qwq.second; } if(mid < y){ pair <int, int> qwq = query(k << 1 | 1, mid + 1, r, x, y); if(qwq.first >= res){ res = qwq.first; p = qwq.second; } } return make_pair(res, p); } int find(int year){ int l = 1, r = n, pos = 0; while(l <= r){ int mid = (l + r) >> 1; if(a[mid].y > year){ pos = mid; r = mid - 1; } else l = mid + 1; } return pos; } int main(){ scanf("%d", &n); for(int i = 1; i <= n; i++){ scanf("%d%d", &a[i].y, &a[i].r); mp[a[i].y] = i; } build(1, 1, n); scanf("%d", &m); while(m--){ scanf("%d%d", &X, &Y); int L = mp[X], R = mp[Y]; if(!L && !R){ printf("maybe\n"); continue; } if(!L){ int ji = find(X); pair <int, int> qwq = query(1, 1, n, ji, R); if(qwq.second != Y) printf("false\n"); else printf("maybe\n"); continue; } if(!R){ int ji = find(Y) - 1; pair <int, int> qwq = query(1, 1, n, L, ji); if(qwq.second != X) printf("false\n"); else printf("maybe\n"); continue; } pair <int, int> qwq = query(1, 1, n, L, R); if(a[L].r < a[R].r || qwq.second != X && qwq.second != Y) printf("false\n"); else if(R - L != Y - X) printf("maybe\n"); else printf("true\n"); } return 0; } ```
by sheryang_AC @ 2024-03-25 15:28:58


|