[考试反思]1026csp-s模拟测试88:发展
不用你们说,我自己来:我颓闪存我没脸。
昨天的想法,
今天的回答。
生存,
发展。
总分榜应该稍有回升,但是和上面的差距肯定还是很大。
继续。
为昨天的谬误,承担代价。
T2和T3都值得张记性。
T2因为上次输出了"-0.00"在文本比较下与"0.0"不同导致WA,所以这次输出的时候把答案加了0.005
但是加的太多了,在四舍五入下恰好进位了导致WA。
为了防止输出"-0.0"要将答案加一个1e-9级别的数,不要太小也不要太大。
T3算错上限没打高精。
考虑极端情况。考试时不要用__int128(CSP-S不认可)
我不喜欢RP守恒。
我想稳在rank5以内。遥不可及。
T1:军训队列。
一个明显的斜率优化dp。但是考场上推了一会没有推出来。
然而这题用不到,因为身高最多有6001种,所以$O(6001*6001*k)$可过
但是要注意把所有人身高压起来后n可能小于k,判掉。
斜率优化的假单调栈可以当成是一个剪枝。
#include<cstdio>
#include<algorithm>
using namespace std;
double dp[][],h[];int n,k,q[],qh,qt;
double fab2(double x){return x*x;}
double cal(int j,int k,int f){return (dp[j][f-]-dp[k][f-])/(h[j+]-h[k+])+h[j+]+h[k+];}
int main(){
scanf("%d%d",&n,&k);
for(int i=;i<=n;++i)scanf("%lf",&h[i]);
sort(h+,h++n);n=unique(h+,h++n)-h-;h[n+]=1e9;
for(int i=;i<=n;++i)dp[i][]=fab2(h[i]-h[]);
for(int j=;j<=k;++j){
q[qt=qh=]=;
for(int i=;i<=n;++i){
dp[i][j]=1e18;
while(qt-qh>=&&cal(q[qh+],q[qh],j)<h[i]*)qh++;
for(int p=qh;p<=qt;++p)dp[i][j]=min(dp[i][j],dp[q[p]][j-]+fab2(h[i]-h[q[p]+]));
q[++qt]=i;
}
}printf("%.2lf\n",dp[n][k]);
}
然而当然也可以打一个真正的斜率优化。
转移式是$dp[i][f]=min(dp[j][f-1]+(h[j+1])^2+(h[i])^2-2\times h[j+1] \times h[i])$
然后接下来与i有关的项都可以提出来,剩下的是常数。
然后就可以得到一个关于$h[i]$的一次函数(直线)。
因为在这道题里h是单调的,所以斜率是单调的,取值的横坐标也是单调的。
所以就是一堆直线,可以维护凸包了。
#include<cstdio>
#include<algorithm>
using namespace std;
double dp[][],h[],k[],b[];int n,K,q[],qh,qt;
double fab2(double x){return x*x;}
double cal(int j,double x){return b[j]+k[j]*x;}
double jd(int j,int i){return (b[j]-b[i])/(k[i]-k[j]);}
int main(){
scanf("%d%d",&n,&K);
for(int i=;i<=n;++i)scanf("%lf",&h[i]);
sort(h+,h++n);n=unique(h+,h++n)-h-;h[n+]=1e9;
for(int i=;i<=n;++i)dp[i][]=fab2(h[i]-h[]);
for(int j=;j<=K;++j){
q[qt=qh=]=j-;k[j-]=-*h[j];b[j-]=dp[j-][j-]+fab2(h[j]);
for(int i=j;i<=n;++i){
k[i]=-*h[i+];b[i]=dp[i][j-]+fab2(h[i+]);
while(qt-qh>=&&cal(q[qh],h[i])>cal(q[qh+],h[i]))qh++;
while(qt-qh>=&&jd(q[qt-],i)>jd(q[qt],i))qt--;
dp[i][j]=dp[q[qh]][j-]+fab2(h[i]-h[q[qh]+]);
q[++qt]=i;
}
}printf("%.2lf\n",dp[n][K]);
}
T2:山屋惊魂
规模不是很大的模拟。虽说也不小。
预处理一下dize[i][j]表示用i个骰子得到j的概率。(骰子的英语不是dize。。。打脸。。。但是我懒得改了)
然后。。我也不知道该讲什么。。。模拟好像真的没办法讲。。。
按照题目说的就是了。不要读错题
其实我不是很明白为什么会打的那么长,并没有感觉这个模拟比以前的模拟难很多。。。
#include<cstdio>
#include<string>
#include<iostream>
#include<map>
using namespace std;
map<string,int>M;
long double dize[][],pos[][],fail,ans[][],lim[][][];
int n,st[],s[],c1[],c2[],num;
string bar[],knd,opt;
int chg(int S,int p,int w){return (S^S&<<p*)|w<<p*;}
int main(){//freopen("betrayal.in","r",stdin);
dize[][]=;
for(int i=;i<=;++i)for(int j=;j<=i<<;++j)
dize[i+][j]+=dize[i][j]/,dize[i+][j+]+=dize[i][j]/,dize[i+][j+]+=dize[i][j]/;
for(int i=;i<;++i)cin>>bar[i]>>st[i],st[i]--;
cin>>n;
pos[][st[]|st[]<<|st[]<<|st[]<<]=;
M["Might"]=;M["Speed"]=;M["Sanity"]=;M["Knowledge"]=;
for(int i=;i<n;++i){
cin>>knd>>opt;
if(opt=="<"){
cin>>num;
for(int j=;j<=;++j)for(int k=;k<=;++k)lim[i][M[knd]][j]+=(dize[bar[M[knd]][j]-''][k]*(k>=num));
cin>>knd>>opt;
}else if(opt=="<="){
cin>>num;
for(int j=;j<=;++j)for(int k=;k<=;++k)lim[i][M[knd]][j]+=(dize[bar[M[knd]][j]-''][k]*(k> num));
cin>>knd>>opt;
}else if(opt==">"){
cin>>num;
for(int j=;j<=;++j)for(int k=;k<=;++k)lim[i][M[knd]][j]+=(dize[bar[M[knd]][j]-''][k]*(k<=num));
cin>>knd>>opt;
}else if(opt==">="){
cin>>num;
for(int j=;j<=;++j)for(int k=;k<=;++k)lim[i][M[knd]][j]+=(dize[bar[M[knd]][j]-''][k]*(k< num));
cin>>knd>>opt;
}
s[i]=M[knd];
if(opt[]=='+')if(opt.length()==)c2[i]+=opt[]-'';
else c1[i]+=opt[]-'';
if(opt[]=='-')if(opt.length()==)c2[i]-=opt[]-'';
else c1[i]-=opt[]-'';//printf("%d %d %d\n",s[i],c1[i],c2[i]);
}
for(int i=;i<n;++i)for(int S=;S<<<;++S){
int state[]={S&,S>>&,S>>&,S>>&};
double rp=pos[i][S];
for(int j=;j<;++j)rp*=(-lim[i][j][state[j]]);
pos[i+][S]+=pos[i][S]-rp;
if(c1[i]){
state[s[i]]+=c1[i];state[s[i]]=min(state[s[i]],);
if(state[s[i]]<)fail+=rp;
else pos[i+][chg(S,s[i],state[s[i]])]+=rp;
}else if(c2[i]>=){
for(int r=;r<=;++r){
double P=rp*dize[c2[i]][r];
int nw=state[s[i]]+r;nw=min(nw,);
pos[i+][chg(S,s[i],nw)]+=P;
}
}else{
for(int r=;r<=;++r){
double P=rp*dize[-c2[i]][r];
int nw=state[s[i]]-r;
if(nw<)fail+=P;
else pos[i+][chg(S,s[i],nw)]+=P;
}
}ed:;
}
printf("%.2Lf\n",fail*+0.0001);
for(int i=;i<<<;++i)for(int k=;k<;++k)ans[k][bar[k][i>>k*&]-'']+=pos[n][i];
for(int k=;k<;++k,puts(""))for(int i=;i<;++i)printf("%.2Lf ",ans[k][i]*+0.0001);
}
2.4k,可写
#include<cstdio>
#include<string>
#include<iostream>
#include<map>
using namespace std;
map<string,int>M;
double dize[][],pos[][],fail,ans[][],lim[][][];
int n,st[],s[],c1[],c2[],num;
string bar[],knd,opt;
int chg(int S,int p,int w){return (S^S&<<p*)|w<<p*;}
int abs(int a){return a>?a:-a;}
int nt(int a){return a>?:-;}
int OPT(string s,int a,int b){return s=="<="?a>b:(s=="<"?a>=b:(s==">="?a<b:a<=b));}
int main(){
dize[][]=;
for(int i=;i<;++i)for(int j=;j<=i*;++j)
dize[i+][j]+=dize[i][j]/,dize[i+][j+]+=dize[i][j]/,dize[i+][j+]+=dize[i][j]/;
for(int i=;i<;++i)cin>>bar[i]>>st[i],st[i]--;
cin>>n; pos[][st[]|st[]<<|st[]<<|st[]<<]=;
M["Speed"]=;M["Sanity"]=;M["Knowledge"]=;
for(int i=;i<n;++i){
cin>>knd>>opt;
if(opt[]!='+'&&opt[]!='-'){
cin>>num;
for(int j=;j<;++j)for(int k=;k<=;++k)
lim[i][M[knd]][j]+=(dize[bar[M[knd]][j]-''][k]*OPT(opt,k,num));
cin>>knd>>opt;
}
s[i]=M[knd];
if(opt.length()==)c2[i]+=(opt[]-'')*(opt[]=='+'?:-);
else c1[i]+=(opt[]-'')*(opt[]=='+'?:-);
}
for(int i=;i<n;++i)for(int S=;S<<<;++S){
int state[]={S&,S>>&,S>>&,S>>&}; double rp=pos[i][S];
for(int j=;j<;++j)rp*=(-lim[i][j][state[j]]);
pos[i+][S]+=pos[i][S]-rp;
if(c1[i]){
state[s[i]]+=c1[i];state[s[i]]=min(state[s[i]],);
if(state[s[i]]<)fail+=rp;
else pos[i+][chg(S,s[i],state[s[i]])]+=rp;
}else for(int r=;r<=;++r){
double P=rp*dize[abs(c2[i])][r];
int nw=state[s[i]]+nt(c2[i])*r;nw=min(nw,);
if(nw<)fail+=P;else pos[i+][chg(S,s[i],nw)]+=P;
}
}
printf("%.2lf\n",fail*+1e-);
for(int i=;i<<<;++i)for(int k=;k<;++k)ans[k][bar[k][i>>k*&]-'']+=pos[n][i];
for(int k=;k<;++k,puts(""))for(int i=;i<;++i)printf("%.2lf ",ans[k][i]*+1e-);
}
1.8k,压行
压行后的代码不存在任何的复制粘贴了,可以简单扩展了。
T3:彩球问题
记忆化搜索/dp
状态4维,12/12/12/4,分别表示还有1/2/3个的球有几种颜色,且上一次用的球还剩下0/1/2个
然后又是模拟?
最后的答案貌似有$10^{33}$级别?
#include<cstdio>
#define dp re[c1][c2][c3][lst]
__int128 ans,re[][][][];int cnt[],n,x;
__int128 sch(int c1,int c2,int c3,int lst){
if(dp!=-)return dp;
dp=;
if(c1==&&c2==&&c3==)return ;
if(lst==){
if(c1)dp+=c1*sch(c1-,c2,c3,);
if(c2)dp+=c2*sch(c1+,c2-,c3,);
if(c3)dp+=c3*sch(c1,c2+,c3-,);
}else if(lst==){
if(c1>)dp+=(c1-)*sch(c1-,c2,c3,);
if(c2)dp+=c2*sch(c1+,c2-,c3,);
if(c3)dp+=c3*sch(c1,c2+,c3-,);
}else if(lst==){
if(c1)dp+=c1*sch(c1-,c2,c3,);
if(c2>)dp+=(c2-)*sch(c1+,c2-,c3,);
if(c3)dp+=c3*sch(c1,c2+,c3-,);
}return dp;
}
int main(){
scanf("%d",&n);
while(n--)scanf("%d",&x),cnt[x]++;
for(int i=;i<;++i)for(int j=;j<;++j)for(int k=;k<;++k)for(int l=;l<;++l)re[i][j][k][l]=-;
__int128 x=sch(cnt[],cnt[],cnt[],);
if(x/1000000000000000000ll)printf("%lld",(long long)(x/1000000000000000000ll));
printf("%lld\n",(long long)(x%1000000000000000000ll));
}
你可以用int128水过
#include<cstdio>
#define dp re[c1][c2][c3][lst]
struct LL{
long long x[];
#define mod 100000000
friend void operator+=(LL &a,LL b){
for(int i=;i<;++i)a.x[i]+=b.x[i];
for(int i=;i<;++i)a.x[i+]+=a.x[i]/mod,a.x[i]%=mod;
}
void print(int i=){
for(;~i;--i)if(x[i]){printf("%lld",x[i]);break;}
for(--i;~i;--i)printf("%08lld",x[i]);
}
friend LL operator*(int x,LL a){
for(int i=;i<;++i)a.x[i]*=x;
for(int i=;i<;++i)a.x[i+]+=a.x[i]/mod,a.x[i]%=mod;
return a;
}
friend bool operator!=(LL a,int x){return a.x[]!=-;}
void operator=(int p){x[]=p;}
};
LL ans,re[][][][];int cnt[],n,x;
LL sch(int c1,int c2,int c3,int lst){
if(dp!=-)return dp;
dp=;
if(c1==&&c2==&&c3==)return dp=,dp;
if(lst==){
if(c1)dp+=c1*sch(c1-,c2,c3,);
if(c2)dp+=c2*sch(c1+,c2-,c3,);
if(c3)dp+=c3*sch(c1,c2+,c3-,);
}else if(lst==){
if(c1>)dp+=(c1-)*sch(c1-,c2,c3,);
if(c2)dp+=c2*sch(c1+,c2-,c3,);
if(c3)dp+=c3*sch(c1,c2+,c3-,);
}else if(lst==){
if(c1)dp+=c1*sch(c1-,c2,c3,);
if(c2>)dp+=(c2-)*sch(c1+,c2-,c3,);
if(c3)dp+=c3*sch(c1,c2+,c3-,);
}return dp;
}
int main(){
scanf("%d",&n);
while(n--)scanf("%d",&x),cnt[x]++;
for(int i=;i<;++i)for(int j=;j<;++j)for(int k=;k<;++k)for(int l=;l<;++l)re[i][j][k][l]=-;
sch(cnt[],cnt[],cnt[],).print();
}
但是显然作为一个有脸的人还是要写一次高精的
因为真正CSP-S上也不能用__int128,所以就算是模拟赛写高精也是很有必要的。
态度必须要有,天人不相欺。
[考试反思]1026csp-s模拟测试88:发展的更多相关文章
- [考试反思]0718 NOIP模拟测试5
最后一个是我...rank#11 rank#1和rank#2被外校大佬包揽了. 啊...考的太烂说话底气不足... 我考场上在干些什么啊!!! 20分钟“切”掉T2,又27分钟“切”掉T1 切什么切, ...
- 2019.10.26 csp-s模拟测试88 反思总结
今天的主人公是什么? 60.1K!!!! 先扔代码再更新防止我等会儿一上头不打算写完题解 T1: #include<iostream> #include<cstdio> #in ...
- CSP-S模拟测试 88 题解
T1 queue: 考场写出dp柿子后觉得很斜率优化,然后因为理解错了题觉得斜率优化完全不可做,只打了暴力. 实际上他是可以乱序的,所以直接sort,正确性比较显然,贪心可证,然后就是个sb斜率优化d ...
- [考试反思]0814NOIP模拟测试21
前两名是外校的240.220.kx和skyh拿到了190的[暴力打满]的好成绩. 我第5是170分,然而160分就是第19了. 在前一晚上刚刚爆炸完毕后,心态格外平稳. 想想前一天晚上的挣扎: 啊啊啊 ...
- [考试反思]1109csp-s模拟测试106:撞词
(撞哈希了用了模拟测试28的词,所以这次就叫撞词吧) 蓝色的0... 蓝色的0... 都该联赛了还能CE呢... 考试结束前15分钟左右,期望得分300 然后对拍发现T2伪了写了一个能拿90分的垃圾随 ...
- [考试反思]0909csp-s模拟测试41:反典
说在前面:我是反面典型!!!不要学我!!! 说在前面:向rank1某脸学习,不管是什么题都在考试反思后面稍微写一下题解. 这次是真的真的运气好... 这次知识点上还可以,但是答题策略出了问题... 幸 ...
- [考试反思]0729NOIP模拟测试10
安度因:哇哦. 安度因:谢谢你. 第三个rank1不知为什么就来了.迷之二连?也不知道哪里来的rp 连续两次考试数学都占了比较大的比重,所以我非常幸运的得以发挥我的优势(也许是优势吧,反正数学里基本没 ...
- [考试反思]0714/0716,NOIP模拟测试3/4
这几天时间比较紧啊(其实只是我效率有点低我在考虑要不要坐到后面去吹空调) 但是不管怎么说,考试反思还是要写的吧. 第三次考试反思没写总感觉缺了点什么,但是题都刷不完... 一进图论看他们刷题好快啊为什 ...
- [考试反思]1003csp-s模拟测试58:沉淀
稳住阵脚. 还可以. 至少想拿到的分都拿到了,最后一题的确因为不会按秩合并和线段树分治而想不出来. 对拍了,暴力都拍了.挺稳的. 但是其实也有波折,险些被卡内存. 如果内存使用不连续或申请的内存全部使 ...
随机推荐
- ELK 学习笔记之 elasticsearch 版本控制
版本控制: elasticsearch 版本控制: 内部版本控制 外部版本控制 内部版本控制: 内部版本会检查你提供的版本值和文档的版本值是否一致,如果不一致就报错,一致则可以更新. curl -XP ...
- PHP 通过 ReflectionMethod 反射类方法获取注释返回 false 的问题解决
php 通过反射 ReflectionMethod 类来获取类方法的相关信息,其中就包含方法的注释内容. 问题描述 在公司测试环境运行以下代码,如果是 cli 命令行模式运行,正常输出代码注释.如果是 ...
- liunx下安装MySQL
1.安装依赖包:yum -y install gcc gcc-c++ ncurses ncurses-devel cmake bisonyum install -y perl-Module-Insta ...
- JavaScript:如何获取某一天所在的星期
我们会遇到的需求的是,获取今天或者某一天所在星期的开始和结束日期. 我们这里来获取今天所在星期的始末日期,我们可以通过(new Date).getDay()来获取今天是星期几,然后再通过这个减去或者加 ...
- Python flask构建微信小程序订餐系统☝☝☝
Python flask构建微信小程序订餐系统☝☝☝ 一.Flask MVC框架结构 1.1实际项目结构 1.2application.py 项目配置文件 Flask之flask-script模块使 ...
- Web前端助手-功能丰富的Chrome插件
整合优秀的前端实用工具.免费,可配置的强大工具集 示例 安装 github仓库: https://github.com/zxlie/FeHelper 官网地址:https://www.baidufe. ...
- PMP(第六版)中的各种矩阵表格
- jquery 往上滚动的时显示,上下滚动执行的js
$(document).on("mousewheel DOMMouseScroll", function (e) { var delta = (e.originalEvent.wh ...
- Azure EventHub快速入门和使用心得
Azure Event Hubs(事件中心)是一个大数据流式数据摄取服务平台,每秒接受数百万事件; EventHubs 是一个有数据保留期限的缓冲区,类似分布式日志:可缩放的关键在于[分区消费模型], ...
- 云计算 docker 容器使用命令
docker 使用命令: docker version 查看docker版本号 vi /etc/docker/daemon.json { "registry-mirrors": [ ...