lightOJ1339线段树

来源:互联网 发布:php编译curl 编辑:程序博客网 时间:2024/05/22 00:37
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;#define mid int m = (l + r) >> 1#define ls l, m, rt << 1#define rs m + 1, r, rt << 1 | 1#define Ls rt << 1#define Rs rt << 1 | 1const int N = 1e5 + 11;struct node{int lNum, rNum, lSize, rSize, maxi; } tr[N << 2];void pushUp(int rt, int len){// maxi in [Ls, Rs, Union]tr[rt].maxi = max(tr[Ls].maxi, tr[Rs].maxi);if(tr[Ls].rNum == tr[Rs].lNum) tr[rt].maxi = max(tr[rt].maxi, tr[Ls].rSize + tr[Rs].lSize);// 右区间的左值可能与左区间的值相同tr[rt].lNum = tr[Ls].lNum;tr[rt].lSize = tr[Ls].lSize;if(tr[rt].lSize == (len + 1) >> 1 && tr[Rs].lNum == tr[Ls].rNum) tr[rt].lSize += tr[Rs].lSize;tr[rt].rNum = tr[Rs].rNum;tr[rt].rSize = tr[Rs].rSize; if(tr[rt].rSize == len >> 1 && tr[Rs].lNum == tr[Ls].rNum) tr[rt].rSize += tr[Ls].rSize; }void build(int l, int r, int rt){if(l == r){int x;scanf("%d", &x);tr[rt].lNum = tr[rt].rNum = x;tr[rt].lSize = tr[rt].rSize = 1;tr[rt].maxi = 1;return;}mid;build(ls);build(rs);pushUp(rt, r - l + 1);}int query(int L, int R, int l, int r, int rt){if(L <= l && r <= R) return tr[rt].maxi;mid;int ret = 0;if(L <= m) ret = max(ret, query(L, R, ls));if(m < R) ret = max(ret, query(L, R, rs));if(tr[Ls].rNum == tr[Rs].lNum) {int a = min(tr[Ls].rSize, m - L + 1);// 较小的即为合适的int b = min(tr[Rs].lSize, R - m);ret = max(ret, a + b);}return ret;}int main(){int T, cas = 0; scanf("%d", &T);while(T--){printf("Case %d:\n", ++cas);int n, m, q;scanf("%d %d %d", &n, &m, &q);build(1, n, 1);for(int i = 1; i <= q; ++i){int l, r;scanf("%d %d", &l, &r);int ans = query(l, r, 1, n, 1); printf("%d\n", ans);}}return 0;}

0 0
原创粉丝点击