BZOJ 4911 切树游戏

重构了三次.jpg

每次都把这个问题想简单了.jpg

果然我还是太菜了.jpg

这种题的题解可以一眼秒掉了,FWT+动态DP简直是裸的一批...

那么接下来,考虑如何维护信息。

每个点维护$4$个信息,分别表示,这条链自底向上,自上向底,两端都在这条链的轻儿子里,和两端为链头的方案数。

这样的话,正常询问就没啥问题了,只需要每次修改和初始化的时候FWT一下,然后最后FWT回来即可。

然后这样做的话,因为FWT没有可减性(没法求逆),所以每次需要将轻儿子用线段树维护一下,然后每次重建即可

(是我菜了,FWT之间求每个对应位置的逆元然后乘起来就行...

剩下的就是DDP正常操作了...

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cmath>
  4. #include <cstring>
  5. #include <cstdlib>
  6. #include <queue>
  7. #include <iostream>
  8. #include <bitset>
  9. using namespace std;
  10. #define N 30005
  11. #define M 128
  12. #define mod 10007
  13. #define inv2 5004
  14. #define lson l,m,rt<<1
  15. #define rson m+1,r,rt<<1|1
  16. int n,m,Q,a[N];
  17. struct node{int to,next;}e[N<<1];
  18. int head[N],cnt,fa[N],anc[N],son[N],siz[N],idx[N],tims,p[N],sson[N];
  19. // ploy
  20. struct Ploy
  21. {
  22. int a[M],len;
  23. void FWT(int opt)
  24. {
  25. for(int k=2,tmp;k<=m;k<<=1)
  26. for(int i=0,t=k>>1;i<m;i+=k)
  27. for(int j=i;j<i+t;j++)
  28. if(opt==1)tmp=a[j],a[j]=(a[j]+a[j+t])%mod,a[j+t]=(mod+tmp-a[j+t])%mod;
  29. else tmp=a[j],a[j]=(a[j]+a[j+t])*inv2%mod,a[j+t]=(mod+tmp-a[j+t])*inv2%mod;
  30. }
  31. Ploy(){}
  32. Ploy(int x){len=1;a[0]=x;FWT(1);}
  33. Ploy(int p,int x){memset(a,0,sizeof(a));len=m;a[p]=x;FWT(1);}
  34. Ploy(int *b,int m){memcpy(a,b,sizeof(a));len=m;}
  35. Ploy operator + (const Ploy &b) const
  36. {
  37. Ploy c;c.len=max(b.len,len);
  38. for(int i=0;i<c.len;i++)c.a[i]=(a[i]+b.a[i])%mod;
  39. return c;
  40. }
  41. Ploy operator - (const Ploy &b) const
  42. {
  43. Ploy c;c.len=max(b.len,len);
  44. for(int i=0;i<c.len;i++)c.a[i]=(mod+a[i]-b.a[i])%mod;
  45. return c;
  46. }
  47. Ploy operator * (const Ploy &b) const
  48. {
  49. Ploy c;c.len=max(b.len,len);
  50. for(int i=0;i<c.len;i++)c.a[i]=a[i]*b.a[i]%mod;
  51. return c;
  52. }
  53. int get(int x){FWT(-1);return a[x];}
  54. void print(){FWT(-1);for(int i=0;i<m;i++)printf("%d ",a[i]);puts("");FWT(1);}
  55. }f[N],g[N],s[N],h[N],one,tmp,A[N];
  56. // Segment_Tree of all the sons
  57. vector<Ploy>Tr[N];
  58. vector<int>lsn[N];
  59. int pos[N];
  60. void build(int x,int l,int r,int rt)
  61. {
  62. if(l==r){Tr[x][rt]=f[lsn[x][l-1]]+one;pos[lsn[x][l-1]]=rt;return ;}
  63. int m=(l+r)>>1;build(x,lson);build(x,rson);Tr[x][rt]=Tr[x][rt<<1]*Tr[x][rt<<1|1];
  64. }
  65. // Segment_Tree of DDP
  66. struct Segment
  67. {
  68. Ploy a,b,c,d;
  69. Segment(){}
  70. Segment(Ploy x,Ploy y){a=b=c=x;d=x+y;}
  71. Segment operator + (const Segment &A) const
  72. {
  73. Segment B;
  74. B.a=a*A.a;
  75. B.b=b+A.b*a;
  76. B.c=A.c+A.a*c;
  77. B.d=d+A.d+A.b*c;
  78. return B;
  79. }
  80. }tr[N<<2];
  81. void build(int l,int r,int rt)
  82. {
  83. if(l==r){tr[rt]=Segment(A[p[l]]*g[p[l]],s[p[l]]);return ;}
  84. int m=(l+r)>>1;build(lson);build(rson);tr[rt]=tr[rt<<1]+tr[rt<<1|1];
  85. }
  86. Segment query(int L,int R,int l,int r,int rt)
  87. {
  88. if(L<=l&&r<=R)return tr[rt];int m=(l+r)>>1;
  89. if(R<=m)return query(L,R,lson);if(L>m)return query(L,R,rson);
  90. return query(L,R,lson)+query(L,R,rson);
  91. }
  92. void Update(int x,int l,int r,int rt)
  93. {
  94. if(l==r){tr[rt]=Segment(A[p[l]]*g[p[l]],s[p[l]]);return ;}
  95. int m=(l+r)>>1;if(x<=m)Update(x,lson);else Update(x,rson);tr[rt]=tr[rt<<1]+tr[rt<<1|1];
  96. }
  97. void Update(int x)
  98. {
  99. Segment tmp=Segment();
  100. while(x)
  101. {
  102. Update(idx[x],1,n,1);x=anc[x];
  103. if(fa[x])
  104. {
  105. tmp=query(idx[x],idx[sson[x]],1,n,1);
  106. s[fa[x]]=s[fa[x]]-h[x]+tmp.d;f[x]=tmp.b;
  107. h[x]=tmp.d;int rt=pos[x];Tr[fa[x]][rt]=f[x]+one;
  108. for(rt>>=1;rt;rt>>=1)Tr[fa[x]][rt]=Tr[fa[x]][rt<<1]*Tr[fa[x]][rt<<1|1];
  109. g[fa[x]]=Tr[fa[x]][1];
  110. }x=fa[x];
  111. }
  112. }
  113. // Graph
  114. void add(int x,int y){e[cnt]=(node){y,head[x]};head[x]=cnt++;}
  115. void dfs1(int x,int from)
  116. {
  117. fa[x]=from;siz[x]=1;f[x]=A[x];
  118. for(int i=head[x];i!=-1;i=e[i].next)
  119. {
  120. int to1=e[i].to;
  121. if(to1!=from)dfs1(to1,x),f[x]=f[x]*(f[to1]+one),h[x]=h[x]+h[to1],siz[x]+=siz[to1],siz[son[x]]<siz[to1]?son[x]=to1:0;
  122. }h[x]=h[x]+f[x];
  123. }
  124. void dfs2(int x,int top)
  125. {
  126. anc[x]=top;idx[x]=++tims;p[tims]=x;sson[x]=x;g[x]=one;
  127. if(son[x])dfs2(son[x],top),sson[x]=sson[son[x]];
  128. for(int i=head[x];i!=-1;i=e[i].next)
  129. {
  130. int to1=e[i].to;
  131. if(to1!=son[x]&&to1!=fa[x])dfs2(to1,to1),g[x]=g[x]*(f[to1]+one),s[x]=s[x]+h[to1],lsn[x].push_back(to1);
  132. }
  133. if(!lsn[x].size())return ;
  134. Tr[x].resize(lsn[x].size()*4+5);
  135. build(x,1,lsn[x].size(),1);
  136. }
  137. char opt[10];
  138. int main()
  139. {
  140. int size = 0x8000000;
  141. char*p=(char*)malloc(size) + size;
  142. __asm__("movl %0, %%esp\n" :: "r"(p) );
  143. scanf("%d%d",&n,&m);memset(head,-1,sizeof(head));
  144. one.a[0]=1;one.len=1;one.FWT(1);
  145. for(int i=1;i<=n;i++)scanf("%d",&a[i]),A[i]=Ploy(a[i],1);
  146. for(int i=1,x,y;i<n;i++)scanf("%d%d",&x,&y),add(x,y),add(y,x);
  147. dfs1(1,0);dfs2(1,1);build(1,n,1);scanf("%d",&Q);
  148. while(Q--)
  149. {
  150. int x,y;scanf("%s%d",opt,&x);
  151. if(opt[0]=='Q')tmp=query(idx[1],idx[sson[1]],1,n,1).d,printf("%d\n",tmp.get(x));
  152. else
  153. {
  154. scanf("%d",&y);a[x]=y;A[x]=Ploy(a[x],1);
  155. Update(x);
  156. }
  157. }
  158. }

BZOJ4911: [Sdoi2017]切树游戏的更多相关文章

  1. 【BZOJ4911】[SDOI2017]切树游戏(动态dp,FWT)

    [BZOJ4911][SDOI2017]切树游戏(动态dp,FWT) 题面 BZOJ 洛谷 LOJ 题解 首先考虑如何暴力\(dp\),设\(f[i][S]\)表示当前以\(i\)节点为根节点,联通子 ...

  2. LG3781 [SDOI2017]切树游戏

    题意 题目描述 小Q是一个热爱学习的人,他经常去维基百科学习计算机科学. 就在刚才,小Q认真地学习了一系列位运算符,其中按位异或的运算符\(\oplus\)对他影响很大.按位异或的运算符是双目运算符. ...

  3. LOJ2269 [SDOI2017] 切树游戏 【FWT】【动态DP】【树链剖分】【线段树】

    题目分析: 好题.本来是一道好的非套路题,但是不凑巧的是当年有一位国家集训队员正好介绍了这个算法. 首先考虑静态的情况.这个的DP方程非常容易写出来. 接着可以注意到对于异或结果的计数可以看成一个FW ...

  4. bzoj 4911: [Sdoi2017]切树游戏

    考虑维护原树的lct,在上面dp,由于dp方程特殊,均为异或卷积或加法,计算中可以只使用fwt后的序列 v[w]表示联通子树的最浅点为w,且不选w的splay子树中的点 l[w]表示联通子树的最浅点在 ...

  5. [SDOI2017]切树游戏

    题目 二轮毒瘤题啊 辣鸡洛谷竟然有卡树剖的数据 还是\(loj\)可爱 首先这道题没有带修,设\(dp_{i,j}\)表示以\(i\)为最高点的连通块有多少个异或和为\(j\),\(g_{i,j}=\ ...

  6. 洛谷 P3781 - [SDOI2017]切树游戏(动态 DP+FWT)

    洛谷题面传送门 SDOI 2017 R2 D1 T3,nb tea %%% 讲个笑话,最近我在学动态 dp,wjz 在学 FWT,而我们刚好在同一天做到了这道题,而这道题刚好又是 FWT+动态 dp ...

  7. 【LOJ】#2269. 「SDOI2017」切树游戏

    题解 把所有的数组一开始就FWT好然后再IFWT回去可以减小常数 从13s跑到0.7s-- 可以参照immortalCO的论文,感受一下毒瘤的动态动态DP 就是用数据结构维护线性递推的矩阵的乘积 由于 ...

  8. loj#2269. 「SDOI2017」切树游戏

    还是loj的机子快啊... 普通的DP不难想到,设F[i][zt]为带上根玩出zt的方案数,G[i][zt]为子树中的方案数,后面是可以用FWT优化的 主要是复习了下动态DP #include< ...

  9. LOJ2269. 「SDOI2017」切树游戏 [FWT,动态DP]

    LOJ 思路 显然是要DP的.设\(dp_{u,i}\)表示\(u\)子树内一个包含\(u\)的连通块异或出\(i\)的方案数,发现转移可以用FWT优化,写成生成函数就是这样的: \[ dp_{u}= ...

随机推荐

  1. wepy里面两种不同的写回调函数的方法

    方案一const getHelpCenter = createAction(GET_HELP_CENTER, () => request('api/hisense/article/menu/li ...

  2. 【读书笔记】iOS-移动开发

    一,iPhone 为iPhone编写基于Web的应用程序非常简单.Safari Web浏览器是一款很优秀的工具-它能够完美地对基于Web的应用程序进行缩放,以便在iPhone大小的屏幕上运行.Safa ...

  3. springboot 监控 Actuator

    springboot 提供了对项目的监控功能. 1.首先添加依赖包 <!-- https://mvnrepository.com/artifact/org.springframework.boo ...

  4. 自定义控件详解(二):Path类 相关用法

    Path:路径 绘制路径:void drawPath (Path path, Paint paint) Path 可以绘制的路径 一.直线路径 1.基本方法 void moveTo (float st ...

  5. Jni OnLoad()和OnUnload()

    除了前面说的自定义JNI函数之外,JNI还提供了两个特殊函数,它们是JNI_OnLoad()和JNI_OnUnload(),分别在加载库和卸载库的时候调用. 1.JNI_OnLoad() Java调用 ...

  6. IDEA错误:Failed to start end point associated with ProtocolHandler [http-nio-9999] java.net.BindException: Address already in use: bind

    日志显示进程端口已被占用,首先需要的是查询什么进程占用了当前的9999端口. 1.win+R输入cmd进入命令界面: 2.输入命令  netstat -ano|findstr "端口号&qu ...

  7. [20171225]查看并行执行计划注意的问题.txt

    [20171225]查看并行执行计划注意的问题.txt --//如果使用dbms_xplan.display_cursor查看并行执行计划注意一些问题,通过例子说明: 1.环境: SCOTT@book ...

  8. IP负载均衡

    推荐一篇关于LVS的好文: https://www.cnblogs.com/gaoxu387/p/7941381.html 一.原博主要内容: 1.概述 IP负载均衡:四层负载,是基于IP+端口的负载 ...

  9. CentOS7下用firewall-cmd控制端口与端口转发

    1.firewalld 守护进程 2.控制端口/服务 3.伪装IP 4.端口转发 实现目标:服务器A和服务器B都是内网互通的,但是只有服务器A是有外网然后现在做端口转发实现服务器B能使用服务器A的外网 ...

  10. 13LaTeX学习系列之---LaTeX插入表格

    目录 目录 前言 (一)插入表格的基础语法 1.说明 2.源代码 3.输出效果 (二)查看文档 目录 本系列是有关LaTeX的学习系列,共计19篇,本章节是第13篇. 前一篇:12LaTeX学习系列之 ...