Qtree1
来源:互联网 发布:员工测评软件 编辑:程序博客网 时间:2024/05/18 00:14
(update)
『打错了...读入优化的时候写错了...TAT』
『另外:跑的好慢..500+名..不过在我旁边我看见了Sillycross神..ORZ..』
『3.88s...第一名0.79s...还让不当人活....』
愚昧的代码...
#include<cstdio> #include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>#include<climits>#define max(a, b) ({int _ = (a), __ = (b); _ > __ ? _ : __;})#define swap(a, b) ({int _ = (a); (a) = (b); (b) = _;})#define maxn 1000005#define fort(_, __, ___) for (int _ = (__); _ <= (___); ++_)#define fot(_, __, ___) for (int _ = (__); _ < (___); ++_)#define ms(a, b) memset(a, b, sizeof a)#define termin() {puts("No solution");exit(0);}#define openfile() freopen("qtree.in", "r", stdin); freopen("qtree.out", "w", stdout);#define adde(a, b, c) ({*(++eptr) = (edge){b, c, h[a]}, h[a] = eptr;})using namespace std;struct edge{int t, v;edge *nt;}eg[maxn], *eptr, *h[maxn];const int inf = ~0u>>2; char rd, order;inline void read(int &a){a = 0; rd = getchar(); while ('0' > rd || rd > '9') rd = getchar();while ('0' <= rd && rd <= '9') a *= 10, a += rd - '0', rd = getchar();}typedef int arr[maxn];arr length, f, ef, s, aux, to_seg, seg_rot, weight, pos, dep, q, l, r;int n, a[maxn << 1], seg_f[maxn << 1], u, v, tot = 0, testcase, mid[maxn << 1], lt, rt;inline int build(int s, int t){if (s == t){a[++tot] = weight[u]; to_seg[u] = tot; u = aux[u]; return tot;}int md = (s + t) >> 1, tmp = build(s, md);l[++tot] = tmp, seg_f[tmp] = tot; tmp = tot; mid[tmp] = md;seg_f[r[tmp] = build(md + 1, t)] = tmp;a[tmp] = max(a[l[tmp]], a[r[tmp]]); return tmp;}inline void prepare(){q[1] = 1; ef[1] = 0; int head = 0, tail = 1, me;while (head != tail){u = q[++head];if (h[u] -> t == ef[u]) h[u] = h[u] -> nt;for(edge *e = h[u]; e; e = e -> nt){ef[q[++tail] = e -> t] = u; dep[q[tail]] = dep[u] + 1;if (e -> nt) if (e -> nt -> t == ef[u]) e -> nt = e -> nt -> nt;}}for(int i = n; i; --i){s[u = q[i]] = 1; me = 0;for(edge *e = h[u]; e; e = e -> nt){s[u] += s[v = e -> t];if (s[v] > me) aux[u] = v, me = s[v]; weight[v] = e -> v;}}fort(i, 1, n)if (!f[u = q[i]]){length[u] = -1;for(int j = u; j; j = aux[j]) f[j] = u, pos[j] = ++length[u];seg_rot[u] = build(0, length[u]);}}inline int get(int x, int s, int t){if (lt <= s && t <= rt) return a[x];int ret = 0;if (mid[x] >= lt) ret = get(l[x], s, mid[x]);if (mid[x] < rt){int ret2 = get(r[x], mid[x] + 1, t);if (ret < ret2) ret = ret2;}return ret;}inline int pathmax(int x, int y){int ret = 0, tmp; lt = 0;while (f[x] != f[y]){if (dep[f[x]] > dep[f[y]]) swap(x, y); rt = pos[y];tmp = get(seg_rot[f[y]], 0, length[f[y]]); if (ret < tmp) ret = tmp; y = ef[f[y]];}if (x != y){if (dep[x] > dep[y]) swap(x, y);lt = pos[x] + 1; rt = pos[y];tmp = get(seg_rot[f[x]], 0, length[f[x]]); if (ret < tmp) ret = tmp;}return ret;}inline void put(int x, int val){int p = eg[x << 1].t, q = eg[(x << 1) - 1].t;if (ef[q] == p) p = q; p = to_seg[p];a[p] = val;while (seg_f[p])p = seg_f[p], a[p] = max(a[l[p]], a[r[p]]);}int main(){openfile();read(testcase);while (testcase--){read(n); eptr = eg; tot = 0; ms(h, 0); ms(seg_f, 0); ms(f, 0); ms(aux, 0);int a, b, c;fot(i, 1, n) read(a), read(b), read(c), adde(a, b, c), adde(b, a, c);prepare(); order = getchar(); while (order > 'Q' || order < 'C') order = getchar();while (order != 'D'){read(a); read(b);if (order == 'Q') printf("%d\n", pathmax(a, b));else put(a, b);order = getchar(); while (order > 'Q' || order < 'C') order = getchar();}}return 0;}
- Qtree1
- Spoj 375 QTREE1 树链剖分裸题
- spoj375 QTREE1 Query on a treeⅠ【树剖模版带一丢注释】
- ios开发学习--列表(Table)效果源码分享--系列教程2
- 工作,读博,还是其他?
- 客服敲代码之“痒”
- javascript实现简单用户登录表单验证功能
- C++ delete和delete[]
- Qtree1
- 从def文件得到lib文件
- 上海交大考研经验-------大神谈学习
- Android隐藏状态栏和标题栏,相当于全屏效果
- ICETOOL学习笔记
- 用ldd运行可执行文件时打印共享库依赖
- HttpModule与HttpHandler详细介绍
- 程序猿的情诗
- 连续自然数和(easy)