[考试反思]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:沉淀
稳住阵脚. 还可以. 至少想拿到的分都拿到了,最后一题的确因为不会按秩合并和线段树分治而想不出来. 对拍了,暴力都拍了.挺稳的. 但是其实也有波折,险些被卡内存. 如果内存使用不连续或申请的内存全部使 ...
随机推荐
- redhat 7系统服务工具-systemctl
- Swoole4-swoole创建Mysql连接池
一 .什么是mysql连接池 场景:每秒同时有1000个并发,但是这个mysql同时只能处理400个连接,mysql会宕机. 解决方案:连接池,这个连接池建立了200个和mysql的连接,这1000个 ...
- 【CJOJ】为了博多
Description 做了个噩梦,梦见我的 n 把刀到60级会二次变身,变成一个 对推6图有xi点贡献,刷大阪城有yi点贡献 的刀,于是要把刀分成两队一队刷大阪城另一队推6图 . 但是有m对兄弟刀在 ...
- Cohen-Sutherland算法
Cohen-Sutherland算法 本算法又称为编码裁剪算法,算法的基本思想是对每 条直线段分三种情况处理: (1)若点p1和p 2完全在裁剪窗口内 “简取”之 (2)若点p1(x1,y1)和p2( ...
- CS184.1X 计算机图形学导论 罗德里格斯公式推导
罗德里格斯公式推导 图1(复制自wiki) 按照教程里,以图1为例子,设k为旋转轴,v为原始向量. v以k为旋转轴旋转,旋转角度为θ,旋转后的向量为vrot. 首先我们对v进行分解,分解成一个平行于k ...
- EF通过导航属性取出从表的集合后,无法删除子表
主从表是配了级联删除的,如果通过导航属性去除从表明细删除时将报错The relationship could not be changed because one or more of the for ...
- 渗透测试-基于白名单执行payload--Csc
复现亮神课程 基于白名单执行payload--csc 0x01 Csc.exe C#的在Windows平台下的编译器名称是Csc.exe,如果你的.NET FrameWork SDK安装在C盘,那么你 ...
- HTML 元素居中的方法
网址:http://www.cnblogs.com/asqq/archive/2012/04/09/2438745.html 1. 元素的定位的方法选择 :absolute . 2. 给定元素的宽和高 ...
- 《FFT家族—从不会到崩溃(坑)》读blog笔记
免责声明 原文地址https://blog.csdn.net/linjiayang2016/article/details/80341958,作者linjiayang2016.\text{linjia ...
- [Luogu4550] 收集邮票
题目描述 有n种不同的邮票,皮皮想收集所有种类的邮票.唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是n种邮票中的哪一种是等概率的,概率均为1/n.但是由于凡凡也很喜欢邮票,所 ...