BZOJ4513 储能表

数位DP,f[i][2][2][2]表示前i位,是否卡n的上界,是否卡m的上界,是否卡k的下界,枚举每一维的下一位直接转移。

  1. #include<cstdio>
  2. #include<cstring>
  3. typedef unsigned u32;
  4. typedef long long ll;
  5. ll x,y,z;
  6. int p,q;
  7. u32 f[61][2][2][2][2];
  8. int main(){
  9. scanf("%d",&q);
  10. while(q--){
  11. scanf("%lld%lld%lld%d",&x,&y,&z,&p);
  12. memset(f,0,sizeof f);
  13. f[60][1][1][1][0]=1;
  14. for(int i=59;~i;--i)
  15. for(int j=1;~j;--j)
  16. for(int k=1;~k;--k)
  17. for(int l=1;~l;--l)
  18. for(int a=j?x>>i&1:1;~a;--a)
  19. for(int b=k?y>>i&1:1;~b;--b)
  20. if(!l||(z>>i&1)<=(a^b)){
  21. u32*s=f[i][j&(x>>i&1)==a][k&(y>>i&1)==b][l&(z>>i&1)==(a^b)],*t=f[i+1][j][k][l];
  22. (s[0]+=t[0])%=p,(s[1]+=t[1]*2+(a^b)*t[0])%=p;
  23. }
  24. printf("%lld\n",(1[****f]-z%p******f%p+p)%p);
  25. }
  26. }

BZOJ4514 数字配对

若$j$是$i$的倍数且$\Omega(j)-1=\Omega(i)$则$i$,$j$可以配对,其中$\Omega(i)$表示$i$的质因子指数和。按$\Omega(i)$的奇偶性建二分图,跑费用流。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const ll inf=-1e18;
  5. const int N=205;
  6. void eq1(int&a,int b){a=b<a?b:a;}
  7. struct edge{
  8. int v,c;ll w;edge*s;
  9. }e[N*N];
  10. edge*p=e,*h[N];
  11. void ins(int u,int v,ll w,int c){
  12. edge s={v,c,w,h[u]};
  13. edge t={u,0,-w,h[v]};
  14. *(h[u]=p++)=s;
  15. *(h[v]=p++)=t;
  16. }
  17. int n,s,t,q[N*N];
  18. typedef int arr[N];
  19. arr a,b,c,d,f,z;
  20. ll r[N];
  21. int dfs(int u,int c){
  22. if(u==t)return c;
  23. int f=0;
  24. for(edge*i=h[u];i;i=i->s)
  25. if(r[u]-i->w==r[i->v]&&d[u]-1==d[i->v]&&i->c){
  26. int j=dfs(i->v,min(c-f,i->c));
  27. i->c-=j,e[i-e^1].c+=j,f+=j;
  28. if(f==c)break;
  29. }
  30. if(!f)d[u]=-1;
  31. return f;
  32. }
  33. int spfa(){
  34. int f=0;
  35. ll c=0;
  36. while(1){
  37. fill(r+s,r+t,inf);
  38. q[0]=t;
  39. for(int a=0,b=0;a<=b;++a){
  40. int u=q[a];
  41. z[u]=0;
  42. for(edge*i=h[u];i;i=i->s)
  43. if(r[i->v]<r[u]-i->w&&e[i-e^1].c){
  44. r[i->v]=r[u]-i->w;
  45. d[i->v]=d[u]+1;
  46. if(!z[i->v]++)q[++b]=i->v;
  47. }
  48. }
  49. if(r[s]==inf)return f;
  50. while(1){
  51. int j=dfs(s,1e9);
  52. if(!j)break;
  53. if(r[s]<0&&c/-r[s]<=j){
  54. f+=c/-r[s],c%=-r[s];
  55. break;
  56. }
  57. f+=j,c+=j*r[s];
  58. }
  59. }
  60. }
  61. int main(){
  62. scanf("%d",&n),t=n+1;
  63. for(int i=1;i<=n;++i)
  64. scanf("%d",a+i);
  65. for(int i=1;i<=n;++i)
  66. scanf("%d",b+i);
  67. for(int i=1;i<=n;++i)
  68. scanf("%d",c+i);
  69. for(int i=1;i<=n;++i){
  70. int j=a[i];
  71. for(int d=2;d*d<=j;++d)
  72. for(;j%d==0;j/=d)++f[i];
  73. f[i]+=j!=1;
  74. }
  75. for(int i=1;i<=n;++i)
  76. if(f[i]&1){
  77. ins(s,i,0,b[i]);
  78. for(int j=1;j<=n;++j)
  79. if(abs(f[i]-f[j])==1&&max(a[i],a[j])%min(a[i],a[j])==0)
  80. ins(i,j,(ll)c[i]*c[j],1e9);
  81. }else
  82. ins(i,t,0,b[i]);
  83. printf("%d\n",spfa());
  84. }

