[考试反思]1110csp-s模拟测试109:细节

细节。。。决定成败
T2数组开小,T3long long没开够。
而且其实不止这样,考试结束前15分钟发现了好多低错:
T3双向边没开2倍。dfs没递归调用。T2为了调试bitset开20没改(后来改成了6000,虽说还是错的但是还是好了不少)
一定要手模几个样例测一下。严格注意数组大小
最后几天了,一定要注意这种细节了。
T1:Adore
状压,dp。
复杂度$O(mk \times 2^k)$不够优但是足以通过。
#include<cstdio>
int add(int &a,int b){a+=b;if(a>=)a-=;}
int cntbit[],m,k,dp[][],E[],NE[],ans;
int re(){register char ch=getchar();
while(ch<''||ch>'')ch=getchar();
return ch-'';
}
int main(){
freopen("adore.in","r",stdin);freopen("adore.out","w",stdout);
for(int i=;i<;++i)cntbit[i]=cntbit[i^i&-i]+;
scanf("%d%d",&m,&k);m-=;
int st=,ths=,nxt=;
for(int i=;i<k;++i)st|=re()<<i;
dp[nxt][st]=;
while(m--){
ths^=;nxt^=;
for(int i=;i<<<k;++i)dp[nxt][i]=;
for(int i=;i<k;++i)E[i]=NE[i]=;
for(int i=;i<k;++i)for(int j=,x;j<k;++j)x=re(),E[i]|=x<<j,NE[j]|=x<<i;
for(int s=;s<<<k;++s)if(dp[ths][s]){
int tst=,ntst=;
for(int i=;i<k;++i)if(s&<<i)tst^=E[i],ntst^=NE[i];
add(dp[nxt][tst],dp[ths][s]);add(dp[nxt][ntst],dp[ths][s]);
}
}st=;
for(int i=;i<k;++i)st|=re()<<i;
for(int i=;i<<<k;++i)if(!(cntbit[st&i]&))add(ans,dp[nxt][i]);
printf("%d\n",ans);
}
T2:Confess
手动构造,发现交集大于n的很多。所以采用随机化。注意数组大小。
#include<bits/stdc++.h>
using namespace std;
bitset<>B[];
int n,k;char s[];
int main(){
freopen("confess.in","r",stdin);freopen("confess.out","w",stdout);
scanf("%d%s",&n,s);
while(s[k])k++;
int cnt=;
for(int i=;i<k;++i){
int x=s[i]-;
for(int j=;j<&&cnt<=n<<;++j)B[][cnt]=(x&<<j?:),cnt++;
}
for(int I=;I<=n+;++I){
scanf("%s",s);
int cnt=;
for(int i=;i<k;++i){
int x=s[i]-;
for(int j=;j<&&cnt<=n<<;++j)B[I][cnt]=(x&<<j?:),cnt++;
}
}
srand(time());
while(){
int a=rand()%(n+)+,b=rand()%(n+)+;
while(a==b)b=rand()%(n+)+;
if((B[a]&B[b]).count()>=n>>)return printf("%d %d\n",a,b),;
}
}
T3:Repulsed
设dp[i][j]表示距离i这个点j条边的需要灭火器的子节点有多少个。Idp[i][j]表示距离i点有j条边的还没用完的灭火器还能用几次。
在一棵子树内,互相消除,然后上传。
如果有的点dp[i][k]>0而Idp[i][0]=0那么就需要申请新的灭火器。
从远到近依次解决需求,不断上传。最后在1号节点特殊处理:不管剩下多少需求都要直接申请灭火器解决。
注意Idp数组需要开longlong。
#include<bits/stdc++.h>
using namespace std;
int n,k,s,fir[],l[],to[],ec,ans,dp[][];long long Idp[][];
void link(int a,int b){l[++ec]=fir[a];fir[a]=ec;to[ec]=b;}
void dfs(int p,int fa){
dp[p][]++;
for(int i=fir[p];i;i=l[i])if(to[i]!=fa){
dfs(to[i],p);
for(int j=;j<k;++j)dp[p][j+]+=dp[to[i]][j],Idp[p][j+]+=Idp[to[i]][j];
}
while(dp[p][k]>Idp[p][])Idp[p][]+=s,ans++;
for(int i=k;~i;--i)for(int j=k-i;~j;--j){
int x=min(1ll*dp[p][i],Idp[p][j]);
dp[p][i]-=x;Idp[p][j]-=x;
}
if(p==){
int totcnt=;
for(int i=;i<=k;++i)totcnt+=dp[p][i];
while(totcnt>)totcnt-=s,ans++;
}
}
int main(){
freopen("repulsed.in","r",stdin);freopen("repulsed.out","w",stdout);
scanf("%d%d%d",&n,&s,&k);if(s>n)s=n;
for(int i=,a,b;i<n;++i)scanf("%d%d",&a,&b),link(a,b),link(b,a);
dfs(,);printf("%d\n",ans);
}
这是错的!!!
上述算法稍伪。当且仅当需求距离和灭火器距离加和为k或k-1时才会配对,否则就可以上传,以后再匹配。
上传答案一定不会变差,反而可能找到更优的匹配。
要注意根节点就可以随意匹配了。
代码基本没有变。同时时间复杂度也下降到了$O(nk)$
#include<bits/stdc++.h>
using namespace std;
int n,k,s,fir[],l[],to[],ec,ans,dp[][];long long Idp[][];
void link(int a,int b){l[++ec]=fir[a];fir[a]=ec;to[ec]=b;}
void dfs(int p,int fa){
dp[p][]++;
for(int i=fir[p];i;i=l[i])if(to[i]!=fa){
dfs(to[i],p);
for(int j=;j<k;++j)dp[p][j+]+=dp[to[i]][j],Idp[p][j+]+=Idp[to[i]][j];
}
while(dp[p][k]>Idp[p][])Idp[p][]+=s,ans++;
for(int i=k;i>=((p==)?:k-);--i)for(int j=i;~j;--j){
int x=min(1ll*dp[p][j],Idp[p][i-j]);
dp[p][j]-=x;Idp[p][i-j]-=x;
}
if(p==){
int totcnt=;
for(int i=;i<=k;++i)totcnt+=dp[p][i];
while(totcnt>)totcnt-=s,ans++;
}
}
int main(){
scanf("%d%d%d",&n,&s,&k);
for(int i=,a,b;i<n;++i)scanf("%d%d",&a,&b),link(a,b),link(b,a);
dfs(,);printf("%d\n",ans);
}
真正的AC代码
自家OJ数据水了,去BZOJ1117自测吧。(送个链接)
[考试反思]1110csp-s模拟测试109:细节的更多相关文章
- [考试反思]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某脸学习,不管是什么题都在考试反思后面稍微写一下题解. 这次是真的真的运气好... 这次知识点上还可以,但是答题策略出了问题... 幸 ...
- [考试反思]1109csp-s模拟测试106:撞词
(撞哈希了用了模拟测试28的词,所以这次就叫撞词吧) 蓝色的0... 蓝色的0... 都该联赛了还能CE呢... 考试结束前15分钟左右,期望得分300 然后对拍发现T2伪了写了一个能拿90分的垃圾随 ...
- [考试反思]0816NOIP模拟测试23
210 210 210 170 还可以.暴力打满就rk4了? 但不管怎么说,总算是在改完题之后理直气壮的写考试反思了. T1是个dp,说水也不太水.(当然某脸只要A掉了一道题就要说那是水题) 我的思路 ...
- [考试反思]0729NOIP模拟测试10
安度因:哇哦. 安度因:谢谢你. 第三个rank1不知为什么就来了.迷之二连?也不知道哪里来的rp 连续两次考试数学都占了比较大的比重,所以我非常幸运的得以发挥我的优势(也许是优势吧,反正数学里基本没 ...
- [考试反思]0725NOIP模拟测试8
看清你是个什么东西了么? 现在看清了么?rank#15?垃圾玩意? 你什么也不是.你没有骄傲,偷懒的资格! 节节败退,永无止境,你想掉到什么样子? 你还在为了成功拿到送分的T1而沾沾自喜?只不过是勉强 ...
- [考试反思]0714/0716,NOIP模拟测试3/4
这几天时间比较紧啊(其实只是我效率有点低我在考虑要不要坐到后面去吹空调) 但是不管怎么说,考试反思还是要写的吧. 第三次考试反思没写总感觉缺了点什么,但是题都刷不完... 一进图论看他们刷题好快啊为什 ...
- [考试反思]1003csp-s模拟测试58:沉淀
稳住阵脚. 还可以. 至少想拿到的分都拿到了,最后一题的确因为不会按秩合并和线段树分治而想不出来. 对拍了,暴力都拍了.挺稳的. 但是其实也有波折,险些被卡内存. 如果内存使用不连续或申请的内存全部使 ...
随机推荐
- Pycharm-2018.3.1专业版破解教程
1.去官网下载并安装2018.3.1(目前最新)专业版本的Pycharm:(https://www.jetbrains.com/pycharm/download/#section=windows). ...
- 【性能优化】404- 从 12.67s到1.06s 性能优化实战
作者:jerryOnlyZRJ 来源:https://juejin.im/post/5b6fa8c86fb9a0099910ac91 本文是对之前同名文章的修正,将所有webpack3的内容更新为we ...
- Cisco学习记录(一):Cisco Packet Tracer官网下载方法
通过Cisco Packet Tracer学习计算机网络知识 本人大三狗一枚,一直以来都在学java, python, web开发的我,经过一番决定,毅然决然要开始深入学习计算机网络!通过Cisco ...
- servlet的三大作用域对象和jsp的九大内置对象及其四大作用域对象
servlet的三大作用域对象: request(HttpServletRequest) session(HttpSession): application(ServletContext):tomca ...
- VMware Fushion解决:与vmmon模块的版本不匹配: 需要385.0,现有330.0。
可以按下列步骤解决: 1. 退出VMware fusion2. 打开[终端]3. 执行命令:sudo rm -rf /System/Library/Extensions/vmmon.kext ,根据提 ...
- Node6-1单元测试mocha
1.初步简单的测试 在src新建一个math.js的文件.src/math.js module.exports ={ add:(...args)=>{ return args.reduce((p ...
- vscode搭建C/C++环境
windows安装Mingw-w64 Mingw-w64安装 准备工作 创建文件夹Vc_c++ 在Vc_c++文件夹下创建下面两个文件夹 在g++下创建demo.cpp 在gcc下创建demo.c 打 ...
- 蒟蒻的PKUWC2019划水记(更新ing)
前言 (结束再补) \(Dec\ 20th\) 正式出发 今天,是正式出发的日子. 虽说是星期五,可并没有去学校晨跑.难得睡到了\(7\)点,起来匆匆吃完了早饭(一个手抓饼),就出发去火车站了. 到了 ...
- IT兄弟连 HTML5教程 CSS3属性特效 遮罩
CSS遮罩提供一种基于像素级别的,可以控制元素透明度的能力,类似于png24位或png32位中的alpha透明通道的效果.遮罩有三个属性可以设置,分别是mask-image.mask-position ...
- 【zabbix监控】zabbix监控tomcat服务
服务器配置(zabbix_server) 1. 安装jdk 版本需要1.7以上,我这边安装的是1.8的,可以参考我jdk安装的文章 # 上传到zabbix_server服务端.安装(jdk-8u171 ...