传送门

Solution

Code 

  1. /*
  2. 斯坦纳树;O(n*3^n+kE*2^n) 暂且把O(k*E)当成是spfa的复杂度
  3. 15:15~16:20 原题:bzoj_4774
  4. */
  5. #include<bits/stdc++.h>
  6. #define ll long long
  7. #define max(a,b) ((a)>(b)?(a):(b))
  8. #define min(a,b) ((a)<(b)?(a):(b))
  9. inline int read()
  10. {
  11. int x=0,f=1;char ch=getchar();
  12. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  13. while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
  14. return x*f;
  15. }
  16. const int MN=105,MM=1005,inf=0x3f3f3f3f;
  17. int n,m,k;
  18. struct edge{int to,w,nex;}e[MM<<1];int hr[MN],en;
  19. inline void ins(int f,int t,int w)
  20. {
  21. e[++en]=(edge){t,w,hr[f]};hr[f]=en;
  22. e[++en]=(edge){f,w,hr[t]};hr[t]=en;
  23. }
  24. std::queue<int> q;
  25. int f[1<<11][MN],g[1<<11],refer[1<<6],ans=inf;
  26. bool inq[MN];
  27. void spfa(int *d)
  28. {
  29. register int u,i;
  30. while(!q.empty())
  31. {
  32. u=q.front();q.pop();inq[u]=false;
  33. for(i=hr[u];i;i=e[i].nex)
  34. if(d[e[i].to]>d[u]+e[i].w)
  35. {
  36. d[e[i].to]=d[u]+e[i].w;
  37. if(!inq[e[i].to]) q.push(e[i].to),inq[e[i].to]=true;
  38. }
  39. }
  40. }
  41. int main()
  42. {
  43. register int i,j,x,y,S,SS,SSS,s;
  44. n=read();m=read();k=read();SS=1<<k;SSS=1<<(k>>1);
  45. while(m--)x=read(),y=read(),ins(x,y,read());
  46. memset(f,0x3f,sizeof f);
  47. for(i=1;i<=k;++i) f[1<<i-1][i]=0;
  48. for(S=1;S<SS;++S)
  49. {
  50. for(i=1;i<=n;++i)
  51. {
  52. for(s=S&(S-1);s;s=(s-1)&S) f[S][i]=min(f[S][i],f[s][i]+f[S^s][i]);
  53. if(f[S][i]<inf) q.push(i);
  54. }
  55. spfa(f[S]);g[S]=inf;
  56. for(i=1;i<=n;++i) g[S]=min(g[S],f[S][i]);
  57. }
  58. for(i=0;i<SSS;++i)
  59. {
  60. s=0;
  61. for(j=0;j<k/2;++j) if(i>>j&1) s|=1<<(j*2);
  62. refer[i]=s|(s<<1);
  63. }
  64. for(S=1;S<SSS;++S)for(s=S&(S-1);s;s=(s-1)&S)
  65. g[refer[S]]=min(g[refer[S]],g[refer[s]]+g[refer[S^s]]);
  66. printf("%d\n",g[SS-1]);
  67. return 0;
  68. }
  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. #define max(a,b) ((a)>(b)?(a):(b))
  4. #define min(a,b) ((a)<(b)?(a):(b))
  5. inline int read()
  6. {
  7. int x=0,f=1;char ch=getchar();
  8. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  9. while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
  10. return x*f;
  11. }
  12. #define int ll
  13. const int MN=1e5+5;
  14. int N,A[MN],w[MN],L[MN],R[MN],M;
  15. int K[MN][350],Ll[350],Rr[350],bl,bel[MN];
  16. int t[MN];
  17. ll qz_a_1[350],qz_a_2[MN],sum_f[350];
  18. void C(int x,int y){for(;x<=N;x+=(x&-x))t[x]+=y;}
  19. int G(int x){int r=0;for(;x;x-=(x&-x))r+=t[x];return r;}
  20. struct edge{int to,nex;}e[MN<<1];int hr[MN],en,ind;
  21. inline void Ins(int f,int t){e[++en]=(edge){t,hr[f]};hr[f]=en;}
  22. inline void ins(int f,int t){Ins(f,t);Ins(t,f);}
  23. inline void dfs(int x,int f)
  24. {
  25. register int i;L[x]=++ind;A[ind]=w[x];
  26. for(i=hr[x];i;i=e[i].nex)if(e[i].to^f)dfs(e[i].to,x);
  27. R[x]=ind;
  28. }
  29. signed main()
  30. {
  31. register int i,j,Q,opt,x,y,rt;
  32. N=read();M=(int)((double)sqrt(N)+.5);Q=read();
  33. for(i=1;i<=N;++i) w[i]=read();
  34. for(i=1;i<=N;++i)
  35. {
  36. x=read();y=read();
  37. if(!x) rt=y;
  38. ins(x,y);
  39. }
  40. dfs(rt,0);
  41. for(bl=0,i=1;i<=N;++i)
  42. {
  43. C(L[i],1),C(R[i]+1,-1);
  44. if(i==N||i%M==0)
  45. {
  46. ++bl;Rr[bl]=i;
  47. for(j=1;j<=N;++j) K[j][bl]=G(j);
  48. for(Ll[bl]=j=(bl-1)*M+1;j<=i;++j) bel[j]=bl,C(L[j],-1),C(R[j]+1,1);
  49. }
  50. }
  51. for(i=1;i<=N;++i) qz_a_2[i]=qz_a_2[i-1]+A[i];
  52. for(i=1;i<=bl;++i) qz_a_1[i]=qz_a_2[Rr[i]];
  53. for(i=1;i<=N;++i) qz_a_2[i]-=qz_a_1[bel[i]-1];
  54. #define cal(x) (qz_a_1[bel[x]-1]+qz_a_2[x])
  55. for(i=1;i<=bl;++i)for(j=Ll[i];j<=Rr[i];++j)sum_f[i]+=cal(R[j])-cal(L[j]-1);
  56. while(Q--)
  57. {
  58. opt=read(),x=read(),y=read();
  59. if(opt==1)
  60. {
  61. x=L[x];y-=A[x];
  62. for(i=bel[x];i<=bl;++i) qz_a_1[i]+=y;
  63. for(i=x;i<=Rr[bel[x]];++i) qz_a_2[i]+=y;
  64. for(i=1;i<=bl;++i) sum_f[i]+=1ll*y*K[x][i];
  65. A[x]+=y;
  66. }
  67. if(opt==2)
  68. {
  69. ll ans=0;
  70. if(bel[x]==bel[y]) for(i=x;i<=y;++i) ans+=cal(R[i])-cal(L[i]-1);
  71. else
  72. {
  73. for(i=bel[x]+1;i<=bel[y]-1;++i) ans+=sum_f[i];
  74. for(i=x;i<=Rr[bel[x]];++i) ans+=cal(R[i])-cal(L[i]-1);
  75. for(i=Ll[bel[y]];i<=y;++i) ans+=cal(R[i])-cal(L[i]-1);
  76. }
  77. printf("%lld\n",ans);
  78. }
  79. }
  80. #undef cal
  81. return 0;
  82. }
  1. /*
  2. 每条边都有一个存在时间[l,r],每个询问相当于求一个时刻的答案
  3. 可以用线段树分治来维护
  4. 要支持操作是可逆的,所以采用按秩合并的dsu
  5. 2019/3/21 by pac
  6. */
  7. #include<bits/stdc++.h>
  8. #define ll long long
  9. #define max(a,b) ((a)>(b)?(a):(b))
  10. #define min(a,b) ((a)<(b)?(a):(b))
  11. inline int read()
  12. {
  13. int x=0,f=1;char ch=getchar();
  14. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  15. while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
  16. return x*f;
  17. }
  18. #define reg register
  19. const int MN=7e4+5;
  20. int N,M,ans[MN];
  21. std::vector<int>id[MN];
  22. struct edge{int u,v,nex,l,r;}e[MN<<1];int en,hr[MN];
  23. void ins(int f,int t,int l,int r)
  24. {
  25. e[++en]=(edge){f,t,hr[f],l,r};hr[f]=en;
  26. e[++en]=(edge){t,f,hr[t],l,r};hr[t]=en;
  27. }
  28. class LCA
  29. {
  30. int siz[MN],fa[MN],mx[MN],top[MN],dep[MN];
  31. void dfs1(int x,int f)
  32. {
  33. dep[x]=dep[f]+1;fa[x]=f;siz[x]=1;reg int i;
  34. for(i=hr[x];i;i=e[i].nex)if(e[i].v^f)
  35. dfs1(e[i].v,x),siz[x]+=siz[e[i].v],siz[e[i].v]>siz[mx[x]]?mx[x]=e[i].v:0;
  36. }
  37. void dfs2(int x,int f,int tp)
  38. {
  39. top[x]=tp;if(mx[x])dfs2(mx[x],x,tp);reg int i;
  40. for(i=hr[x];i;i=e[i].nex)if((e[i].v^f)&&(e[i].v^mx[x]))
  41. dfs2(e[i].v,x,e[i].v);
  42. }
  43. public:
  44. void init(){dfs1(1,0);dfs2(1,0,1);}
  45. int dis(int x,int y)
  46. {
  47. if(!x||!y) return 0;
  48. int r=dep[x]+dep[y];
  49. for(;top[x]^top[y];) dep[top[x]]>dep[top[y]]?x=fa[top[x]]:y=fa[top[y]];
  50. return r-2ll*min(dep[x],dep[y]);
  51. }
  52. }T;
  53. struct Ans
  54. {
  55. int dl,dr,len;
  56. Ans Max(const Ans &o,const Ans &oo){return o.len>oo.len?o:oo;}
  57. Ans operator *(const Ans &o)
  58. {
  59. Ans r=Max(*this,o);
  60. r=Max(r,(Ans){dl,o.dl,T.dis(dl,o.dl)});
  61. r=Max(r,(Ans){dl,o.dr,T.dis(dl,o.dr)});
  62. r=Max(r,(Ans){dr,o.dl,T.dis(dr,o.dl)});
  63. r=Max(r,(Ans){dr,o.dr,T.dis(dr,o.dr)});
  64. return r;
  65. }
  66. };
  67. class DSU
  68. {
  69. Ans bl[MN],st_ori[MN];
  70. int fa[MN],siz[MN],tp,st_l[MN],st_r[MN],ans;
  71. int getf(int x){return x==fa[x]?x:getf(fa[x]);}
  72. public:
  73. void init()
  74. {
  75. tp=0;ans=0;reg int i;
  76. for(i=1;i<=N;++i) fa[i]=i,siz[i]=1,bl[i]=(Ans){i,i,0};
  77. }
  78. void union_(int x,int y)
  79. {
  80. //if(getf(x)==19&&getf(y)==4) printf("%d %d\n",x,y);
  81. x=getf(x);y=getf(y);
  82. //printf("combine %d %d\n",x,y);
  83. if(x==y) return;
  84. if(siz[x]<siz[y]) std::swap(x,y);
  85. siz[x]+=siz[y];st_l[++tp]=x;st_r[tp]=y;
  86. fa[y]=x;st_ori[tp]=bl[x];bl[x]=bl[x]*bl[y];
  87. ans=max(ans,bl[x].len);
  88. //if(x==19&&bl[x].len==3) printf("find %d %d\n",y,bl[y].len);
  89. }
  90. void getori(int to,int p)
  91. {
  92. reg int l,r;
  93. for(;tp>to;--tp)
  94. {
  95. l=st_l[tp],r=st_r[tp];
  96. // printf("break %d %d\n",l,r);
  97. siz[l]-=siz[r];fa[r]=r;
  98. bl[l]=st_ori[tp];
  99. }
  100. ans=p;
  101. }
  102. int Tp(){return tp;}
  103. int ANs(){return ans;}
  104. // void print()
  105. // {
  106. // printf("Ans=%d\n",ans);
  107. // for(int i=1;i<=20;++i) printf("%d: %d\n",i,bl[i].len);
  108. // }
  109. }dsu;
  110. std::vector<int> T_ed[MN<<2];
  111. void Md(int k,int l,int r,int a,int b)
  112. {
  113. if(l==a&&r==b){T_ed[k].push_back(en);return;}
  114. int mid=(l+r)>>1;
  115. if(b<=mid) Md(k<<1,l,mid,a,b);
  116. else if(a>mid) Md(k<<1|1,mid+1,r,a,b);
  117. else Md(k<<1,l,mid,a,mid),Md(k<<1|1,mid+1,r,mid+1,b);
  118. }
  119. void Solve(int x,int l,int r)
  120. {
  121. reg int pre=dsu.Tp(),i,res=dsu.ANs();
  122. for(i=T_ed[x].size()-1;~i;--i){dsu.union_(e[T_ed[x][i]].u,e[T_ed[x][i]].v);}
  123. if(l==r)
  124. {
  125. // if(l==15) dsu.print();
  126. for(i=id[l].size()-1;~i;--i) ans[id[l][i]]=dsu.ANs();
  127. }
  128. if(l!=r)
  129. {
  130. reg int mid=(l+r)>>1;
  131. Solve(x<<1,l,mid);Solve(x<<1|1,mid+1,r);
  132. }
  133. dsu.getori(pre,res);
  134. }
  135. int main()
  136. {
  137. // freopen("racing1.in","r",stdin);
  138. // freopen("racing1.out","w",stdout);
  139. N=read();M=read();
  140. register int i,x,y,l,r;
  141. for(i=1;i<N;++i)
  142. {
  143. x=read(),y=read();l=read(),r=read();
  144. ins(x,y,l,r);Md(1,1,N,l,r);
  145. // printf("%d %d %d %d\n",x,y,l,e[en].r);
  146. }
  147. for(i=1;i<=M;++i) id[read()].push_back(i);
  148. T.init();dsu.init();Solve(1,1,N);
  149. for(i=1;i<=M;++i) printf("%d\n",ans[i]);
  150. }