BZOJ4515 游戏

哪个SB把李超线段树出到树上的……修改拆成两条链,设$t$是$s$的祖先,那么$x$上的数字为$a(d_s-d_x)+b$,所以可以统一插入斜率为$-a$,截距为$ad_s+b$的线段。

  1. #include<bits/stdc++.h>
  2. #define I (i+j+2>>1)
  3. #define J (i+j>>1)
  4. #define P (k<<1)
  5. #define S (k<<1^1)
  6. using namespace std;
  7. template<class T>
  8. void eq1(T&a,T b){a=b<a?b:a;}
  9. typedef long long ll;
  10. const int N=1e5+5;
  11. int n,n2;
  12. typedef int arr[N];
  13. arr d1,f1,f2,f3,f4,f5,f6;
  14. ll d2[N],z[N*4];
  15. struct tag{
  16. int s;ll t;
  17. ll operator()(int i){
  18. return s*d2[f6[i]]+t;
  19. }
  20. }c[N*4];
  21. void ins(tag f,int s,int t,int i,int j,int k){
  22. if(s<=i&&j<=t){
  23. if(i==j){
  24. if(f(i)<c[k](i))c[k]=f;
  25. }else
  26. if(f(i)<c[k](i))
  27. if(f(j)<c[k](j))c[k]=f;
  28. else
  29. if(f(J)>c[k](J))ins(f,s,t,i,J,P);
  30. else
  31. ins(c[k],s,t,I,j,S),c[k]=f;
  32. else
  33. if(f(j)<c[k](j))
  34. if(f(I)>c[k](I))ins(f,s,t,I,j,S);
  35. else
  36. ins(c[k],s,t,i,J,P),c[k]=f;
  37. eq1(z[k],c[k](i));
  38. eq1(z[k],c[k](j));
  39. }else{
  40. if(s<I)ins(f,s,t,i,J,P);
  41. if(t>J)ins(f,s,t,I,j,S);
  42. eq1(z[k],z[P]);
  43. eq1(z[k],z[S]);
  44. }
  45. }
  46. ll ask(int s,int t,int i,int j,int k){
  47. if(s==i&&j==t)return z[k];
  48. ll y=min(c[k](s),c[k](t));
  49. if(t<I)return min(y,ask(s,t,i,J,P));
  50. if(s>J)return min(y,ask(s,t,I,j,S));
  51. return min(y,min(ask(s,J,i,J,P),ask(I,t,I,j,S)));
  52. }
  53. struct edge{
  54. int v,w;edge*s;
  55. }e[N*2];
  56. edge*x=e,*h[N];
  57. void ins(int u,int v,int w){
  58. edge s={v,w,h[u]};
  59. *(h[u]=x++)=s;
  60. }
  61. void dfs1(int u){
  62. f1[u]=1;
  63. for(edge*i=h[u];i;i=i->s)
  64. if(i->v!=f2[u]){
  65. f2[i->v]=u,d1[i->v]=d1[u]+1,d2[i->v]=d2[u]+i->w;
  66. dfs1(i->v);
  67. f1[u]+=f1[i->v];
  68. if(f1[i->v]>f1[f3[u]])
  69. f3[u]=i->v;
  70. }
  71. }
  72. void dfs2(int u,int v){
  73. f4[f6[f5[u]=++n2]=u]=v;
  74. if(f3[u])dfs2(f3[u],v);
  75. for(edge*i=h[u];i;i=i->s)
  76. if(i->v!=f2[u]&&i->v!=f3[u])
  77. dfs2(i->v,i->v);
  78. }
  79. int lca(int s,int t){
  80. while(f4[s]!=f4[t]){
  81. if(d1[f4[s]]<d1[f4[t]])swap(s,t);
  82. s=f2[f4[s]];
  83. }
  84. return d1[s]<d1[t]?s:t;
  85. }
  86. void ins(tag f,int s,int t){
  87. while(f4[s]!=f4[t]){
  88. ins(f,f5[f4[s]],f5[s],1,n,1);
  89. s=f2[f4[s]];
  90. }
  91. ins(f,f5[t],f5[s],1,n,1);
  92. }
  93. int main(){
  94. int m,w,u,v,s,t;
  95. scanf("%d%d",&n,&m);
  96. for(int i=2;i<=n;++i){
  97. scanf("%d%d%d",&u,&v,&w);
  98. ins(u,v,w),ins(v,u,w);
  99. }
  100. dfs1(1),dfs2(1,1);
  101. for(int i=1;i<N*4;++i)
  102. c[i].t=z[i]=123456789123456789;
  103. while(m--){
  104. scanf("%d%d%d",&w,&s,&t);
  105. if(w==1){
  106. scanf("%d%d",&u,&v);
  107. int l=lca(s,t);
  108. tag f1={-u,u*d2[s]+v},f2={u,u*d2[s]-u*d2[l]*2+v};
  109. ins(f1,s,l);
  110. ins(f2,t,l);
  111. }else{
  112. ll y=1e18;
  113. while(f4[s]!=f4[t]){
  114. if(d1[f4[s]]<d1[f4[t]])
  115. swap(s,t);
  116. y=min(y,ask(f5[f4[s]],f5[s],1,n,1));
  117. s=f2[f4[s]];
  118. }
  119. if(d1[s]<d1[t])swap(s,t);
  120. y=min(y,ask(f5[t],f5[s],1,n,1));
  121. printf("%lld\n",y);
  122. }
  123. }
  124. }

