日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SDOI2014 旅行

發布時間:2023/12/10 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SDOI2014 旅行 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

傳送門

省選前水一發

這題一開始看標簽是主席樹……后來……這題和主席樹有啥關系……
可以想到對于每種宗教用樹剖+線段樹維護即可。然后因為空間不夠要動態開點。然后改宗教,改評級的,把原來的點刪了再插一個新點就可以了。查詢最大值,和就直接線段樹維護。
當樹剖板子練習了。

#include<bits/stdc++.h> #define rep(i,a,n) for(int i = a;i <= n;i++) #define per(i,n,a) for(int i = n;i >= a;i--) #define enter putchar('\n') #define pr pair<int,int> #define mp make_pair #define fi first #define sc second using namespace std; typedef long long ll; const int M = 100005; const int N = 2000005; const int INF = 0x3f3f3f3f;int read() {int ans = 0,op = 1;char ch = getchar();while(ch < '0' || ch > '9') {if(ch == '-') op = -1;ch = getchar();}while(ch >='0' && ch <= '9') ans = ans * 10 + ch - '0',ch = getchar();return ans * op; }int n,m,w[M],c[M],head[M],ecnt,dep[M],hson[M],top[M],idx,dfn[M],rk[M],fa[M]; int x,y,size[M],cnt,root[M],k,q; char ch[5];struct tree {int lc,rc,val,sum; }t[M<<5];struct edge {int next,to,from; }e[M<<1];void add(int x,int y){e[++ecnt] = {head[x],y,x},head[x] = ecnt;}void dfs1(int x,int f) {dep[x] = dep[f] + 1,size[x] = 1,fa[x] = f;for(int i = head[x];i;i = e[i].next){if(e[i].to == f) continue;dfs1(e[i].to,x);size[x] += size[e[i].to];if(size[e[i].to] > size[hson[x]]) hson[x] = e[i].to;} }void dfs2(int x,int t) {dfn[x] = ++idx,rk[idx] = x,top[x] = t;if(hson[x]) dfs2(hson[x],t);for(int i = head[x];i;i = e[i].next){if(e[i].to == hson[x] || e[i].to == fa[x]) continue;dfs2(e[i].to,e[i].to);} }void pushup(int p) {t[p].val = max(t[t[p].lc].val,t[t[p].rc].val);t[p].sum = t[t[p].lc].sum + t[t[p].rc].sum; } void pushdown(int p){t[p].sum = t[p].val = 0;}void insert(int &p,int l,int r,int pos,int val) {if(!p) p = ++cnt;if(l == r) {t[p].sum = t[p].val = val;return;}int mid = (l+r) >> 1;if(pos <= mid) insert(t[p].lc,l,mid,pos,val);else insert(t[p].rc,mid+1,r,pos,val);pushup(p); }void del(int &p,int l,int r,int pos) {if(!p) return;if(l == r) {pushdown(p);return;}int mid = (l+r) >> 1;if(pos <= mid) del(t[p].lc,l,mid,pos);else del(t[p].rc,mid+1,r,pos);pushup(p); }int query(int &p,int l,int r,int kl,int kr) {if(!p) return 0;if(l == kl && r == kr) return t[p].sum;int mid = (l+r) >> 1;if(kr <= mid) return query(t[p].lc,l,mid,kl,kr);else if(kl > mid) return query(t[p].rc,mid+1,r,kl,kr);else return query(t[p].lc,l,mid,kl,mid) + query(t[p].rc,mid+1,r,mid+1,kr); }int ask(int &p,int l,int r,int kl,int kr) {if(!p) return 0;if(l == kl && r == kr) return t[p].val;int mid = (l+r) >> 1;if(kr <= mid) return ask(t[p].lc,l,mid,kl,kr);else if(kl > mid) return ask(t[p].rc,mid+1,r,kl,kr);else return max(ask(t[p].lc,l,mid,kl,mid),ask(t[p].rc,mid+1,r,mid+1,kr)); }int srange(int x,int y) {int cur = 0,k = c[x];while(top[x] != top[y]){if(dep[top[x]] < dep[top[y]]) swap(x,y);cur += query(root[k],1,n,dfn[top[x]],dfn[x]);x = fa[top[x]];}if(dep[x] > dep[y]) swap(x,y);cur += query(root[k],1,n,dfn[x],dfn[y]);return cur; }int mrange(int x,int y) {int cur = 0,k = c[x];while(top[x] != top[y]){if(dep[top[x]] < dep[top[y]]) swap(x,y);cur = max(cur,ask(root[k],1,n,dfn[top[x]],dfn[x]));x = fa[top[x]];}if(dep[x] > dep[y]) swap(x,y);cur = max(cur,ask(root[k],1,n,dfn[x],dfn[y]));return cur; }int main() {n = read(),q = read();rep(i,1,n) w[i] = read(),c[i] = read();rep(i,1,n-1) x = read(),y = read(),add(x,y),add(y,x);dfs1(1,0),dfs2(1,1);rep(i,1,n) insert(root[c[i]],1,n,dfn[i],w[i]);while(q--){scanf("%s",ch);if(ch[1] == 'C'){x = read(),k = read();del(root[c[x]],1,n,dfn[x]),c[x] = k;insert(root[c[x]],1,n,dfn[x],w[x]);}if(ch[1] == 'W'){x = read(),k = read();del(root[c[x]],1,n,dfn[x]),w[x] = k;insert(root[c[x]],1,n,dfn[x],w[x]);}if(ch[1] == 'S'){x = read(),y = read();printf("%d\n",srange(x,y));}if(ch[1] == 'M'){x = read(),y = read();printf("%d\n",mrange(x,y));}}return 0; }

轉載于:https://www.cnblogs.com/captain1/p/10659250.html

總結

以上是生活随笔為你收集整理的SDOI2014 旅行的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。