JZOJ 5911. 【NOIP2018模拟10.18】Travel
題目
EZ常常在假期環游世界,他準備去N(N<=100000)個國家之多,一些國家有航線連接,由于EZ同學有一定的強迫癥,任意兩個國家之間都能通過航路直接或間接到達,并且這樣的路徑僅有一種。(簡單來說,這些國家構成了一棵樹)
由于EZ是C國人,因此將C國(1號國家)作為整棵樹的根
每個國家有一個旅游熱度A[i]和影響力D[i]。由于目的地有點多,為了避免選擇困難癥,他給每個國家設置了一個向往值F[i],它等于所有的A[j]之和,滿足i國在j國向C國走D[j]步的路徑上(經過一條航路算一步,i=j也會被統計,如果D[j]步超過了C國,則超出部分不用管)。
LYD同學家里有礦,富有程度與EZ不相上下,但他卻在宅與現充間搖擺不定。某次機緣巧合,EZ外出旅游刺激了LYD,他決定也要開始旅游。為了避免又被判高重復率導致被取消資格,他將EZ的旅游地圖略微做了一點調整,每條航路將有一定的概率出現。
現在他有Q個詢問,每次詢問某個國家所在的聯通塊(由于每條邊是一定概率出現,因此它所在的聯通塊可以是很多種)中所有國家的F[i]值的和的平方的期望(對998244353取模),以此來決定他旅游的目的地。但他極其厭惡繁瑣的計算,于是他找到了能算出圓周率并將它倒背下來的你,答應給你豐厚的報酬。家里沒礦,老爸也不是X達集團老總的你決定接受他的任務。
題解
F怎么求?
上面打減標記,下面打加標記,從下往上做。
(比賽時想到下面打減標記,上面打加標記,從上往下做。這是不行的 看看反過來行不行)
期望題。
期望一般逆推,求f[i]的期望前,要先求f[i+1]的期望。
父傳子傳模型+i次方和模型
設f[i][1]f[i][1]f[i][1]表示以i為根的子樹的期望和。f[i][2]f[i][2]f[i][2]為以i為根的子樹的含i的連通塊的F值和的2次方的期望。
f[i][1]f[i][1]f[i][1]直接轉移。
對于求f[i][2],想象有一個方程(x+y)2=x2+2xy+y2(x+y)^2=x^2+2xy+y^2(x+y)2=x2+2xy+y2.
f[i][2]=(1?p)?x2+p?(x2+2xy+y2)=x2+p(2xy+y2)f[i][2]=(1-p)*x^2+p*(x^2+2xy+y^2)=x^2+p(2xy+y^2)f[i][2]=(1?p)?x2+p?(x2+2xy+y2)=x2+p(2xy+y2)…①
x,y表示某條邊連著的兩塊。
在①式里,y表示已經處理好的,x表示目前的點的F值。
設g[i][1]表示以i為根的子樹以外的點與i相連的期望和。g[i][2]表示以i為根的子樹以外的點的含i的連通塊的F值和的二次方的期望。
搞個前綴和,后綴和就好了。
代碼
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define N 200010 #define LL long long #define mo 998244353 #define fo(i,a,b) for(i=a;i<=b;i++) #define fd(i,a,b) for(i=a;i>=b;i--) using namespace std; struct note{int to,next;LL val; }edge[N<<1]; int head[N],tot; int i,j,k,l,n,m,q,cs; int u,v; LL w,ans[N],c[N],o1[N]; int a[N],b[N],fa[18][N],o[N]; LL f[3][N],g[3][N],pre[3][N],suf[3][N]; int dep[N],_2[18]; void dg(int x){int i;for(i=head[x];i;i=edge[i].next)if(fa[0][x]^edge[i].to){fa[0][edge[i].to]=x;dep[edge[i].to]=dep[x]+1;dg(edge[i].to);} } void lb(int x,int y,LL z){edge[++tot].to=y;edge[tot].next=head[x];edge[tot].val=z;head[x]=tot; } void dg1(int x){int i;for(i=head[x];i;i=edge[i].next)if(fa[0][x]^edge[i].to){dg1(edge[i].to);c[x]=(c[x]+c[edge[i].to])%mo;} } void dg2(int x){int i;for(i=head[x];i;i=edge[i].next)if(fa[0][x]^edge[i].to){dg2(edge[i].to);f[2][x]=(f[2][x]+2*(edge[i].val*f[1][x]%mo)*f[1][edge[i].to]%mo)%mo;f[2][x]=(f[2][x]+f[2][edge[i].to]*edge[i].val%mo)%mo;f[1][x]=(f[1][x]+f[1][edge[i].to]*edge[i].val%mo)%mo;}f[2][x]=(f[2][x]+(c[x]*f[1][x])%mo*2%mo+(c[x]*c[x])%mo)%mo;f[1][x]=(f[1][x]+c[x])%mo; } void dg3(int x){int i,CNT=0;for(i=head[x];i;i=edge[i].next)if(edge[i].to^fa[0][x]){o[++CNT]=edge[i].to;o1[CNT]=edge[i].val;}fo(i,0,CNT+1)pre[1][i]=pre[2][i]=suf[1][i]=suf[2][i]=0;pre[1][0]=g[1][x];pre[2][0]=g[2][x];fo(i,1,CNT){pre[1][i]=(pre[1][i-1]+(f[1][o[i]]*o1[i])%mo)%mo;pre[2][i]=(pre[2][i-1]+(o1[i]*f[2][o[i]])%mo)%mo;pre[2][i]=(pre[2][i]+(2*o1[i])%mo*(pre[1][i-1]*f[1][o[i]]%mo)%mo)%mo;}fd(i,CNT,1){suf[1][i]=(suf[1][i+1]+(f[1][o[i]]*o1[i])%mo)%mo;suf[2][i]=(suf[2][i+1]+(o1[i]*f[2][o[i]])%mo)%mo;suf[2][i]=(suf[2][i]+(2*o1[i])%mo*(suf[1][i+1]*f[1][o[i]]%mo)%mo)%mo;}LL A,B,w=c[x];fo(i,1,CNT){A=(pre[1][i-1]+suf[1][i+1])%mo;g[1][o[i]]=((A+w)%mo)*o1[i]%mo;B=(pre[2][i-1]+suf[2][i+1])%mo;B=(B+2*(pre[1][i-1]*suf[1][i+1]%mo+(A*w)%mo)%mo)%mo;B=(B+(w*w)%mo)%mo;g[2][o[i]]=(B*o1[i])%mo;}for(i=head[x];i;i=edge[i].next)if(edge[i].to^fa[0][x])dg3(edge[i].to); } int main(){scanf("%d",&n);fo(i,1,n)scanf("%d%d",&a[i],&b[i]);fo(i,1,n-1){scanf("%d%d%lld",&u,&v,&w);lb(u,v,w);lb(v,u,w);}dep[1]=1;dg(1);_2[0]=1;fo(i,1,17)_2[i]=_2[i-1]<<1;fo(j,1,17)fo(i,1,n)fa[j][i]=fa[j-1][fa[j-1][i]];fo(u,1,n){c[u]=a[u];if(b[u]<dep[u]-1){v=u;fd(i,17,0)if(_2[i]&b[u])v=fa[i][v];c[fa[0][v]]=(c[fa[0][v]]-1ll*a[u]+mo)%mo;}}dg1(1);dg2(1);dg3(1);scanf("%d",&q);fo(i,1,n)ans[i]=-1;fo(cs,1,q){scanf("%d",&u);if(ans[u]==-1)ans[u]=((f[2][u]+g[2][u])%mo+(2*f[1][u]*g[1][u])%mo)%mo;printf("%lld\n",ans[u]);}return 0; }總結
以上是生活随笔為你收集整理的JZOJ 5911. 【NOIP2018模拟10.18】Travel的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [:断开的管道]异常信息原因探究
- 下一篇: 基于JAVA药品自动贩卖系统计算机毕业设