BZOJ4516 生成魔咒

BZOJ4517 排列计数

裸的错排……

  1. #include<cstdio>
  2. typedef long long ll;
  3. const int p=1e9+7;
  4. const int N=1e6+5;
  5. int q,n,m;
  6. ll f1[N],f2[N],f3[N],f4[N];
  7. int main(){
  8. f1[1]=f2[0]=f3[0]=f4[0]=1;
  9. for(int i=2;i<N;++i)
  10. f1[i]=f1[p%i]*(p-p/i)%p,f4[i]=(i-1)*(f4[i-1]+f4[i-2])%p;
  11. for(int i=1;i<N;++i)
  12. f2[i]=f2[i-1]*i%p,f3[i]=f3[i-1]*f1[i]%p;
  13. scanf("%d",&q);
  14. while(q--){
  15. scanf("%d%d",&n,&m);
  16. printf("%d\n",f2[n]*f3[m]%p*f3[n-m]%p*f4[n-m]%p);
  17. }
  18. }

BZOJ4518 征途

斜率优化,设$s$为前缀和,容易推出$f_j+(m+1)s_j^2=2ms_is_j+f_i-(m-1)s_i^2$,横坐标和斜率都单调,单调队列维护即可。

  1. #include<cstdio>
  2. typedef long long ll;
  3. const int N=3005;
  4. int n,m,a,b,q[N];
  5. ll s[N],f[N],g[N];
  6. double cal1(int i,int j){
  7. return(f[i]-f[j]+(m+1)*(s[i]*s[i]-s[j]*s[j]))/1./(s[i]-s[j]);
  8. }
  9. ll cal2(int j,int i){
  10. return f[j]+(m-1)*s[i]*s[i]+(m+1)*s[j]*s[j]-m*s[i]*s[j]*2;
  11. }
  12. int main(){
  13. scanf("%d%d",&n,&m);
  14. for(int i=1;i<=n;++i)
  15. scanf("%lld",s+i),s[i]+=s[i-1],f[i]=1e18;
  16. for(int z=1;z<=m;++z){
  17. q[a=b=0]=z-1;
  18. for(int i=z;i<=n;++i){
  19. while(a<b&&cal2(q[a],i)>cal2(q[a+1],i))
  20. ++a;
  21. g[i]=cal2(q[a],i);
  22. while(a<b&&cal1(q[b],i)<cal1(q[b-1],i))
  23. --b;
  24. q[++b]=i;
  25. }
  26. for(int i=z;i<=n;++i)
  27. f[i]=g[i];
  28. }
  29. printf("%lld\n",f[n]);
  30. }

