线段树(2)
hdu 4366 Successor
做法:对每个人按照ability由大到小排序,把loyalty插入到线段树里面,dfs处理出每个点所在的区间,然后区间查询,单点更新。(这里学到了查询区间最大值所在id的方法)。。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 #include <queue> 7 #include <stack> 8 9 using namespace std; 10 11 #define LL long long 12 #define eps 1e-6 13 #define inf 0x3f3f3f3f 14 #define MP make_pair 15 #define N 250020 16 #define M 1000020 17 #pragma comment(linker, "/STACK:1024000000,1024000000") 18 #define Pi acos(-1.0) 19 #define ls (i << 1) 20 #define rs (ls | 1) 21 #define md ((ll + rr) >> 1) 22 #define lson ll, md, ls 23 #define rson md + 1, rr, rs 24 25 int fst[N], vv[N], nxt[N], e; 26 void init(){ 27 memset(fst, -1, sizeof fst); e = 0; 28 } 29 void add(int u, int v){ 30 vv[e] = v, nxt[e] = fst[u], fst[u] = e++; 31 } 32 int in[N], out[N], lab[N], dc; 33 void dfs(int u){ 34 in[u] = ++dc; 35 lab[dc] = u; 36 for(int i = fst[u]; ~i; i = nxt[i]){ 37 int v = vv[i]; 38 dfs(v); 39 } 40 out[u] = dc; 41 } 42 struct node{ 43 int id, val, loy; 44 node(){} 45 node(int _loy, int _val, int _id){ 46 loy = _loy, val = _val, id = _id; 47 } 48 bool operator < (const node &b) const{ 49 return val > b.val; 50 } 51 }b[N]; 52 53 int mx[N<<2], val[N]; 54 void build(int ll, int rr, int i){ 55 mx[i] = -1; 56 if(ll == rr) return ; 57 build(lson), build(rson); 58 } 59 void push_up(int i){ 60 if(val[mx[ls]] > val[mx[rs]]) 61 mx[i] = mx[ls]; 62 else mx[i] = mx[rs]; 63 } 64 void update(int p, int v, int ll, int rr, int i){ 65 if(ll == rr){ 66 val[ll] = v; 67 mx[i] = ll; 68 return ; 69 } 70 if(p <= md) update(p, v, lson); 71 else update(p, v, rson); 72 push_up(i); 73 } 74 int query(int l, int r, int ll, int rr, int i){ 75 if(l > r) return -1; 76 if(ll == l && r == rr) 77 return mx[i]; 78 if(r <= md) return query(l, r, lson); 79 else if(l > md) return query(l, r, rson); 80 else{ 81 int ret1 = query(l, md, lson); 82 int ret2 = query(md + 1, r, rson); 83 if(ret1 == -1) return ret2; 84 if(ret2 == -1) return ret1; 85 return val[ret1] >= val[ret2] ? ret1 : ret2; 86 } 87 } 88 89 int ans[N]; 90 int main(){ 91 int cas; 92 scanf("%d", &cas); 93 while(cas--){ 94 int n, m; 95 scanf("%d%d", &n, &m); 96 init(); 97 for(int i = 1; i < n; ++i){ 98 int u, val, loy; 99 scanf("%d%d%d", &u, &loy, &val); 100 add(u, i); 101 b[i] = node(loy, val, i); 102 } 103 dc = 0; 104 dfs(0); 105 sort(b + 1, b + n); 106 build(1, n, 1); 107 memset(val, -1, sizeof val); 108 for(int i = 1, j; i < n; i = j){ 109 j = i; 110 while(j < n && b[i].val == b[j].val){ 111 int k = b[j].id; 112 int t = query(in[k] + 1, out[k], 1, n, 1); 113 if(t == -1) ans[k] = -1; 114 else ans[k] = lab[t]; 115 j++; 116 } 117 j = i; 118 while(j < n && b[i].val == b[j].val){ 119 update(in[b[j].id], b[j].loy, 1, n, 1); 120 j++; 121 } 122 } 123 while(m--){ 124 int i; 125 scanf("%d", &i); 126 printf("%d ", ans[i]); 127 } 128 } 129 return 0; 130 }
hdu 3397 Sequence operation
区间赋值,异或。记录左边连续最大,右边连续最大,总的连续最大,区间1和0的个数。(询问的时候返回连续最大的1的个数那里老是写挫了!!!)
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 #include <queue> 7 using namespace std; 8 9 #define LL long long 10 #define eps 1e-8 11 #define inf 0x3f3f3f3f 12 #define MP make_pair 13 #define N 100020 14 #define M 200020 15 #pragma comment(linker, "/STACK:1024000000,1024000000") 16 #define Pi acos(-1.0) 17 #define mod 1000000007 18 #define ls (i << 1) 19 #define rs (ls | 1) 20 #define md ((ll + rr) >> 1) 21 #define lson ll, md, ls 22 #define rson md + 1, rr, rs 23 24 int mxL[2][N<<2], mxR[2][N<<2], mx[2][N<<2]; 25 int sum[2][N<<2], cov[N<<2], Xor[N<<2]; 26 27 void init(int x, int i, int len){ 28 mxL[x][i] = mxR[x][i] = mx[x][i] = len; 29 sum[x][i] = len; 30 } 31 32 void push_up(int x, int i, int ll, int rr){ 33 mxL[x][i] = mxL[x][ls], mxR[x][i] = mxR[x][rs]; 34 mx[x][i] = max(mx[x][ls], mx[x][rs]); 35 mx[x][i] = max(mx[x][i], mxR[x][ls] + mxL[x][rs]); 36 if(mxL[x][ls] == md - ll + 1) 37 mxL[x][i] += mxL[x][rs]; 38 if(mxR[x][rs] == rr - md) 39 mxR[x][i] += mxR[x][ls]; 40 sum[x][i] = sum[x][ls] + sum[x][rs]; 41 } 42 void build(int ll, int rr, int i){ 43 cov[i] = -1, Xor[i] = 0; 44 if(ll == rr){ 45 int v; 46 scanf("%d", &v); 47 init(v, i, 1); 48 init(v^1, i, 0); 49 return ; 50 } 51 build(lson), build(rson); 52 push_up(0, i, ll, rr); 53 push_up(1, i, ll, rr); 54 } 55 void change(int i){ 56 Xor[i] ^= 1; 57 swap(mxL[0][i], mxL[1][i]); 58 swap(mxR[0][i], mxR[1][i]); 59 swap(mx[0][i], mx[1][i]); 60 swap(sum[0][i], sum[1][i]); 61 } 62 void push_down(int i, int ll, int rr){ 63 if(cov[i] != -1){ 64 int x = cov[i]; 65 cov[ls] = cov[rs] = x; 66 Xor[ls] = Xor[rs] = 0; 67 init(x, ls, md - ll + 1); 68 init(x, rs, rr - md); 69 init(x^1, ls, 0); 70 init(x^1, rs, 0); 71 cov[i] = -1; 72 } 73 if(Xor[i]){ 74 change(ls), change(rs); 75 Xor[i] = 0; 76 } 77 } 78 void update(int l, int r, int op, int ll, int rr, int i){ 79 if(l == ll && r == rr){ 80 if(op == 0 || op == 1){ 81 init(op, i, rr - ll + 1); 82 init(op ^ 1, i, 0); 83 cov[i] = op, Xor[i] = 0; 84 } 85 else{ 86 change(i); 87 } 88 return ; 89 } 90 push_down(i, ll, rr); 91 if(r <= md) update(l, r, op, lson); 92 else if(l > md) update(l, r, op, rson); 93 else 94 update(l, md, op, lson), update(md + 1, r, op, rson); 95 push_up(0, i, ll, rr); 96 push_up(1, i, ll, rr); 97 } 98 99 int query(int l, int r, int op, int ll, int rr, int i){ 100 if(l == ll && r == rr){ 101 if(op == 4) 102 return mx[1][i]; 103 else return sum[1][i]; 104 } 105 push_down(i, ll, rr); 106 int ret; 107 if(r <= md) ret = query(l, r, op, lson); 108 else if(l > md) ret = query(l, r, op, rson); 109 else{ 110 int ret1 = query(l, md, op, lson); 111 int ret2 = query(md + 1, r, op, rson); 112 if(op == 4){ 113 ret = max(ret1, ret2); 114 ret = max(ret, min(mxR[1][ls], md - l + 1) + min(mxL[1][rs], r - md)); 115 } 116 else ret = ret1 + ret2; 117 } 118 push_up(0, i, ll, rr); 119 push_up(1, i, ll, rr); 120 return ret; 121 } 122 int main(){ 123 int cas; 124 //freopen("tt.txt", "r", stdin); 125 scanf("%d", &cas); 126 while(cas--){ 127 int n, m; 128 scanf("%d%d", &n, &m); 129 build(1, n, 1); 130 while(m--){ 131 int op, L, R; 132 scanf("%d%d%d", &op, &L, &R); 133 ++L, ++R; 134 if(op <= 2) 135 update(L, R, op, 1, n, 1); 136 else printf("%d ", query(L, R, op, 1, n, 1)); 137 } 138 } 139 return 0; 140 }