CSPS模拟86-87
模拟86
T1,烧水,按位统计贡献,利用某种sao操作避免数位dp
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
const int mod=;
using namespace std;
int n,m;
int dp1[],sum[];
int bin[];
inline void get1(int x)
{
memset(dp1,,sizeof(dp1));
if(x<)return;
for(int i=;~i;--i)
{
dp1[i]=(x>>(i+))+;
if(x&bin[i])dp1[i]=1ll*bin[i]*dp1[i]%mod;
else{
dp1[i]=1ll*(x>>(i+))*bin[i]%mod;
dp1[i]+=(x&(bin[i]-));++dp1[i];
if(dp1[i]>=mod)dp1[i]-=mod;
}
}
}
int main()
{
for(int i=;i<=;++i)bin[i]=<<i;
int T;scanf("%d",&T);
while(T--)
{
scanf("%d%d",&m,&n);
memset(sum,,sizeof(sum));
get1(n);
for(int i=;i<=;++i)sum[i]+=dp1[i];
get1(m-);
for(int i=;i<=;++i)sum[i]-=dp1[i];
int ans=;const int num=n-m+;
for(int i=;i<=;++i)
{
ans+=2ll*sum[i]%mod*(num-sum[i])%mod*bin[i]%mod;
if(ans>=mod)ans-=mod;
}
ans=((ans%mod)+mod)%mod;
cout<<ans<<endl; }
}
T2,博弈,考场上推出了最小为0时的答案,以为能找出规律,连暴力都没打,kuku
正解为用必败状态筛必胜状态来保证复杂度。%%%脸哥压表,处理出不合法状态hash掉,最后在数组里lower_bound即可。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define re register
using namespace std;
int n,m;
int a[];
char dp[][][];
int main()
{
for(re short i=;i<=;++i)
{
for(re short j=;j<=;++j)
{
for(re short k=;k<=;++k)
{
if(dp[i][j][k])continue;
for(re short o=;o+i<=;++o)dp[i+o][j][k]=;
for(re short o=;o+j<=;++o)dp[i][j+o][k]=;
for(re short o=;o+k<=;++o)dp[i][j][k+o]=;
for(re short o=;o+i<=&&o+j<=;++o)dp[i+o][j+o][k]=;
for(re short o=;o+i<=&&o+k<=;++o)dp[i+o][j][k+o]=;
for(re short o=;o+k<=&&o+j<=;++o)dp[i][j+o][k+o]=;
for(re short o=;o+i<=&&o+k<=&&o+j<=;++o)dp[i+o][j+o][k+o]=;
}
}
}
int T;scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&a[],&a[],&a[]);
if(dp[a[]][a[]][a[]])puts("Yes");
else puts("No");
}
}
T3,dp,对前缀和取max优化。考场上想出了第三维表示四个状态(顶峰,底端,上升,下降),然而没想到转移。
在最外层枚举区间数,对四种状态用4个变量分别维护最优点转移即可。%%%WWB_star,rnb,milk_feng让我认识到自己的错误
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 30040
using namespace std;
int n,K,ans;
int a[N],sum[N],dp[][N][];
const int inf=0x3f3f3f3f;
int main()
{
memset(dp,-0x3f,sizeof(dp));
scanf("%d%d",&n,&K);
for(int i=;i<=n;++i)
scanf("%d",&a[i]),sum[i]=sum[i-]+a[i];
int mi=,ma=,mi2=,ma2=;
for(int i=;i<=n;++i){
dp[][i][]=sum[i]-mi;
dp[][i][]=ma-sum[i];
dp[][i][]=dp[][i][];
dp[][i][]=dp[][i][];
mi=min(mi,sum[i]);ma=max(ma,sum[i]);
}
for(int j=;j<K;++j){
mi=ma=mi2=ma2=-inf;
for(int i=j-;i<=n;++i)
{
dp[j][i][]=max(dp[j][i][],ma+*sum[i]);
dp[j][i][]=max(dp[j][i][],mi-*sum[i]); dp[j][i][]=max(dp[j][i][],mi2);
dp[j][i][]=max(dp[j][i][],ma2);
mi=max(mi,dp[j-][i][]+sum[i]*);
mi=max(mi,dp[j-][i][]+sum[i]*); ma=max(ma,dp[j-][i][]-sum[i]*);
ma=max(ma,dp[j-][i][]-sum[i]*); ma2=max(ma2,dp[j-][i][]);
ma2=max(ma2,dp[j-][i][]); mi2=max(mi2,dp[j-][i][]);
mi2=max(mi2,dp[j-][i][]);
}
}
mi=ma=mi2=ma2=-inf;
for(int i=K-;i<=n;++i)
{
dp[K][i][]=max(dp[K][i][],ma+sum[i]);
dp[K][i][]=max(dp[K][i][],mi-sum[i]); dp[K][i][]=max(dp[K][i][],mi2);
dp[K][i][]=max(dp[K][i][],ma2); mi=max(mi,dp[K-][i][]+sum[i]);
mi=max(mi,dp[K-][i][]+sum[i]); ma=max(ma,dp[K-][i][]-sum[i]);
ma=max(ma,dp[K-][i][]-sum[i]); ma2=max(ma2,dp[K-][i][]);
ma2=max(ma2,dp[K-][i][]); mi2=max(mi2,dp[K-][i][]);
mi2=max(mi2,dp[K-][i][]); ans=max(ans,dp[K][i][]);
ans=max(ans,dp[K][i][]);
}
printf("%d\n",ans);
}
300 | 145 | 120 | 50 | 110 | 220 | 122 | 160 | 130 |
这个故事告诉我们:rp是个好东西(别败光了)
模拟87,新的开始,勉强苟住位置(抢到Dybala的第八)
T1,(妹子)maze
考场上想了半天才想到是二分答案。然后就疯狂码码码,打了个代码测时长,发现极限数据甚至会达到十几秒,然后疯狂卡常
最后当我手打堆打到一半,发现我的结构体重载运算符重载反了,赶紧改过来,发现还剩1分钟,慌的一比。。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<bitset>
#include<vector>
#include<cmath>
#include<queue>
#define N 105
using namespace std;
const double eps=1e-;
const int dx[]={,-,,};
const int dy[]={,,,-};
int n,m,sx,sy,tx,ty;
bool vst[N][N];
double dis[N][N],s;
int a[N][N];
struct node{
int x;
int y;
double z;
friend bool operator <(const node &a,const node &b)
{return a.z>b.z;}
};
/*
struct QAQ{
node a[100500];
int tot;
inline int size(){return tot;}
inline void clear(){tot=0;}
inline node top(){return a[1];}
inline void pop()
{
a[1]=a[tot++];int i=1,j;
while(1)
{
j=i<<1;
if(j>tot)return;
if(a[j+1]<a[j])
}
} }
*/
priority_queue<node>q;
inline void init()
{
for(register int i=;i<=n;++i)
for(register int j=;j<=m;++j)
dis[i][j]=1000000.0;
}
inline node mknd(int x,int y,double z)
{
node a;a.x=x,a.y=y,a.z=z;return a;
}
inline void dijk(double val)
{
while(q.size())q.pop();init();
dis[sx][sy]=0.0;
q.push(mknd(sx,sy,0.0));
int xx,yy,x,y;double z;
while(q.size())
{
x=q.top().x;y=q.top().y;z=q.top().z;q.pop();
if(z!=dis[x][y])continue;if(x==tx&&y==ty)return;
for(register int i=;~i;--i)
{
xx=x+dx[i];yy=y+dy[i];
if(a[xx][yy])continue;
if(dx[i])
{
if(dis[xx][yy]>z+val)
{
dis[xx][yy]=z+val;
q.push(mknd(xx,yy,dis[xx][yy]));
}
}
else
{
if(dis[xx][yy]>z+1.0)
{
dis[xx][yy]=z+1.0;
q.push(mknd(xx,yy,dis[xx][yy]));
}
}
}
}
}
inline void work()
{
double l=0.0,r=s,mid;
while(r-l>3e-){
mid=(l+r)*0.5;dijk(mid);
if(dis[tx][ty]-s>0.0)r=mid;
else l=mid;
if(fabs(dis[tx][ty]-s)<5e-){l=mid;break;}
// printf("%.10lf %.10lf\n",l,r);
}
printf("%.3lf\n",l);
}
int main()
{
// freopen("da.in","r",stdin);//freopen("my.out","w",stdout);
scanf("%d%d%d%d%d%d",&n,&m,&sx,&sy,&tx,&ty);
for(int i=;i<=n;++i)
for(int j=,x;j<=m;++j)
scanf("%d",&x),a[i][j]=x; a[sx][sy]=a[tx][ty]=;
dijk(1.0);if(dis[tx][ty]>100000.0)return ;
for(int i=;i<=n;++i)a[i][]=a[i][m+]=;
for(int i=;i<=m;++i)a[][i]=a[n+][i]=;
scanf("%lf",&s);work();return ;
}
/*
4 4
1 1 4 4
0 0 1 1
1 0 0 0
0 0 1 0
0 0 0 0
5
*/
T2,bird
线段树稍显然,考虑去除重复贡献,用到了一些差分的思想,在左端点加入区间,右点存左点,dp值单点插入时暂且不加当前贡献,扫到右端点再加,保证不重复
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<bitset>
#include<vector>
#include<queue>
#define N 500050
using namespace std;
int n,m;
vector<int>v[N];
int sum[N],dp[N];
struct node{
int l,r;
}q[];
int A,ans;
int ma[N<<],tag[N<<];
inline void upd(int g){ma[g]=max(ma[g<<],ma[g<<|]);}
inline void down(int g)
{
tag[g<<]+=tag[g];
ma[g<<]+=tag[g];
tag[g<<|]+=tag[g];
ma[g<<|]+=tag[g];
tag[g]=;
}
inline void add(int g,int l,int r,int x,int y,int v)
{
if(l>y||r<x)return;
if(l>=x&&r<=y){ma[g]+=v;tag[g]+=v;return;}
if(tag[g])down(g);
const int m=l+r>>;
add(g<<,l,m,x,y,v);add(g<<|,m+,r,x,y,v);
upd(g);
}
inline int ask(int g,int l,int r,int x,int y)
{
if(l>y||r<x)return ;
if(l>=x&&r<=y)return ma[g];
if(tag[g])down(g);
const int m=l+r>>;
const int a1=ask(g<<,l,m,x,y),a2=ask(g<<|,m+,r,x,y);
if(a1>a2)return a1;return a2;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=,l,r;i<=n;++i)
{
scanf("%d%d",&l,&r);
if(r<)continue;
if(l<)l=;
v[r+].push_back(l);
if(r>A)A=r;
++sum[l];
}
++A;int al=;
for(int i=;i<=A;++i)
{
al+=sum[i];
for(int j=;j<v[i].size();++j)
add(,,A,v[i][j],i-,),--al;
dp[i]=ask(,,A,,i-m);
ans=max(ans,dp[i]+al);
add(,,A,i,i,dp[i]);
}
cout<<ans<<endl;
return ;
}
T3,%%%脸哥
话说脸哥是不是把推荐和反对放反了啊?
CSPS模拟86-87的更多相关文章
- csp-s模拟测试87
csp-s模拟测试87 考场状态还可以$T1$我当时以为我秒切,$T2$确认自己思路不对后毅然决然码上,$T3$暴力挂了太可惜了. 03:01:28 03:16:07 03:11:38 140 03: ...
- CSPS模拟 86
看见异或两个字就孩怕 T1 按位? T2 这道异或稍水啊233 貌似可以打表找找规律 emm七种转移,有重复刷表 优化一下? T3 skyh已经接了2杯水了(实际情况他已经ak了) cbx开始抬头傻笑 ...
- csps模拟86异或,取石子,优化题解
题面:https://www.cnblogs.com/Juve/articles/11736440.html 异或: 考试时只想出了暴力 我们可以对于二进制下每一位w,求出[l,r]中有几个数在这一位 ...
- 2019.10.25 csp-s模拟测试87 反思总结
一次非常神奇的考试,考完试以后看着T2的0pts突然笑死我自己 太智障了这什么神奇的题意理解错误23333 T1一眼分类讨论,两眼二分,觉得分类讨论有点玄学但是出题人八成不会卡[何],然后本着对二分的 ...
- csp-s模拟测试86
csp-s模拟测试86 分屋前的最后一次考试,我早就放弃了自己. 02:02:46 70 02:02:57 03:16:08 100 03:16:08 $T1$忘了按位计算,达哥按位计算的$T1$当时 ...
- 反省——关于csp-s模拟50
本人于搜索csp-s模拟49题解时,有意识地点开了一篇关于csp-s模拟50T2的题解,并知道了题解是二维前缀和以及四维偏序. 更重要的是,那篇博客说有解法二,叫二维莫队. 于是我上网搜索二维莫队,结 ...
- csp-s模拟测试99
csp-s模拟测试99 九九归一直接爆炸. $T1$一眼板子. $T2$一眼语文题(语文的唯一一次$120+$是给模拟出来的可知我的语文能力). $T3$一眼普及题. ?? Hours Later 板 ...
- csp-s模拟测试98
csp-s模拟测试98 $T1$??不是我吹我轻松手玩20*20.$T2$装鸭好像挺可做?$T3$性质数据挺多提示很明显? $One$ $Hour$ $Later$ 这$T1$什么傻逼题真$jb$难调 ...
- csp-s模拟测试97
csp-s模拟测试97 猿型毕露.水题一眼秒,火题切不动,还是太菜了. $T1$看了一会儿感觉$woc$期望题$T1??$假的吧??. $T2$秒. $T3$什么玩意儿. 40 01:24:46 00 ...
随机推荐
- k8s安装ingress
1. 环境准备 安装nginx-ingress-controller和backend cd /etc/yum.repos.d/mainfests 下载镜像的脚本 vi ingressnginx.sh ...
- vsCode 代码不高亮显示的问题——安装Vetur插件
vsCode 代码不高亮显示: 解决办法:安装Vetur插件 点击左侧菜单的扩展-->搜索Vetur-->点击安装-->安装完成重启vsCode
- springboot笔记04——读取配置文件+使用slf4j日志
前言 springboot常用的配置文件有yml和properties两种,当然有必要的时候也可以用xml.我个人更加喜欢用yml,所以我在这里使用yml作为例子.yml或properties配置文件 ...
- VBA嵌套if语句
一个If或ElseIf语句可以嵌套在另一个If或ElseIf语句中.内部的If语句是根据最外层的If语句执行的.这使得VBScript能够轻松处理复杂的条件. 语法 以下是VBScript中嵌套的If ...
- vue -- 数组过滤 filter (vue 表格)
如下图: 左边表格滑动滚轮,可以自动赋值右边表格: 现在是后台只有一个接口,把整个页面的数据全部返回出来了, 左边表格滑动到每一项时显示右边表格内容,但是需要code相同: 问题: 右边表格 ...
- python 复制列表
python的变量仅仅是指向对象的标签,所以在操作列表的时候,list1 = list2这种做法只会复制一个标签,然后指向对象,并非生成一个新的对象. 大致有5中方法可以复制列表: a = [1,2, ...
- Java集合框架介绍。Java Collection Frameworks = JCF
Java集合框架 = Java Collection Frameworks = JCF . 为了方便理解,我画了一张思维脑图.
- Vue指令之`v-for`和`key`属性
2.2.0+ 的版本里,**当在组件中使用** v-for 时,key 现在是必须的. 当 Vue.js 用 v-for 正在更新已渲染过的元素列表时,它默认用 “**就地复用**” 策略.如果数据项 ...
- selenium模拟H5触摸滑动之-TouchAction
最近做移动端H5页面的自动化测试时候,需要模拟一些上拉,下滑的操作,最初考虑使用使用selenium ActionChains来模拟操作,但是ActionChains 只是针对PC端程序鼠标模拟的一系 ...
- cdh的web管理界面503
503 Service Unavailable No server is available to handle this request. 重启 agent 以及 server