【HDOJ】4605 Magic Ball Game
思路1:
树状数组+离线处理,对所有的w离散化处理,边dfs边使用树状数组更新左右w的情况。
思路2:
主席树,边bfs边建树。结点信息存储cnt,然后在线查询。
树状数组。
1 /* 4605 */ 2 #include <iostream> 3 #include <sstream> 4 #include <string> 5 #include <map> 6 #include <queue> 7 #include <set> 8 #include <stack> 9 #include <vector> 10 #include <deque> 11 #include <algorithm> 12 #include <cstdio> 13 #include <cmath> 14 #include <ctime> 15 #include <cstring> 16 #include <climits> 17 #include <cctype> 18 #include <cassert> 19 #include <functional> 20 #include <iterator> 21 #include <iomanip> 22 using namespace std; 23 //#pragma comment(linker,"/STACK:102400000,1024000") 24 25 #define sti set<int> 26 #define stpii set<pair<int, int> > 27 #define mpii map<int,int> 28 #define vi vector<int> 29 #define pii pair<int,int> 30 #define vpii vector<pair<int,int> > 31 #define rep(i, a, n) for (int i=a;i<n;++i) 32 #define per(i, a, n) for (int i=n-1;i>=a;--i) 33 #define clr clear 34 #define pb push_back 35 #define mp make_pair 36 #define fir first 37 #define sec second 38 #define all(x) (x).begin(),(x).end() 39 #define SZ(x) ((int)(x).size()) 40 #define lson l, mid, rt<<1 41 #define rson mid+1, r, rt<<1|1 42 43 typedef struct ques_t { 44 int w, id; 45 46 ques_t() {} 47 ques_t(int w, int id): 48 w(w), id(id) {} 49 50 } ques_t; 51 52 const int maxn = 1e5+5; 53 const int maxm = maxn * 2; 54 int a[maxm]; 55 int W[maxn]; 56 ques_t Q[maxn]; 57 vector<ques_t> vc[maxn]; 58 int ans[maxn][2]; 59 int son[maxn][2]; 60 int tot[maxm][2]; 61 int n, m; 62 63 int lowest(int x) { 64 return x & -x; 65 } 66 67 void add(int x, int delta, int id) { 68 while (x <= m) { 69 tot[x][id] += delta; 70 x += lowest(x); 71 } 72 } 73 74 int sum(int x, int id) { 75 int ret = 0; 76 77 while (x) { 78 ret += tot[x][id]; 79 x -= lowest(x); 80 } 81 82 return ret; 83 } 84 85 void init() { 86 memset(son, 0, sizeof(son)); 87 memset(tot, 0, sizeof(tot)); 88 rep(i, 1, n+1) 89 vc[i].clr(); 90 m = 1; 91 } 92 93 void dfs(int u, int tot) { 94 int v, sz = SZ(vc[u]); 95 int llt, lgt, rlt, rgt; 96 int eq; 97 98 rep(i, 0, sz) { 99 int w = vc[u][i].w; 100 int id = vc[u][i].id; 101 llt = sum(w-1, 0); 102 lgt = sum(m, 0) - sum(w, 0); 103 rlt = sum(w-1, 1); 104 rgt = sum(m, 1) - sum(w, 1); 105 eq = tot - llt - lgt - rlt - rgt; 106 if (eq) { 107 ans[id][0] = -1; 108 } else { 109 ans[id][0] = (lgt+rgt) + (llt+rlt)*3; 110 ans[id][1] = rlt; 111 } 112 } 113 if (son[u][0]) { 114 add(W[u], 1, 0); 115 dfs(son[u][0], tot+1); 116 add(W[u], -1, 0); 117 118 add(W[u], 1, 1); 119 dfs(son[u][1], tot+1); 120 add(W[u], -1, 1); 121 } 122 } 123 124 void solve() { 125 int q; 126 int x, w; 127 128 scanf("%d", &q); 129 rep(i, 0, q) { 130 scanf("%d %d", &Q[i].id, &Q[i].w); 131 a[m++] = Q[i].w; 132 } 133 134 sort(a+1, a+m); 135 m = unique(a+1, a+m) - (a+1); 136 137 rep(i, 1, n+1) { 138 W[i] = lower_bound(a+1, a+1+m, W[i]) - a; 139 } 140 141 rep(i, 0, q) { 142 int u = Q[i].id; 143 w = lower_bound(a+1, a+1+m, Q[i].w) - a; 144 vc[u].pb(ques_t(w, i)); 145 } 146 147 dfs(1, 0); 148 149 rep(i, 0, q) { 150 if (ans[i][0] == -1) 151 puts("0"); 152 else 153 printf("%d %d\n", ans[i][1], ans[i][0]); 154 } 155 } 156 157 int main() { 158 ios::sync_with_stdio(false); 159 #ifndef ONLINE_JUDGE 160 freopen("data.in", "r", stdin); 161 freopen("data.out", "w", stdout); 162 #endif 163 164 int t; 165 int u, v1, v2; 166 167 scanf("%d", &t); 168 while (t--) { 169 init(); 170 scanf("%d", &n); 171 rep(i, 1, n+1) { 172 scanf("%d", &W[i]); 173 a[m++] = W[i]; 174 } 175 int k; 176 scanf("%d", &k); 177 rep(i, 0, k) { 178 scanf("%d %d %d", &u, &v1, &v2); 179 son[u][0] = v1; 180 son[u][1] = v2; 181 } 182 solve(); 183 } 184 185 #ifndef ONLINE_JUDGE 186 printf("time = %d.\n", (int)clock()); 187 #endif 188 189 return 0; 190 }
主席树。
1 /* 4605 */ 2 #include <iostream> 3 #include <sstream> 4 #include <string> 5 #include <map> 6 #include <queue> 7 #include <set> 8 #include <stack> 9 #include <vector> 10 #include <deque> 11 #include <algorithm> 12 #include <cstdio> 13 #include <cmath> 14 #include <ctime> 15 #include <cstring> 16 #include <climits> 17 #include <cctype> 18 #include <cassert> 19 #include <functional> 20 #include <iterator> 21 #include <iomanip> 22 using namespace std; 23 //#pragma comment(linker,"/STACK:102400000,1024000") 24 25 #define sti set<int> 26 #define stpii set<pair<int, int> > 27 #define mpii map<int,int> 28 #define vi vector<int> 29 #define pii pair<int,int> 30 #define vpii vector<pair<int,int> > 31 #define rep(i, a, n) for (int i=a;i<n;++i) 32 #define per(i, a, n) for (int i=n-1;i>=a;--i) 33 #define clr clear 34 #define pb push_back 35 #define mp make_pair 36 #define fir first 37 #define sec second 38 #define all(x) (x).begin(),(x).end() 39 #define SZ(x) ((int)(x).size()) 40 // #define lson l, mid, rt<<1 41 // #define rson mid+1, r, rt<<1|1 42 43 const int INF = 1e9+5; 44 const int maxn = 1e5+5; 45 const int maxm = maxn * 30; 46 int a[maxn], W[maxn]; 47 int T[maxn]; 48 int lson[maxm], rson[maxm]; 49 int lc[maxm], rc[maxm]; 50 int n, m, tot; 51 int son[maxn][2]; 52 53 void init() { 54 tot = m = 0; 55 memset(son, 0, sizeof(son)); 56 } 57 58 int Build(int l, int r) { 59 int rt = tot++; 60 61 lc[rt] = rc[rt] = 0; 62 63 if (l == r) 64 return rt; 65 66 int mid = (l + r) >> 1; 67 68 lson[rt] = Build(l, mid); 69 rson[rt] = Build(mid+1, r); 70 71 return rt; 72 } 73 74 int Insert(int rt, int p, int lval, int rval) { 75 int nrt = tot++, ret = nrt; 76 int l = 0, r = m - 1, mid; 77 78 lc[nrt] = lc[rt] + lval; 79 rc[nrt] = rc[rt] + rval; 80 while (l < r) { 81 mid = (l + r) >> 1; 82 if (p <= mid) { 83 lson[nrt] = tot++; 84 rson[nrt] = rson[rt]; 85 nrt = lson[nrt]; 86 rt = lson[rt]; 87 r = mid; 88 } else { 89 lson[nrt] = lson[rt]; 90 rson[nrt] = tot++; 91 nrt = rson[nrt]; 92 rt = rson[rt]; 93 l = mid + 1; 94 } 95 lc[nrt] = lc[rt] + lval; 96 rc[nrt] = rc[rt] + rval; 97 } 98 99 return ret; 100 } 101 102 pii Query(int rt, int L, int R, int l, int r) { 103 if (L==l && R==r) 104 return mp(lc[rt], rc[rt]); 105 106 int mid = (l + r) >> 1; 107 108 if (R <= mid) { 109 return Query(lson[rt], L, R, l, mid); 110 } else if (L > mid) { 111 return Query(rson[rt], L, R, mid+1, r); 112 } else { 113 pii ltmp = Query(lson[rt], L, mid, l, mid); 114 pii rtmp = Query(rson[rt], mid+1, R, mid+1, r); 115 return mp(ltmp.fir+rtmp.fir, ltmp.sec+rtmp.sec); 116 } 117 } 118 119 void solve() { 120 a[m++] = INF; 121 a[m++] = 0; 122 sort(a, a+m); 123 m = unique(a, a+m) - a; 124 125 T[1] = Build(0, m-1); 126 queue<int> Q; 127 int u, v; 128 129 Q.push(1); 130 while (!Q.empty()) { 131 u = Q.front(); 132 Q.pop(); 133 if (son[u][0]) { 134 int wid = lower_bound(a, a+m, W[u]) - a; 135 T[son[u][0]] = Insert(T[u], wid, 1, 0); 136 T[son[u][1]] = Insert(T[u], wid, 0, 1); 137 Q.push(son[u][0]); 138 Q.push(son[u][1]); 139 } 140 } 141 142 int q; 143 int w; 144 int n2, n7; 145 146 scanf("%d", &q); 147 while (q--) { 148 scanf("%d %d", &v, &w); 149 int wid = lower_bound(a, a+m, w) - a; 150 if (a[wid] == w) { 151 // check hit w 152 pii eq = Query(T[v], wid, wid, 0, m-1); 153 if (eq.fir+eq.sec > 0) { 154 puts("0"); 155 continue; 156 } 157 } 158 159 pii lt = Query(T[v], 0, wid-1, 0, m - 1); 160 pii gt = Query(T[v], wid, m-1, 0, m - 1); 161 162 n2 = (gt.fir+gt.sec) + (lt.fir+lt.sec) * 3; 163 n7 = lt.sec; 164 165 printf("%d %d\n", n7, n2); 166 } 167 } 168 169 int main() { 170 ios::sync_with_stdio(false); 171 #ifndef ONLINE_JUDGE 172 freopen("data.in", "r", stdin); 173 freopen("data.out", "w", stdout); 174 #endif 175 176 int t; 177 int u; 178 179 scanf("%d", &t); 180 rep(tt, 1, t+1) { 181 scanf("%d", &n); 182 init(); 183 rep(i, 1, n+1) { 184 scanf("%d", &W[i]); 185 a[m++] = W[i]; 186 } 187 int k; 188 scanf("%d", &k); 189 rep(i, 0, k) { 190 scanf("%d", &u); 191 scanf("%d %d", &son[u][0], &son[u][1]); 192 } 193 solve(); 194 } 195 196 #ifndef ONLINE_JUDGE 197 printf("time = %d.\n", (int)clock()); 198 #endif 199 200 return 0; 201 }
数据发生器。
1 from copy import deepcopy 2 from random import randint, shuffle 3 import shutil 4 import string 5 6 7 def GenDataIn(): 8 with open("data.in", "w") as fout: 9 t = 1 10 bound = 10**5 / 2 11 fout.write("%d\n" % (t)) 12 for tt in xrange(t): 13 m = randint(100, 200) 14 n = 2 * m + 1 15 fout.write("%d\n" % (n)) 16 L = [] 17 for i in xrange(n): 18 w = randint(1, bound) 19 L.append(w) 20 fout.write(" ".join(map(str, L)) + "\n") 21 ust = [1] 22 vst = range(2, n+1) 23 fout.write("%d\n" % (m)) 24 for i in xrange(m): 25 idx = randint(0, len(ust)-1) 26 u = ust[idx] 27 ust.remove(u) 28 V = [] 29 for j in xrange(2): 30 idx = randint(0, len(vst)-1) 31 v = vst[idx] 32 V.append(v) 33 ust.append(v) 34 vst.remove(v) 35 fout.write("%d %d %d\n" % (u, V[0], V[1])) 36 q = randint(n/2, n) 37 fout.write("%d\n" % (q)) 38 for i in xrange(q): 39 x = randint(1, n) 40 w = randint(1, bound) 41 fout.write("%d %d\n" % (x, w)) 42 43 44 45 def MovDataIn(): 46 desFileName = "F:\eclipse_prj\workspace\hdoj\data.in" 47 shutil.copyfile("data.in", desFileName) 48 49 50 if __name__ == "__main__": 51 GenDataIn() 52 MovDataIn()