NOIP模拟赛-2018.10.22
模拟赛
今天第一节课是历史,当然是不可能上的,一来到机房发现今天高二考试...
老师说以后可能还要给高一考...那还不如现在跟着做好了,毕竟在学长学姐中垫底显得没那么丢人
这套题风格挺奇怪的...为什么前面还是神牛后面直接成牛了...
题意概述:给出一个长度为$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$转移一下就行.不过有可能会出现重复方案,对于这个问题固定第一个区间的右端点必选即可.
# include <cstdio>
# include <iostream>
# include <queue>
# include <cstring>
# include <string>
# define R register int
# define ll long long
# define mod using namespace std; const int maxn=;
int n,m;
int a[maxn],xorr[maxn][],andd[maxn][],ans; int main()
{
scanf("%d",&n);
for (R i=;i<=n;++i)
scanf("%d",&a[i]),m=max(m,a[i]);
for (R i=;i<=n;++i)
{
xorr[i][ a[i] ]=;
for (R j=;j<=m;++j)
xorr[i][ a[i]^j ]=(xorr[i][ a[i]^j ]+xorr[i-][j])%mod;
for (R j=;j<=m;++j)
xorr[i][j]=(xorr[i][j]+xorr[i-][j])%mod;
}
for (R i=n;i>=;--i)
{
andd[i][ a[i] ]=;
for (R j=;j<=m;++j)
andd[i][ a[i]&j ]=(andd[i][ a[i]&j ]+andd[i+][j])%mod;
for (R j=;j<=m;++j)
andd[i][j]=(andd[i][j]+andd[i+][j])%mod;
}
for (R i=;i<n;++i)
for (R j=;j<=m;++j)
ans=(1LL*(xorr[i][j]-xorr[i-][j]+mod)*andd[i+][j]%mod+ans)%mod;
printf("%d",ans);
fclose(stdin);
fclose(stdout);
return ;
}
T1
题意概述:一个长度为$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$分,伤心.
对了,别忘了开滚动数组.
# include <cstdio>
# include <iostream>
# include <queue>
# include <cstring>
# include <string>
# define R register int
# define ll long long
# define mod using namespace std; const int maxn=;
int n,k,l,vis[],viss[],maxz;
int dp[][maxn];
ll ans=; int main()
{
scanf("%d%d%d",&n,&k,&l);
maxz=(<<(k+))-;
dp[][]=;
for (R i=;i<n;++i)
{
int las=i&;
int now=las^;
memset(dp[now],,sizeof(dp[now]));
for (R z=;z<=maxz;++z)
{
if(i==&&z==)
i=;
if(!dp[las][z]) continue;
vis[]=true;
int t=z;
for (R x=;x<=k;++x)
vis[x]=t%,t/=;
for (R x=;x<=k;++x)
{
if(x>l) break;
for (R j=;j<=k;++j) viss[j]=vis[j];
for (R j=;j<=k;++j) if(vis[j]) viss[j+x]=true;
int nexz=;
for (R j=k;j>=;--j)
nexz=nexz*+viss[j];
dp[now][nexz]=(dp[now][nexz]+dp[las][z])%mod;
}
if(l>k) dp[now][z]=(dp[now][z]+1LL*dp[las][z]*(l-k)%mod)%mod;
}
}
for (R i=;i<=maxz;++i)
if(i&(<<(k-)))
ans=(ans+dp[n&][i])%mod;
printf("%lld",ans);
return ;
}
T2
T3:一个数据范围消失了的分层图最短路...因为没有数据范围于是直接选择性失明不管那个限制了,竟然水了$70$...事实上因为限制点的数量非常小,直接$dfs$即可.
# include <cstdio>
# include <iostream>
# include <cstring>
# include <queue>
# include <string>
# define inf
# define R register int using namespace std; const int dx[]={-,,,};
const int dy[]={,,-,};
const int maxn=;
char st[];
int n,m,ans=-,bx,by,ex,ey;
int g[maxn][maxn],sx[],sy[],h;
int vis[maxn][maxn][];
struct z
{
int val,x,y,k;
};
queue <z> q; bool mw (int x,int y,int k,int d)
{
int xx=x+dx[d];
int yy=y+dy[d];
if(xx<=||xx>n||yy<=||yy>n) return false;
if(g[xx][yy]==-) return false;
return true;
} int dij (int ext)
{
memset(vis,-,sizeof(vis));
while (q.size()) q.pop();
int x,y,k,xx,yy;
z a,b;
a.x=bx;
a.y=by;
a.val=;
a.k=;
q.push(a);
vis[ a.x ][ a.y ][]=;
while (q.size())
{
a=q.front();
q.pop();
x=a.x;
y=a.y;
k=a.k;
for (R d=;d<;++d)
{
if(!mw(x,y,k,d)) continue;
xx=x+dx[d];
yy=y+dy[d];
b.x=xx;
b.y=yy;
if(g[xx][yy]==k+) b.k=k+;
else b.k=k;
b.val=a.val+;
if(vis[xx][yy][b.k]!=-) continue;
vis[xx][yy][b.k]=b.val;
q.push(b);
}
}
if(vis[ex][ey][m]!=-) return vis[ex][ey][m]+ext;
return -;
} void dfs (int x,int ext)
{
if(x==h+)
{
int t=dij(ext);
if(ans==-) ans=t;
if(t!=-) ans=min(ans,t);
}
else
{
g[ sx[x] ][ sy[x] ]=-;
dfs(x+,ext);
g[ sx[x] ][ sy[x] ]=;
dfs(x+,ext+);
}
} int main()
{
scanf("%d%d",&n,&m);
memset(vis,,sizeof(vis));
for (R i=;i<=n;++i)
{
scanf("%s",st+);
for (R j=;j<=n;++j)
{
if(st[j]=='T') ex=i,ey=j;
else if(st[j]=='K') bx=i,by=j;
else if(st[j]=='#') g[i][j]=-;
else if(st[j]=='.') g[i][j]=;
else if(st[j]=='S') sx[++h]=i,sy[h]=j;
else g[i][j]=st[j]-'';
}
}
dfs(,);
if(ans!=-)
printf("%d",ans);
else
printf("impossible");
return ;
}
T3
---shzr
NOIP模拟赛-2018.10.22的更多相关文章
- NOIP模拟赛-2018.11.7
NOIP模拟赛 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 编译之前另存一份,听说如果敲 ...
- NOIP模拟赛-2018.11.6
NOIP模拟赛 今天想着反正高一高二都要考试,那么干脆跟着高二考吧,因为高二的比赛更有技术含量(我自己带的键盘放在这里). 今天考了一套英文题?发现阅读理解还是有一些困难的. T1:有$n$个点,$m ...
- NOIP模拟赛-2018.11.5
NOIP模拟赛 好像最近每天都会有模拟赛了.今天从高二逃考试跑到高一机房,然而高一也要考试,这回好像没有拒绝的理由了. 今天的模拟赛好像很有技术含量的感觉. T1:xgy断句. 好诡异的题目,首先给出 ...
- NOIP模拟赛 17.10.10
初次见面(firstmeet)[题目背景]雾之湖边,静得可怕.露米娅出神凝望.黑白连衣裙,像极了绽放的墨黑和洁白的莲.身边的雾之湖,倒映着血色天空.酒红的双眸,映照一切.低声浅笑,双臂伸直,她悄无声息 ...
- noip模拟赛(10.4) 背包(pack)
[题目描述] 蛤布斯有n种商品,第i种物品的价格为ai,价值为bi.有m个人来向蛤布斯购买商品,每个人每种物品只能购买一个.第j个人有cj的钱,他会不停选择一个能买得起的价格最高的商品买走(如果有多个 ...
- noip模拟赛(10.4) 序列(sequence)
序列(sequence) [题目描述] 给定一个1~n的排列x,每次你可以将x1~xi翻转.你需要求出将序列变为升序的最小操作次数.有多组数据. [输入数据] 第一行一个整数t表示数据组数. 每组数据 ...
- noip模拟赛(10.4) 字典序(dictionary)
[题目描述] 你需要构造一个1~n的排列,使得它满足m个条件,每个条件形如(ai,bi),表示ai必须在bi前面.在此基础上,你需要使它的字典序最小. [输入数据] 第一行两个正整数n,m.接下来m行 ...
- 水(NOIP模拟赛Round #10)
题目描述: 小Z有一个长度为的数列.他有次令人窒息的操作,每次操作可以使某个数字或.他当然是希望这些数字的乘积尽量小了.为了简化题目,你只需输出操作完成后的数列即可. ———————————————— ...
- 题(NOIP模拟赛Round #10)
题目描述: 有一张的地图,其中的地方是墙,的地方是路.有两种操作: 给出个地点,询问这个地点中活动空间最大的编号.若询问的位置是墙,则活动空间为:否则活动空间为询问地点通过四联通能到达的点的个数.如果 ...
随机推荐
- node.js遇到的问题
1.cann't find module 'request' 不能找到’request' 模块 解决方法:找到项目的根路径,cd到该路径,运行命令 npm install request 2.no ...
- C# ArrayList的使用方法小总结
1.什么是ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: 动态的增加和减少元素 实现了ICollection和ILis ...
- Android 7.0 以上保留数据去除锁屏密码的方法
在很多情况下,由于我们的疏忽,导致忘记了锁屏密码.也没有开启 USB 调试,内置存储中还有要保留的数据.我们需要在不清除数据的情况下删除锁屏密码.接下来我们就介绍该如何做. 注意事项 首先要注意,这个 ...
- php命令行生成与读取配置文件
接着之前的文章:php根据命令行参数生成配置文件 ghostinit.php <?php class ghostinit{ static $v = 'ghost version is 1.1'; ...
- SpringMVC 文件上传(Multipart)
作者QQ:1095737364 QQ群:123300273 欢迎加入! 平时用的上传一般是输入流和输出流上传,今天使用的是transferTo方法: Multipart请求是在控制器实例 ...
- python中numpy.r_和numpy.c_
例子 import numpy as np a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) c = np.c_[a,b] print(np.r_[a,b ...
- JSz中的静态方法和实例方法的分析
我又回来了,最近忙着喝枸杞,没来写博客感觉很有负罪感,今晚我来写一点小小的知识点 可能我们在用形如Array.of()的方法时会产生一些疑问,为什么我们能不实例化直接使用Array上的of()方法呢, ...
- npm、cnpm、bower安装区别
简单地说,就是帮你下载好你需要的css或者js库,而且三者功能也都是一样的.那为什么要下载这3个不同的呢?据说npm容易被墙……而cnpm是淘宝的镜像,所以通常用cnpm代替npm.至于bower,是 ...
- ArcGIS三种方式打断相交线------Feature To Line工具
有多个layer图层相交线时,选用”Feature To Line“工具,将多个图层相交线打断,然后合并成一个图层. (1) 选择工具栏”Geoprocessing“中的”ArcToolb ...
- Android系统定制和源码开发以及源码编译(附视频)
Android系统定制配套视频: 为了把Android系统源码定制和编译的课程讲完,从准备到录制完所有的视频,一共花去了近半年的时间,前前后后各种下载源码,编译源码,系统不兼容,版本适配,虚拟机配置困 ...