SDOI2016 Round1 题解的更多相关文章

  1. cogs2223 [SDOI2016 Round1] 生成魔咒

    cogs2223 [SDOI2016 Round1] 生成魔咒 原题链接 题解 暴力:每次更新后缀数组??? set+二分+hash暴力 http://paste.ubuntu.com/2549629 ...

  2. [SDOI2016 Round1] 数字配对

    COGS 2221. [SDOI2016 Round1] 数字配对 http://www.cogs.pro/cogs/problem/problem.php?pid=2221 ★★★   输入文件:m ...

  3. [SDOI2016 Round1] 征途[斜率优化]

    2225. [SDOI2016 Round1] 征途 ★★★☆   输入文件:menci_journey.in   输出文件:menci_journey.out   简单对比时间限制:1 s   内存 ...

  4. ZROI WC Round1 题解

    ZROI WC Round1 题解 Problem A 题意 一个 \(n \times m\) 格子图,一个人从左上角出发,每次向右或者向下走一格,方法如下: 如果他在最下面一排,那么他会往右行走. ...

  5. Cogs 2221. [SDOI2016 Round1] 数字配对(二分图)

    [SDOI2016 Round1] 数字配对 ★★★ 输入文件:menci_pair.in 输出文件:menci_pair.out 简单对比 时间限制:1 s 内存限制:128 MB [题目描述] 有 ...

  6. 搜索(四分树):BZOJ 4513 [SDOI2016 Round1] 储能表

    4513: [Sdoi2016]储能表 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 395  Solved: 213[Submit][Status] ...

  7. cogs 2223. [SDOI2016 Round1] 生成魔咒

    ★★☆ 输入文件:menci_incantation.in 输出文件:menci_incantation.out 简单对比 时间限制:1 s 内存限制:128 MB [题目描述]魔咒串由许多魔咒字符组 ...

  8. cogs 2221. [SDOI2016 Round1] 数字配对

    ★★ 输入文件:pair.in 输出文件:pair.out 简单对比 时间限制:1 s 内存限制:128 MB [题目描述] 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两 ...

  9. SDOI2016 round1滚粗记

    Day -1 刚刚从HN集训回来,感觉整个人萌萌哒.考前不断立flag——这次我一定会滚粗的,然后设想着滚粗之后文化课先补什么,浑浑噩噩的过了一天,晚上看到CA爷(娘)发了关于cena爆栈的问题,这时 ...

随机推荐

  1. koa2 从入门到进阶之路 (一)

    首先我们先来了解一下 Koa 是什么,https://koa.bootcss.com/,这是 Koa 的官方网站,映入眼帘的第一句就是 Koa -- 基于 Node.js 平台的下一代 web 开发框 ...

  2. P1339 热浪Heat Wave 洛谷

    https://www.luogu.org/problem/show?pid=1339 题目描述 The good folks in Texas are having a heatwave this ...

  3. codevs——1690 开关灯

    1690 开关灯 USACO  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description YYX家门前的街上有N( ...

  4. eclipse软件安装及python工程建立

    原文地址:http://www.cnblogs.com/halfacre/archive/2012/07/22/2603848.html 安装python解释器 安装PyDev: 首先需要去Eclip ...

  5. LCA rmq st model

    LCA:倍增 memset(p,-,sizeof(p)); inline void dfs(int u) { ;i=e[i].next) { int v=e[i].v; ) { deep[v]=dee ...

  6. springboot主要注解及其作用

    1.注解(annotations)列表 @SpringBootApplication:包含了@ComponentScan.@Configuration和@EnableAutoConfiguration ...

  7. android 拍照预览

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools= ...

  8. 使用nginx转发不了静态文件

    从django runserver的请求来看,都收不到静态文件请求, 查看firefox的web console请求,发现都是403 然后发现nginx不在当前用户组,并且当前用户的项目的读写权限是7 ...

  9. linux字符设备驱动程序框架(老方法)

    #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #inclu ...

  10. 与linux相处的日子里

    在前几天装了一下linux操作系统,并安装了几个经常使用的工具.如今就谈谈我的感受吧! 对一个连linux几个字母都不会拼写的人来说.让我參与这个工作可谓是:"太残忍啦!"当然这在 ...