Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:这题卡的太紧了啊,G++跑了TLE怎么搞都不好,换C++跑了3.9s,代码In Reply To:这题卡的太紧了啊,G++跑了TLE怎么搞都不好,换C++跑了3.9s,代码 Posted by:lonelam at 2016-12-01 22:04:04 > #define _CRT_SECURE_NO_WARNINGS > #include<algorithm> > #include<vector> > #include<cstdio> > #include<cstring> > #include<queue> > using namespace std; > const int maxn = 330001 * 2; > //BIT implemention > int sum_n; > int C[maxn]; > int lsb(int x) > { > return x&(-x); > } > int sum(int x) > { > int ret = 0; > while (x > 0) > { > ret += C[x]; > x -= lsb(x); > } > return ret; > } > void add(int x, int d) > { > while (x <= sum_n) > { > C[x] += d; > x += lsb(x); > } > } > void sum_init(int N) > { > sum_n = 1; > while (N > sum_n) > { > sum_n <<= 1; > } > sum_n <<= 1; > memset(C, 0, sizeof(int) * sum_n); > } > struct edge > { > int to, cost, id; > edge() {} > edge(int to, int cost, int id) : to(to), cost(cost), id(id) {} > }; > int k; > int vs[maxn * 2]; > vector<int> G[maxn]; > int sz; > edge es[maxn * 2 + 20 ]; > ///LCA RMQ version!! > const int inf = 0x3f3f3f3f; > void add_edge(int from, int to, int weight, int id) > { > G[from].push_back(sz); > es[sz].to = to; > es[sz].id = id; > es[sz++].cost = weight; > G[to].push_back(sz); > es[sz].to = from; > es[sz].id = id; > es[sz++].cost = weight; > } > ///RMQ ! > > int RMQ[maxn * 2 + 1]; > int RMQ_N; > void rmq_init(int * tar, int n) > { > RMQ_N = 1; > while (n > RMQ_N) > { > RMQ_N <<= 1; > } > RMQ_N <<= 1; > for (int i = 0; i < n; i++) > { > RMQ[RMQ_N + i] = i; > } > for (int i = n; i < RMQ_N; i++) > { > RMQ[RMQ_N + i] = -1; > } > for (int i = RMQ_N - 1; i > 0; i--) > { > if (RMQ[i * 2] == -1) > { > RMQ[i] = RMQ[i * 2 + 1]; > } > else if (RMQ[i * 2 + 1] == -1 ||tar[RMQ[i * 2]] < tar[RMQ[i * 2 + 1]]) > { > RMQ[i] = RMQ[i * 2]; > } > else > { > RMQ[i] = RMQ[i * 2 + 1]; > } > } > } > int depth[maxn * 2 + 1]; > int inner_query(int l, int r, int o, int ql, int qr) > { > if (ql <= l && r <= qr) > { > return RMQ[o]; > } > if (r < ql || qr < l) > { > return -1; > } > int ans = 0; > const int mid = l + (r - l) / 2; > int dl = inner_query(l, mid, o * 2, ql, qr); > int dr = inner_query(mid + 1, r, o * 2 + 1, ql, qr); > if (dl == -1) > { > return dr; > } > if (dr == -1 || depth[dl] < depth[dr]) > { > return dl; > } > else > { > return dr; > } > } > int query(int l, int r) > { > return inner_query(0, RMQ_N - 1, 1, l, r); > } > ///LCA > int id_access1[maxn]; > int id_access2[maxn]; > int id_w[maxn]; > int fp[maxn]; > void dfs(int u, int p, int d) > { > depth[k] = d; > fp[u] = k; > vs[k++] = u; > for (int i = 0; i < G[u].size(); i++) > { > edge & e = es[G[u][i]]; > if (e.to != p) > { > add(k, e.cost); > id_access1[e.id] = k; > dfs(e.to, u, d + 1); > add(k, -e.cost); > id_access2[e.id] = k; > depth[k] = d; > vs[k++] = u; > } > } > } > int lca(int ll, int rr) > { > return fp[vs[query(ll, rr)]]; > } > int main() > { > int V, q, s; > int from, to, cost; > > while (scanf("%d%d%d", &V, &q, &s)!=EOF) > { > sz = 0; > k = 1; > sum_init(V * 2 + 1); > for (int i = 1; i <= V ; i++) > { > G[i].clear(); > } > > for (int i = 1; i < V; i++) > { > scanf("%d%d%d", &from, &to, &cost); > add_edge(from, to, cost, i); > id_w[i] = cost; > } > dfs(s, -1, 0); > rmq_init(depth, k); > int cur = s; > int cmd; > int u; > int nno, wto; > for (int i = 0; i < q; i++) > { > scanf("%d", &cmd); > if (cmd == 0) > { > scanf("%d", &u); > int l = min(fp[cur], fp[u]); > int r = max(fp[cur], fp[u]); > printf("%d\n", sum(l) + sum(r) - 2 * sum(lca(l, r))); > cur = u; > } > else > { > scanf("%d%d", &nno, &wto); > add(id_access1[nno], wto - id_w[nno]); > add(id_access2[nno], id_w[nno] - wto); > id_w[nno] = wto; > } > } > } > } > > /* > > 10 40 5 > 1 2 4 > 1 3 3 > 1 4 1 > 4 5 9 > 5 6 6 > 4 7 6 > 1 8 2 > 1 9 7 > 9 10 3 > 0 1 > 1 6 9 > 1 7 2 > 0 6 > > > */ Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator