模拟赛

  今天第一节课是历史,当然是不可能上的,一来到机房发现今天高二考试...

  老师说以后可能还要给高一考...那还不如现在跟着做好了,毕竟在学长学姐中垫底显得没那么丢人

  这套题风格挺奇怪的...为什么前面还是神牛后面直接成牛了...

  T1:http://hzwer.com/5053.html

  题意概述:给出一个长度为$n$的数列,从某个地方把它分成两部分(均不为空),从前半部分选出一些数,后半部分选出一些数,使得前面这些数的$xor$和等于后面的$and$和,求方案数. $n<=10^3,0<=a_i<1024$

  差点被题意杀,其实这个分割点只是限制前后分组顺序的,分割点不同但前后选的人均相同时视为不同的方案.选的人都相同但是分组不同,如$([2,2,3],[3]),([2],[2,2,3])$也算两种方案.

  明确了题意就好做多了.可以发现数据范围并不是很大,所以可以枚举断点求方案数.又发现数据范围真的不是很大,所以也可以枚举$xor$和.又发现...再枚举真要超时了.

  枚举了这些之后就只需要求出前$i$个中选出一些数使得$xor$和为$x$的方案数,后$i$个中选出一些数使得$and$和为$x$的方案数.这样就比较简单啦!随便$dp$转移一下就行.不过有可能会出现重复方案,对于这个问题固定第一个区间的右端点必选即可.

  

  1. # include <cstdio>
  2. # include <iostream>
  3. # include <queue>
  4. # include <cstring>
  5. # include <string>
  6. # define R register int
  7. # define ll long long
  8. # define mod
  9.  
  10. using namespace std;
  11.  
  12. const int maxn=;
  13. int n,m;
  14. int a[maxn],xorr[maxn][],andd[maxn][],ans;
  15.  
  16. int main()
  17. {
  18. scanf("%d",&n);
  19. for (R i=;i<=n;++i)
  20. scanf("%d",&a[i]),m=max(m,a[i]);
  21. for (R i=;i<=n;++i)
  22. {
  23. xorr[i][ a[i] ]=;
  24. for (R j=;j<=m;++j)
  25. xorr[i][ a[i]^j ]=(xorr[i][ a[i]^j ]+xorr[i-][j])%mod;
  26. for (R j=;j<=m;++j)
  27. xorr[i][j]=(xorr[i][j]+xorr[i-][j])%mod;
  28. }
  29. for (R i=n;i>=;--i)
  30. {
  31. andd[i][ a[i] ]=;
  32. for (R j=;j<=m;++j)
  33. andd[i][ a[i]&j ]=(andd[i][ a[i]&j ]+andd[i+][j])%mod;
  34. for (R j=;j<=m;++j)
  35. andd[i][j]=(andd[i][j]+andd[i+][j])%mod;
  36. }
  37. for (R i=;i<n;++i)
  38. for (R j=;j<=m;++j)
  39. ans=(1LL*(xorr[i][j]-xorr[i-][j]+mod)*andd[i+][j]%mod+ans)%mod;
  40. printf("%d",ans);
  41. fclose(stdin);
  42. fclose(stdout);
  43. return ;
  44. }

T1

  T2:http://hzwer.com/5042.html

  题意概述:一个长度为$n$的序列,每个数的取值是$0-L$,求有多少种取值方案使得可以从这些数中取出一些数,且和为$k$.$n,k<=20,L<=10^9$

  看起来挺像组合数学的,毕竟$l$非常大,好像只能用非常快的算法.首先用插板法算出把$k$个数分成$1->n$份的方案数,然后把这些数再组合数一番放进$n$个位置中,其他位置从$[1,L]$中任意取即可.听起来非常好,然而是不是有点太快了?如果真是这么做的话完全可以把$n,k$都放大一百倍,手玩一组发现这个做法会重复...而且我几乎不会容斥.

  突然想到某一个讲座的时候:"我就打了$6$个$dp$,就……",其实这道题的$dp$思路不是特别难想,一开始想的是$dp[i][j]$表示前$i$个数,拼出来的数最大是$j$的方案数,这种方程特别好转移,然而一点实际意义也没有...所以能拼出来的数必须全表示出来,$dp[i][j]$表示前$i$个数,能拼出来的数的状态是$j$的方案数.转移的时候枚举上一位的状态以及这一位填什么即可.停!$L$不是$10^9$吗?其实我们只关心能不能拼出$k$,所以大于$k$的数对于状态是没有贡献的,这一部分直接乘起来就可以了.

  

  注意...虽然$l$的范围非常大,$k$的范围非常小,但是这并不能说明$l<k$,转移的时候不能直接转移到$k$,而是$min(k,l)$,因为这个丢了$20$分,伤心.

  对了,别忘了开滚动数组.

  

  1. # include <cstdio>
  2. # include <iostream>
  3. # include <queue>
  4. # include <cstring>
  5. # include <string>
  6. # define R register int
  7. # define ll long long
  8. # define mod
  9.  
  10. using namespace std;
  11.  
  12. const int maxn=;
  13. int n,k,l,vis[],viss[],maxz;
  14. int dp[][maxn];
  15. ll ans=;
  16.  
  17. int main()
  18. {
  19. scanf("%d%d%d",&n,&k,&l);
  20. maxz=(<<(k+))-;
  21. dp[][]=;
  22. for (R i=;i<n;++i)
  23. {
  24. int las=i&;
  25. int now=las^;
  26. memset(dp[now],,sizeof(dp[now]));
  27. for (R z=;z<=maxz;++z)
  28. {
  29. if(i==&&z==)
  30. i=;
  31. if(!dp[las][z]) continue;
  32. vis[]=true;
  33. int t=z;
  34. for (R x=;x<=k;++x)
  35. vis[x]=t%,t/=;
  36. for (R x=;x<=k;++x)
  37. {
  38. if(x>l) break;
  39. for (R j=;j<=k;++j) viss[j]=vis[j];
  40. for (R j=;j<=k;++j) if(vis[j]) viss[j+x]=true;
  41. int nexz=;
  42. for (R j=k;j>=;--j)
  43. nexz=nexz*+viss[j];
  44. dp[now][nexz]=(dp[now][nexz]+dp[las][z])%mod;
  45. }
  46. if(l>k) dp[now][z]=(dp[now][z]+1LL*dp[las][z]*(l-k)%mod)%mod;
  47. }
  48. }
  49. for (R i=;i<=maxz;++i)
  50. if(i&(<<(k-)))
  51. ans=(ans+dp[n&][i])%mod;
  52. printf("%lld",ans);
  53. return ;
  54. }

T2

  T3:一个数据范围消失了的分层图最短路...因为没有数据范围于是直接选择性失明不管那个限制了,竟然水了$70$...事实上因为限制点的数量非常小,直接$dfs$即可.

  

  1. # include <cstdio>
  2. # include <iostream>
  3. # include <cstring>
  4. # include <queue>
  5. # include <string>
  6. # define inf
  7. # define R register int
  8.  
  9. using namespace std;
  10.  
  11. const int dx[]={-,,,};
  12. const int dy[]={,,-,};
  13. const int maxn=;
  14. char st[];
  15. int n,m,ans=-,bx,by,ex,ey;
  16. int g[maxn][maxn],sx[],sy[],h;
  17. int vis[maxn][maxn][];
  18. struct z
  19. {
  20. int val,x,y,k;
  21. };
  22. queue <z> q;
  23.  
  24. bool mw (int x,int y,int k,int d)
  25. {
  26. int xx=x+dx[d];
  27. int yy=y+dy[d];
  28. if(xx<=||xx>n||yy<=||yy>n) return false;
  29. if(g[xx][yy]==-) return false;
  30. return true;
  31. }
  32.  
  33. int dij (int ext)
  34. {
  35. memset(vis,-,sizeof(vis));
  36. while (q.size()) q.pop();
  37. int x,y,k,xx,yy;
  38. z a,b;
  39. a.x=bx;
  40. a.y=by;
  41. a.val=;
  42. a.k=;
  43. q.push(a);
  44. vis[ a.x ][ a.y ][]=;
  45. while (q.size())
  46. {
  47. a=q.front();
  48. q.pop();
  49. x=a.x;
  50. y=a.y;
  51. k=a.k;
  52. for (R d=;d<;++d)
  53. {
  54. if(!mw(x,y,k,d)) continue;
  55. xx=x+dx[d];
  56. yy=y+dy[d];
  57. b.x=xx;
  58. b.y=yy;
  59. if(g[xx][yy]==k+) b.k=k+;
  60. else b.k=k;
  61. b.val=a.val+;
  62. if(vis[xx][yy][b.k]!=-) continue;
  63. vis[xx][yy][b.k]=b.val;
  64. q.push(b);
  65. }
  66. }
  67. if(vis[ex][ey][m]!=-) return vis[ex][ey][m]+ext;
  68. return -;
  69. }
  70.  
  71. void dfs (int x,int ext)
  72. {
  73. if(x==h+)
  74. {
  75. int t=dij(ext);
  76. if(ans==-) ans=t;
  77. if(t!=-) ans=min(ans,t);
  78. }
  79. else
  80. {
  81. g[ sx[x] ][ sy[x] ]=-;
  82. dfs(x+,ext);
  83. g[ sx[x] ][ sy[x] ]=;
  84. dfs(x+,ext+);
  85. }
  86. }
  87.  
  88. int main()
  89. {
  90. scanf("%d%d",&n,&m);
  91. memset(vis,,sizeof(vis));
  92. for (R i=;i<=n;++i)
  93. {
  94. scanf("%s",st+);
  95. for (R j=;j<=n;++j)
  96. {
  97. if(st[j]=='T') ex=i,ey=j;
  98. else if(st[j]=='K') bx=i,by=j;
  99. else if(st[j]=='#') g[i][j]=-;
  100. else if(st[j]=='.') g[i][j]=;
  101. else if(st[j]=='S') sx[++h]=i,sy[h]=j;
  102. else g[i][j]=st[j]-'';
  103. }
  104. }
  105. dfs(,);
  106. if(ans!=-)
  107. printf("%d",ans);
  108. else
  109. printf("impossible");
  110. return ;
  111. }

T3

---shzr

NOIP模拟赛-2018.10.22的更多相关文章

  1. NOIP模拟赛-2018.11.7

    NOIP模拟赛 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 编译之前另存一份,听说如果敲 ...

  2. NOIP模拟赛-2018.11.6

    NOIP模拟赛 今天想着反正高一高二都要考试,那么干脆跟着高二考吧,因为高二的比赛更有技术含量(我自己带的键盘放在这里). 今天考了一套英文题?发现阅读理解还是有一些困难的. T1:有$n$个点,$m ...

  3. NOIP模拟赛-2018.11.5

    NOIP模拟赛 好像最近每天都会有模拟赛了.今天从高二逃考试跑到高一机房,然而高一也要考试,这回好像没有拒绝的理由了. 今天的模拟赛好像很有技术含量的感觉. T1:xgy断句. 好诡异的题目,首先给出 ...

  4. NOIP模拟赛 17.10.10

    初次见面(firstmeet)[题目背景]雾之湖边,静得可怕.露米娅出神凝望.黑白连衣裙,像极了绽放的墨黑和洁白的莲.身边的雾之湖,倒映着血色天空.酒红的双眸,映照一切.低声浅笑,双臂伸直,她悄无声息 ...

  5. noip模拟赛(10.4) 背包(pack)

    [题目描述] 蛤布斯有n种商品,第i种物品的价格为ai,价值为bi.有m个人来向蛤布斯购买商品,每个人每种物品只能购买一个.第j个人有cj的钱,他会不停选择一个能买得起的价格最高的商品买走(如果有多个 ...

  6. noip模拟赛(10.4) 序列(sequence)

    序列(sequence) [题目描述] 给定一个1~n的排列x,每次你可以将x1~xi翻转.你需要求出将序列变为升序的最小操作次数.有多组数据. [输入数据] 第一行一个整数t表示数据组数. 每组数据 ...

  7. noip模拟赛(10.4) 字典序(dictionary)

    [题目描述] 你需要构造一个1~n的排列,使得它满足m个条件,每个条件形如(ai,bi),表示ai必须在bi前面.在此基础上,你需要使它的字典序最小. [输入数据] 第一行两个正整数n,m.接下来m行 ...

  8. 水(NOIP模拟赛Round #10)

    题目描述: 小Z有一个长度为的数列.他有次令人窒息的操作,每次操作可以使某个数字或.他当然是希望这些数字的乘积尽量小了.为了简化题目,你只需输出操作完成后的数列即可. ———————————————— ...

  9. 题(NOIP模拟赛Round #10)

    题目描述: 有一张的地图,其中的地方是墙,的地方是路.有两种操作: 给出个地点,询问这个地点中活动空间最大的编号.若询问的位置是墙,则活动空间为:否则活动空间为询问地点通过四联通能到达的点的个数.如果 ...

随机推荐

  1. abp运行机制分析

    abp运行流程 由于公司现在大量向abp框架+react前后端分离架构转型,所以有必要分析abp框架是如何在iis运行的,所以才有这篇文章 public class MvcApplication : ...

  2. PHP语法-该注意的细节

    php in_array(mixed $needle, array $haystack[, bool $strict = FALSE] ) 注意: 一.如果$needle 是字符串,则比较是区分大小写 ...

  3. Java - List总结

    Java提高篇(三二)-----List总结 前面LZ已经充分介绍了有关于List接口的大部分知识,如ArrayList.LinkedList.Vector.Stack,通过这几个知识点可以对List ...

  4. Android组件化搭建

    什么是组件化 为了降低项目耦合性,在Android工程中如何实施,目前有两种途径,也是两大流派,一个是组件化,一个是插件化.在这里只介绍组件化,插件化暂不介绍 正常的APP只有一个applicatio ...

  5. nginx配置https转发到tomcat(使用自签名的证书)

    一.使用openSSL生成自签名的证书 1.生成RSA私钥 命令:openssl genrsa -des3 -out server.key 1024 说明:生成rsa私钥,des3算法,1024强度, ...

  6. 正则表达式 ?P<name>

    import re # 将匹配的数字乘以 2 def double(matched): value = int(matched.group('value')) return str(value * 2 ...

  7. Parcel + Vue 2.x 极速零配置打包体验

    继 Browserify.Webpack 之后,又一款打包工具 Parcel 横空出世 Parcel.js 的官网有这样的自我介绍 “极速零配置Web应用打包工具” 简单接触了一下,单从效率上来说,确 ...

  8. ThinkPHP5微信扫码支付

    1.把微信官网下载的demo放在根目录/vendor/目录下,这里我的是/vendor/wxpay_pc目录 2.把cert里面的文件替换成自己项目的证书(登陆微信商户平台,账户中心,API安全下载) ...

  9. webpack中mainifest.js vendor.js app.js 三者的区别

    场景: 大家在利用构建工具进行应用最后的打包过程中,我们希望做到的是将业务代码和第三方引用模块代码分开打包. 因为第三方引用模块代码通常很大,而且在不引入新的模块之前基本上是不会变动的.所以我们需要将 ...

  10. hadoop完全分布式的安装

    下载地址: centos 7.5 下载地址 清华 http://mirrors.tuna.tsinghua.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-DV ...