Blog来自PaperCloud,未经允许,请勿转载,TKS!

FCS省选模拟赛 Day4的更多相关文章

  1. FCS省选模拟赛 Day1

    Description  Solution T1 shopping 目测是插板法乱搞一下 发现题解写的是容斥dp: \[ ans = \sum_i (-1)^ig[i] \] \(g[i]\)表示的有 ...

  2. FCS省选模拟赛 Day7

    Description  Solution T1 island 考虑把问题成两部分计算 纵坐标的距离和很好计算,在输入的同时一次计算了就完事 横坐标又分成两部分 分别在\(y\)轴不同侧的矩形的距离和 ...

  3. FCS省选模拟赛 Day3

    Description  Solution T1 game 咕咕咕 T2 string fail树各个节点的深度之和怎么求? 我们考虑每个前缀的深度是什么 发现这个值就相当于有多少个前缀等于它的后缀 ...

  4. FCS省选模拟赛 Day5

    传送门 Solution Code  #include<bits/stdc++.h> #define ll long long #define max(a,b) ((a)>(b)?( ...

  5. 省选模拟赛day4

    怎么说?发现自己越来越菜了 到了不写题解写不出来题目的地步了.. 这次题目我都有认真思考 尽管思考的时候状态不太好 但是 我想 再多给我时间也思考不出来什么吧 所以写一份题解. T1 n个点的有根树 ...

  6. 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解

    今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...

  7. @省选模拟赛03/16 - T3@ 超级树

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 一棵 k-超级树(k-SuperTree) 可按如下方法得到:取 ...

  8. 3.28 省选模拟赛 染色 LCT+线段树

    发现和SDOI2017树点涂色差不多 但是当时这道题模拟赛的时候不会写 赛后也没及时订正 所以这场模拟赛的这道题虽然秒想到了LCT和线段树但是最终还是只是打了暴力. 痛定思痛 还是要把这道题给补了. ...

  9. 省选模拟赛第四轮 B——O(n^4)->O(n^3)->O(n^2)

    一 稍微转化一下,就是找所有和原树差距不超过k的不同构树的个数 一个挺trick的想法是: 由于矩阵树定理的行列式的值是把邻接矩阵数值看做边权的图的所有生成树的边权乘积之和 那么如果把不存在于原树中的 ...

随机推荐

  1. Unity - Profiler参数详解

    CPU Usage ​       ● GC Alloc - 记录了游戏运行时代码产生的堆内存分配.这会导致ManagedHeap增大,加速GC的到来.我们要尽可能避免不必要的堆内存分配,同时注意:1 ...

  2. 结合模板导出PDF文件

    @Action("report_exportJasperPdf")    public String exportJasperPdf() throws Exception{     ...

  3. 【iOS】去除字符串首尾空格或某字符

    在iOS的实际开发中,常会出现需要去除空格的情况,总结有三种情况: 去除字符串首尾连续字符(如空格): 去除字符串首部连续字符(如空格): 去除字符串尾部连续字符(如空格): 去除字符串首尾连续字符( ...

  4. Winform开发1

    VS的Winform开发中,TextBox可能拖过来的时候不能改变其高度,这就要在其属性Multiline为True.

  5. Linux 绑定 ttyUSBn 串口方法。

    Linux 绑定 ttyUSBn 串口方法. 在linux下, 使用usb转串口, 经常会碰到一个问题: 如果有多个串口, 以不同顺序插入的时候, /dev/ttyUSB0 /dev/ttyUSB1的 ...

  6. python中 "is"和"=="的区别

    python中"is"和"=="区别 在做leetcode的时候,在判断两个数据是否相等时使用了python中的is not,想着入乡随俗,既然入了python ...

  7. (Linux基础学习)第七章:echo命令

    第1节:简单说明功能:显示字符语法:echo [-neE][字符串]说明:echo会将输入的字符串送往标准输出.输出的字符串之间以空白字符隔开,并在最后加上换行号选项:-E(默认)不支持\解释功能-n ...

  8. vue input只允许输入数字

    template: <input type="text" v-model="pageIndex" @keyup="inputChange&quo ...

  9. Redis面试基本问题

    Redis有哪些数据结构? 字符串String.字典Hash.列表List.集合Set.有序集合SortedSet.如果你是Redis中高级用户,还需要加上下面几种数据结构HyperLogLog.Ge ...

  10. 题解 UVa11889

    题目大意 \(T\) 组数据,每组数据给定两个正整数 \(A,C\),求使 \(LCM(A,B)=C\) 的最小的 \(B\),若无解则输出NO SOLUTION. 分析 当 \(C\%A=0\) 时 ...