[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,还是太弱了. 考试过程: 到新机房的第一次考试,貌似海星? 第一题一开始就觉得是个贪心,但以为所有小怪兽都要打完,所以想复杂了,但后来 ... 
随机推荐
- vue.js循环语句
			vue.js循环语句 循环使用 v-for 指令. v-for 指令需要以 site in sites 形式的特殊语法, sites 是源数据数组, site 是数组元素迭代的别名. v-for 可以 ... 
- window 任务管理器
			用的是win10 系统,一般window都差不多. 1.查看进程: 2.查看端口:性能 --> 打开资源资源监视器 --> 网络 --> 侦听端口 3.查看磁盘活动(查看文件被哪个进 ... 
- [CSP-S模拟测试]:喝喝喝(模拟)
			题目描述 奥利维尔和雪拉扎德在喝酒.两人连喝$18$瓶后,奥利维尔最终倒下了.奥利维尔服用了教会研究的醒酒药后,因为服用了太多产生了副作用,第二天睡不着了.他只好用数数的方式度过无聊的时光,不过他毕竟 ... 
- Majordomo Info  VGER.KERNEL.ORG
			This is VGER.KERNEL.ORG Majordomo Info The mission of vger.kernel.org is to provide email list servi ... 
- linux显示文本文件指定行数的数据
			sed -n '2,4p' /core/home_info.txt 显示这个txt的2-4行,此外还有 cat /core/home_info.txt | tail -n 1000:显示最后100 ... 
- STM32几个IO的工作模式
			浮空,顾名思义就是浮在空中,上面用绳子一拉就上去了,下面用绳子一拉就沉下去了. 开漏,就等于输出口接了个NPN三极管,并且只接了e,b. c极 是开路的,你可以接一个电阻到3.3V,也可以接一个电阻 ... 
- 配置github的pull request触发jenkins自动构建
			参照: https://www.cnblogs.com/zanjiahaoge666/p/6402738.html 之前的配置,都是向master分支push操作触发jenkins进行构建,但是在一般 ... 
- ExecutorException: A query was run and no Result Maps were found for the Mapped Statement ‘com.win.mall.dao.CartMapper.test’. It’s likely that neither a Result Type nor a Result Map was specified.
			ExecutorException: A query was run and no Result Maps were found for the Mapped Statement 'com.win.m ... 
- trizip haskell implementation
			1 trizip :: [a] -> [b] -> [c] -> [(a,b,c)] 2 trizip a b c 3 | null a = [] 4 | null b = [] 5 ... 
- ABAP字符串处理
			字符串中包含单引号:单引号前面再加一个单引号 例:jest~stat = 'E0002' jest~stat = 'E0003' OR jest~stat = 'E0004' IF z_stat IS ... 
