[CSP-S模拟测试60]题解
回去要补一下命运石之门了……
A.嘟嘟噜
给定报数次数的约瑟夫,递推式为$ans=(ans+m)\% i$。
考虑优化,中间很多次$+m$后是不用取模的,这种情况就可以把加法变乘法了。问题在于如何找到下一次需要取模的位置。
解不等式$ans+km \ge i+k$即可,需要处理一下边界。
据说可以证明复杂度是$O(m \log n)$的,但我不是很会。
//考场代码 稍丑
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
int n,m,T,ans=1;
void qj()
{
for(int i=1;i<=n;i++)
ans=(ans+m)%i;
printf("%d\n",ans+1);
}
void work()
{
ans=1;
n=read();m=read();
if(m==1)
printf("%d\n",n);
else if(n<=m)qj();
else
{
ans=1;
for(int i=1;i<=n;i++)
{
if(ans+m<i)
{
ans+=m;
int times=(i-ans)/(m-1);
if(i+times>n)
times=n-i;
ans+=times*m;i+=times;
ans%=i;
}
else ans=(ans+m)%i;
}
printf("%d\n",ans+1);
}
return ;
}
int main()
{
T=read();
while(T--)work();
return 0;
}
B.天才绅士少女助手克里斯蒂娜

C.凤凰院凶真
经典的LCIS问题。设$dp[i][j]$为a串考虑到$i$,b串考虑到$j$且以$j$为结尾的LCIS长度。
限定一下条件,$O(n^3)$暴力dp就很好写了。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<stack>
using namespace std;
int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
const int N=5005;
#define pa pair<int,int>
int n,m,a[N],b[N],dp[N][N],pre[N][N];
stack<int> s;
int main()
{
n=read();
for(int i=1;i<=n;i++)
a[i]=read();
m=read();
for(int i=1;i<=m;i++)
b[i]=read();
int ans1=-1,pos=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
dp[i][j]=dp[i-1][j];
if(a[i]==b[j])
{
for(int k=0;k<j;k++)
if(b[k]<b[j])
if(dp[i][j]<dp[i-1][k]+1)
dp[i][j]=dp[i-1][k]+1,pre[i][j]=k;
}
}
for(int i=0;i<=m;i++)
if(ans1<dp[n][i])ans1=dp[n][i],pos=i;
int tim=n;
s.push(pos);
cout<<ans1<<endl;
while(tim&&pos)
{
if(pre[tim][pos])
{
pos=pre[tim][pos];
s.push(pos);
}
else tim--;
}
while(!s.empty())printf("%d ",b[s.top()]),s.pop();
putchar('\n');
return 0;
}
考虑优化。我们注意到,每次转移的条件是$a[i]=b[j] \ and\ b[j]<b[k]$,即$a[i]=b[j] \ and\ a[i]<b[k]$。j每次增加1,这个可选集合最多也只会增加1。所以可以直接去掉枚举k的循环,维护当前可选集合的最优解即可。
还有一个细节,记录前驱时要把两维的信息都记录,如果只记第二维的话各层状态会混用。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<stack>
using namespace std;
int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
const int N=5005;
#define pa pair<int,int>
int n,m,a[N],b[N],dp[N][N],pre[N][N];
stack<int> s;
int main()
{
n=read();
for(int i=1;i<=n;i++)
a[i]=read();
m=read();
for(int i=1;i<=m;i++)
b[i]=read();
int ans1=-1,pos=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
dp[i][j]=dp[i-1][j];
if(a[i]==b[j])
{
for(int k=0;k<j;k++)
if(b[k]<b[j])
if(dp[i][j]<dp[i-1][k]+1)
dp[i][j]=dp[i-1][k]+1,pre[i][j]=k;
}
}
for(int i=0;i<=m;i++)
if(ans1<dp[n][i])ans1=dp[n][i],pos=i;
int tim=n;
s.push(pos);
cout<<ans1<<endl;
while(tim&&pos)
{
if(pre[tim][pos])
{
pos=pre[tim][pos];
s.push(pos);
}
else tim--;
}
while(!s.empty())printf("%d ",b[s.top()]),s.pop();
putchar('\n');
return 0;
}
[CSP-S模拟测试60]题解的更多相关文章
- csp-s模拟测试60
csp-s模拟测试60 2019-10-05 RT. 又颓又垃圾. 状态低迷,题都交不上去. 交了也是爆零,垃圾玩家没有什么可说的,就是垃圾. A. 嘟嘟噜 $mlogn$的毒瘤做法. 贴 ...
- csps-s模拟测试60嘟嘟噜,天才绅士少女助手克里斯蒂娜,凤凰院凶真题解
题面:https://www.cnblogs.com/Juve/articles/11625190.html 嘟嘟噜: 约瑟夫问题 第一种递归的容易re,但复杂度较有保证 第二种适用与n大于m的情况 ...
- CSP-S 模拟测试 51 题解
考试过程: 惯例先看一遍三道题,T1 一开始反应要求割点,但是这是有向图,肯定不能求割点,康了一下数据范围,有40%是树的,还不错,决定待会在打. 看T2 字符串题,完了我字符串最弱了,肯定只能打暴力 ...
- [NOIP模拟测试38]题解
来自达哥的问候…… A.金 显然本题的考察点在于高精而不是裴蜀定理 根据裴蜀定理易得答案为Yes当且仅当$gcd(n,m)=1$,那么考虑怎么在高精度下判互质. 如果$n,m$都能被2整除,那么显然不 ...
- CSP-S 模拟测试94题解
T1 yuuustu: 可以对两边取对数,然后就转化为两个double的比较,时间复杂度$O(n)$ 然后我就用神奇0.4骗分水过 #include<bits/stdc++.h> usin ...
- CSP-S模拟测试 88 题解
T1 queue: 考场写出dp柿子后觉得很斜率优化,然后因为理解错了题觉得斜率优化完全不可做,只打了暴力. 实际上他是可以乱序的,所以直接sort,正确性比较显然,贪心可证,然后就是个sb斜率优化d ...
- CSP-S 模拟测试92 题解
话说我怎么觉得我没咕多长时间啊,怎么就又落了20多场题解啊 T1 array: 根据题意不难列出二元一次方程,于是可以用exgcd求解,然而还有一个限制条件就是$abs(x)+abs(y)$最小,这好 ...
- CSP-S 模拟测试57题解
人生第一次A,B层一块考rank2,虽然说分差没几分,但还是值得纪念. 题解: T1 天空龙: 大神题,因为我从不写快读也没有写考场注释的习惯,所以不会做,全hzoi就kx会做,kx真大神级人物. T ...
- CSP-S 模拟测试 45 题解
由于咕掉的题解太多了,所以只能趁改完不动题的时间,来补补坑qwq,还是太弱了. 考试过程: 到新机房的第一次考试,貌似海星? 第一题一开始就觉得是个贪心,但以为所有小怪兽都要打完,所以想复杂了,但后来 ...
随机推荐
- 转载:AWR介绍使用
转载自 http://www.cnblogs.com/lanzi/archive/2011/03/07/1975096.html 自动工作负载库(Automatic Workload Reposito ...
- 建站手册-网站构建:万维网联盟(World Wide Web Consortium)
ylbtech-建站手册-网站构建:万维网联盟(World Wide Web Consortium) 1.返回顶部 1. http://www.w3school.com.cn/site/site_w3 ...
- linux composer 安装与应用
linux下composer安装与简单应用-------------------------------------安装------------------------------------//下载 ...
- javascript获取网页宽高,屏幕宽高,屏幕分辨率等
<script> var s = ""; s += "\r\n网页可见区域宽:"+ document.body.clientWidth; s + ...
- 科普:std::sort干了什么
std::sort算是STL中对OIer比较友好的函数了,但你有想过sort是如何保证它的高速且稳定吗? 正文 我们首先来到第一层:sort函数 template<typename _Rando ...
- git笔记十:本地仓库同步到gitlab
本地仓库同步到gitlab 帮助文档 git remote --help 操作场景: 本地创建git仓库(含有readme.md文件), commit了三次 gitlab网站创建了一个项目 添加了re ...
- Scrapy框架: Request回调函数
Request回调函数 def parse_page1(self, response): return scrapy.Request("http://www.example.com/some ...
- python面试题之有没有一个工具可以帮助查找python的bug和进行静态的代码分析?
pycheck pylint 本文首发于python黑洞网,博客园同步更新
- git 查看文件修改
查看某个文件的修改历史: 用git log -p filename. git blame filename是查看目前的每一行是哪个提交最后改动的. 查看某次提交修改列表: git show 版本号 ...
- A re-introduction to JavaScript (JS Tutorial) 转载自:https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript
A re-introduction to JavaScript (JS Tutorial) Redirected from https://developer.mozilla.org/en-US/do ...