萌新求助

P3714 [BJOI2017] 树的难题

兄啊你这个码风必没有人来的
by 小粉兔 @ 2020-03-02 02:33:55


惊现兔队!
by Ryo_Yamada @ 2020-03-02 07:41:46


惊现兔队! ~~码风确实毒瘤~~
by USSENTERPRISE @ 2020-03-02 08:15:59


orz 那我重发一份吧QAQ ``` #include<bits/stdc++.h> #define rep(i,a,b) for (int i = (a); i <= (b); ++i) #define drep(i,a,b) for (int i = (a); i >= (b); --i) #define grep(i,u) for (int i = head[u],v = e[i].v; i; v = e[i = e[i].nxt].v) #define il inline #define LL long long using namespace std; il int read() { int res = 0,f = 1; char ch = getchar(); while (!isdigit(ch)) { if (ch == '-') f = -f; ch = getchar(); } while (isdigit(ch)) { res = (res<<3)+(res<<1)+ch-'0'; ch = getchar(); } return res*f; } namespace qiqi { const int N = 5e5+5,INF = 0x3f3f3f3f; int n,m,L,R,ans = -INF,val[N],ecnt,head[N],rt,sum,siz[N],dep[N],col[N],dis[N],mx[N],len[N],fa[N],a[N],q[N],lst[N],now[N],ul[N],uc[N],T; bool vis[N]; vector<int> vl[N],vc[N]; struct Edge { int v,c,nxt; } e[N]; il void add(int u,int v,int c) { e[++ecnt] = (Edge) { v,c,head[u] }; head[u] = ecnt; } void getrt(int u,int fa) { siz[u] = 1; mx[u] = 0; grep(i,u) if (v != fa && !vis[v]) { getrt(v,u); siz[u] += siz[v]; mx[u] = max(mx[u],siz[v]); } mx[u] = max(mx[u],sum-siz[u]); if (mx[u] < mx[rt]) rt = u; } il void calc(int rt) { int h = 1,t = 0; ++T; fa[rt] = rt; grep(i,rt) if (!vis[v]) { dep[v] = 1; vl[q[++t]=fa[v]=v].push_back(len[v]=val[col[v]=e[i].c]); } while (h <= t) { int u = q[h++]; if (L <= dep[u] && dep[u] <= R) ans = max(ans,len[u]); if (dep[u] < R) grep(i,u) if (!vis[v] && !fa[v]) { dep[v] = dep[u]+1; fa[v] = fa[u]; col[v] = e[i].c; len[v] = len[u]+(col[u]!=col[v]?val[col[v]]:0); q[++t] = v; if (vl[fa[v]].size() < dep[v]) vl[fa[v]].push_back(len[v]); else vl[fa[v]][dep[v]-1] = max(vl[fa[v]][dep[v]-1],len[v]); } } drep(i,t,1) { if (uc[col[fa[q[i]]]] != T) uc[a[++a[0]]=col[fa[q[i]]]] = T; if (ul[fa[q[i]]] != T) { ul[fa[q[i]]] = T; vc[col[fa[q[i]]]].push_back(fa[q[i]]); } fa[q[i]] = 0; } lst[0] = now[0] = 0; while (a[0]) { drep(i,(int)vc[a[a[0]]].size()-1,0) { int x = vc[a[a[0]]][i],k = vl[x].size(); if (now[0]+k >= L) { h = 1; t = 0; rep(j,max(1,L-k),min(now[0],R-k)) { while (h <= t && now[j] >= now[q[t]]) --t; q[++t] = j; ans = max(ans,now[q[h]]+vl[x][k-1]-val[a[a[0]]]); } rep(j,R-k+1,min(now[0],R-1)) { while (h <= t && now[j] >= now[q[t]]) --t; q[++t] = j; while (h <= t && q[h]+R-j < L) ++h; ans = max(ans,now[q[h]]+vl[x][R-j-1]-val[a[a[0]]]); } } now[0] = k; rep(j,1,k) now[j] = max(now[j],vl[x][j-1]); vl[x].clear(); } if (now[0]+lst[0] >= L) { h = 1; t = 0; rep(i,max(1,L-now[0]),min(lst[0],R-now[0])) { while (h <= t && lst[i] >= lst[q[t]]) --t; q[++t] = i; ans = max(ans,lst[q[h]]+now[now[0]]); } rep(i,R-now[0]+1,lst[0]) { while (h <= t && lst[i] >= lst[q[t]]) --t; q[++t] = i; while (h <= t && q[h]+R-i < L) ++h; ans = max(ans,lst[q[h]]+now[R-i]); } } lst[0] = now[0]; now[0] = 0; rep(i,1,lst[0]) { lst[i] = max(lst[i],now[i]); now[i] = -INF; } vc[a[a[0]]].clear(); --a[0]; } rep(i,1,lst[0]) lst[i] = -INF; } void solve(int u) { vis[u] = 1; calc(u); grep(i,u) if (!vis[v]) { mx[rt = 0] = sum = siz[v]; getrt(v,0); solve(rt); } } void main() { int a,b,c; n = read(); m = read(); L = read(); R = read(); rep(i,1,m) val[i] = read(); rep(i,1,n) lst[i] = now[i] = -INF; rep(i,1,n-1) { a = read(); b = read(); c = read(); add(a,b,c); add(b,a,c); } mx[rt = 0] = sum = n; getrt(1,0); solve(rt); printf("%d\n",ans); } } int main() { qiqi::main(); return 0; } ```
by jeffqi @ 2020-03-02 11:43:20


A了A了 我是SB QAQ
by jeffqi @ 2020-03-02 13:05:53


|