[考试反思]1109csp-s模拟测试106:撞词


(撞哈希了用了模拟测试28的词,所以这次就叫撞词吧)
蓝色的0。。。
蓝色的0。。。
都该联赛了还能CE呢。。。
考试结束前15分钟左右,期望得分300
然后对拍发现T2伪了写了一个能拿90分的垃圾随机化
然后很着急,想再写一个部分分,结果没编译就交了。。。
不管在多么紧急的情况下,都要检查,编译。
。。。还不如不对拍拿一个伪的20。。。
然后T3少考虑一种情况。挂了。
T1:合并集合merge
区间dp板子。
#include<cstdio>
#include<bitset>
#include<iostream>
using namespace std;
bitset<>B[][];
int n,x[],dp[][],sz[][],ans;
int main(){
freopen("merge.in","r",stdin);freopen("merge.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;++i)scanf("%d",&x[i]),x[i+n]=x[i];
for(int l=;l<=n<<;++l){
B[l][l][x[l]]=;
for(int r=l+;r<l+n&&r<=n<<;++r)B[l][r]=B[l][r-],B[l][r][x[r]]=;
}
for(int l=;l<=n<<;++l)for(int r=l;r<l+n&&r<=n<<;++r)sz[l][r]=B[l][r].count();
#define r l+len-1
for(int len=;len<=n;++len)for(int l=;r<=n<<;++l)for(int m=l;m<r;++m)
dp[l][r]=max(dp[l][r],dp[l][m]+dp[m+][r]+sz[l][m]*sz[m+][r]);
for(int i=;i<=n;++i)ans=max(ans,dp[i][i+n-]);
printf("%d\n",ans);
}
T2:爬climb
除了最后一步以外,每一步一定用A-B最大的。
枚举用的最后一个,考虑如何$O(logn)$进行$check$
发现其实只是i后面的药丸后错了一位,也可以理解为水位在i以后晚了一天才上涨。
预处理错位前后的两个$\sum A-B$与水位的差值,$ST$查询。
复杂度$O(nlogn)$
#include<cstdio>
#include<algorithm>
using namespace std;
struct P{
int a,b;
friend bool operator<(P x,P y){
return x.a-x.b>y.a-y.b;
}
}p[];
int hb[],ans,n,lim;
long long L,sum[],h1[],h2[],wt[],st1[][],st2[][];
long long mn1(int l,int r){
if(r<l)return ;
int B=hb[r-l+];
return min(st1[B][l],st1[B][r-(<<B)+]);
}
long long mn2(int l,int r){
if(r<l)return ;
int B=hb[r-l+];
return min(st2[B][l],st2[B][r-(<<B)+]);
}
int main(){freopen("climb.in","r",stdin);freopen("climb.out","w",stdout);
scanf("%d%lld",&n,&L);ans=lim=n+;//printf("n=")
for(int i=;i<=n;++i)scanf("%d%d",&p[i].a,&p[i].b);
sort(p+,p++n);
for(int i=;i<=n;++i)scanf("%lld",&wt[i]),wt[i]+=wt[i-];
for(int i=;i<=n;++i)sum[i]=sum[i-]+p[i].a-p[i].b;//,printf("%lld\n",sum[i]);
for(int i=;i<=n;++i)if(sum[i]<sum[i-]){lim=i;break;}
for(int i=;i<=n;++i)h1[i]=h2[i]=sum[i];
for(int i=;i<=n;++i)h1[i]-=wt[i],h2[i]-=wt[i-];
for(int i=;i<=n;++i)st1[][i]=h1[i],st2[][i]=h2[i];
for(int j=;j<;++j)for(int i=;i+(<<j)-<=n;++i)st1[j][i]=min(st1[j-][i],st1[j-][i+(<<j-)]);
for(int j=;j<;++j)for(int i=;i+(<<j)-<=n;++i)st2[j][i]=min(st2[j-][i],st2[j-][i+(<<j-)]);
for(int i=;i<=;++i)for(int j=<<i;j<<<i+&&j<=n;++j)hb[j]=i;
for(int i=;i<=n;++i){//printf("%d/%d:%d %d\n",i,n,p[i].a,p[i].b);
int out1=lower_bound(sum,sum+lim,L-p[i].a)-sum,out2=lower_bound(sum,sum+lim,L-p[i].b)-sum;//printf("%d %d %d\n",out1,out2,lim);
if(out1==lim&&out2==lim)continue;
if(out1<i&&out1!=lim){//printf("%lld\n",mn1(1,out));
if(mn1(,out1)<=)continue;
ans=min(ans,out1+);//printf("1:%d %d\n",i,out1);
}else if(out2>=i&&out2!=lim){//printf("%lld %lld\n",mn1(1,i-1),mn2(i+1,out));
if(mn1(,i-)<=)continue;
if(mn2(i+,out2)<=p[i].a-p[i].b)continue;
ans=min(ans,out2);//printf("2:%d %d\n",i,out2);
}
}printf("%d\n",ans==n+?-:ans);//printf("%lld %lld\n",mn1(1,5),mn2(7,8));
}
T3:硬币coin
简单的博弈论。主要不在博弈论,而在转化为图论。
类似2-SAT的思想(但其实并没什么关系),把每一个行列都拆成2个点,分别表示选与不选。
连边表示如果存在状态A,那么状态B一定存在。
根据每一个硬币,如果它是正面,那么如果选这一行那么就必须选这一列,如果不选这一行就不能选这一列。
双向边$A_1 - B_1$与$A_0 - B_0$。
如果硬币是反面,那么就是$A_1 - B_0$与$A_0 - B_1$
连边之后图会成为若干个联通块,互不干扰。
现在的问题就是确定每一个联通块的状态。
如果一个联通块内部矛盾(既要选又要不选)那么答案直接根据奇偶判断01。
否则,如果一个联通块内不管怎么确定状态,需要选的行列都是偶数(简称偶偶),那么对答案没有影响。
如果存在奇偶块,那么拿到最后一个奇偶块的是必胜的(你可以通过这一块决定全局的步数是奇数还是偶数)
如果没有奇偶块,那么如果奇奇块的数量是奇数,那么先手必胜3。否则2。
接下来就考虑如何争夺奇偶块。因为拿到最后一个奇偶块就赢了,所以两个人都不希望拿到倒数第二个奇偶块,那么就想拿到倒数第三个。
同理推下去,如果奇偶块一共有奇数个,那么先手者一定能拿到最后一个奇偶块,输出3。
否则,奇偶块一共有偶数个,那么先手者会尽量避免拿到第一个奇偶块。
所以为了不拿第一个奇偶块,他会去拿奇奇块。(拿偶偶块没有影响)
拿完奇奇块之后就轮到对手了,对手也同理不想拿奇偶,所以他也会拿奇奇。
所以两个人现在开始抢奇奇块了。
如果奇奇块有奇数个,那么先手者就能强制后手者拿走第一个奇偶块,就可以取胜,3。否则就是2。
所有情况讨论完毕。
#include<cstdio>
int fir[],l[],to[],ec=,pc=,ord[][],ok=,al[],sz,cnt,blcnt,sz2,g,sg;
char s[][];
void link(int a,int b){l[++ec]=fir[a];fir[a]=ec;to[ec]=b;}
void Link(int a,int b){link(a,b);link(b,a);}
void dfs(int p){
al[p]=;sz++;sz2+=p&;
for(int i=fir[p];i;i=l[i])if(al[to[i]]==)dfs(to[i]);
}
int main(){
freopen("coin.in","r",stdin);freopen("coin.out","w",stdout);
int t,n,m;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i)scanf("%s",s[i]+);
for(int i=;i<=n;++i)pc+=,ord[][i]=pc;
for(int i=;i<=m;++i)pc+=,ord[][i]=pc;
for(int i=;i<=n;++i)for(int j=;j<=m;++j)
if(s[i][j]=='o')Link(ord[][i],ord[][j]),Link(ord[][i]^,ord[][j]^);
else if(s[i][j]=='x')Link(ord[][i],ord[][j]^),Link(ord[][i]^,ord[][j]);
for(int i=;i<=pc;++i)if(al[i]==&&al[i^]==){
sz2=sz=,dfs(i),cnt+=sz&,blcnt++,g+=(sz2&)&(sz-sz2&);
if((sz2&)&&(sz-sz2&))sg^=;
if(sz&)sg^=;
}
for(int i=;i<=pc;++i)if(al[i]&&al[i^])ok=;
if(ok)puts(sg?"":"");
else puts(m+n&?"":"");
for(int i=;i<=pc;++i)fir[i]=al[i]=;pc=ec=ok=;cnt=blcnt=g=sg=;
}
}
从博弈论的角度出发如何解释?
mex函数:mex(X)=X中不存在的最小非负整数。如mex(1,2)=0,mex(0)=1...
SG函数:为0时代表必败局面,否则为必胜局面。计算方法为mex(通向的所有状态)
整场游戏如果可以分成若干不相关的部分,那么整场游戏的SG函数值就是每个子游戏的SG函数值异或和。
在这道题里,子游戏就是一个联通块。
对于偶偶块,不论怎么选先手都会输,走一步后剩奇数步,那么SG(next)=1,SG=mex(SG(next))=0。
对于奇奇块,不论怎么选先手都会赢,走一步后剩偶数步,那么SG(next)=0,SG=mex(SG(next))=1。
对于奇偶块,先手走一步之后,剩余奇偶步都有可能,那么SG(next)={1,0},SG=mex(SG(next))=2。
计算出每一个联通块的SG函数,异或一下,ans=2+(SG?1:0)
当然,如果不存在所有硬币都正面朝上的情况,还是要特判的。
[考试反思]1109csp-s模拟测试106:撞词的更多相关文章
- [考试反思]0718 NOIP模拟测试5
最后一个是我...rank#11 rank#1和rank#2被外校大佬包揽了. 啊...考的太烂说话底气不足... 我考场上在干些什么啊!!! 20分钟“切”掉T2,又27分钟“切”掉T1 切什么切, ...
- [考试反思]0814NOIP模拟测试21
前两名是外校的240.220.kx和skyh拿到了190的[暴力打满]的好成绩. 我第5是170分,然而160分就是第19了. 在前一晚上刚刚爆炸完毕后,心态格外平稳. 想想前一天晚上的挣扎: 啊啊啊 ...
- [考试反思]0909csp-s模拟测试41:反典
说在前面:我是反面典型!!!不要学我!!! 说在前面:向rank1某脸学习,不管是什么题都在考试反思后面稍微写一下题解. 这次是真的真的运气好... 这次知识点上还可以,但是答题策略出了问题... 幸 ...
- [考试反思]0729NOIP模拟测试10
安度因:哇哦. 安度因:谢谢你. 第三个rank1不知为什么就来了.迷之二连?也不知道哪里来的rp 连续两次考试数学都占了比较大的比重,所以我非常幸运的得以发挥我的优势(也许是优势吧,反正数学里基本没 ...
- [考试反思]0714/0716,NOIP模拟测试3/4
这几天时间比较紧啊(其实只是我效率有点低我在考虑要不要坐到后面去吹空调) 但是不管怎么说,考试反思还是要写的吧. 第三次考试反思没写总感觉缺了点什么,但是题都刷不完... 一进图论看他们刷题好快啊为什 ...
- [考试反思]1003csp-s模拟测试58:沉淀
稳住阵脚. 还可以. 至少想拿到的分都拿到了,最后一题的确因为不会按秩合并和线段树分治而想不出来. 对拍了,暴力都拍了.挺稳的. 但是其实也有波折,险些被卡内存. 如果内存使用不连续或申请的内存全部使 ...
- [考试反思]0816NOIP模拟测试23
210 210 210 170 还可以.暴力打满就rk4了? 但不管怎么说,总算是在改完题之后理直气壮的写考试反思了. T1是个dp,说水也不太水.(当然某脸只要A掉了一道题就要说那是水题) 我的思路 ...
- [考试反思]0801NOIP模拟测试11
8月开门红. 放假回来果然像是神志不清一样. 但还是要接受这个事实. 嗯,说好听点,并列rank#7. 说难听点,垃圾rank#18. 都不用粘人名就知道我是哪一个吧... 因为图片不能太长,所以就不 ...
- [考试反思]0725NOIP模拟测试8
看清你是个什么东西了么? 现在看清了么?rank#15?垃圾玩意? 你什么也不是.你没有骄傲,偷懒的资格! 节节败退,永无止境,你想掉到什么样子? 你还在为了成功拿到送分的T1而沾沾自喜?只不过是勉强 ...
随机推荐
- Kafka 学习笔记之 Kafka0.11之console-producer/console-consumer
Kafka 学习笔记之 Kafka0.11之console-producer/console-consumer: 启动Zookeeper 启动Kafka0.11 创建一个新的Topic: ./kafk ...
- Redis开发与运维:linux安装
Linux 安装 我的系统是inux 系统,官网下载 https://redis.io/download redis-5.0.5.tar.gz 解压: 编译安装: 官网和文档说得已经很清楚了,现在就执 ...
- Eclipse导入别人项目爆红叉
1.导入项目之前,请确认工作空间编码已设置为utf-8:window->Preferences->General->Wrokspace->Text file encoding- ...
- React antd如何实现<Upload>组件上传附件再次上传已清除附件缓存问题。
最近在公司做React+antd的项目,遇到一个上传组件的问题,即上传附件成功后,文件展示处仍然还有之前上传附件的缓存信息,需要解决的问题是,要把上一次上传的附件缓存在上传成功或者取消后,可以进行清除 ...
- Nginx常用命令,解决你日常运维的烦恼
前面,跟大家简单地介绍了负载均衡和Nginx的一些基础配置(Nginx负载均衡配置实例),接下来,跟大家介绍一下Nginx的常用命令,便于日常的运维. 查看原文 停止Nginx的方法 通过之前的学习, ...
- MySQL基础(四)常用函数
转载自 http://blog.csdn.net/evankaka MySQL数据库中提供了很丰富的函数.MySQL函数包括数学函数.字符串函数.日期和时间函数.条件判断函数.系统信息函数.加密函数. ...
- 「3D建模」ZBrush如何雕刻头部
加载项目开始 1. 如果未显示灯箱,请按逗号(,)或灯箱按钮. 2. 单击项目选项卡,然后双击DefaultSphere项目.它将被加载到ZBrush中. 3. 在工具>几何子选项板中,将SDi ...
- javascript 对象和字符串互转
Object => String : console.log(JSON.stringify(e)); String => Object : JSON.parse(str)
- [Luogu2967] 视频游戏的麻烦Video Game Troubles
农夫约翰的奶牛们游戏成瘾!本来约翰是想要按照调教兽的做法拿她们去电击戒瘾的,可是 后来他发现奶牛们玩游戏之后比原先产更多的奶.很明显,这是因为满足的牛会产更多的奶. 但是,奶牛们在哪个才是最好的游 ...
- C++中哪些函数不能声明为inline?
inline关键字仅仅是对编译器的建议,编译器有权力决定一个函数是否在调用处嵌入.因为内联函数要在调用处展开,编译器必须能在每一个调用处能看到该函数的定义,因此最好将函数实现放在头文件中(而且实现在类 ...