四川大学第二届SCUACM新生赛(同步赛)题解
周末没事干,就不要脸地去一边吃饭一边看学弟沈阳拿银一边水了个比赛,水都水了,简单写个题解。
A,丁姐姐喜欢Fibonacci。签到1,斐波那契%3 1 1 0 1 1 0 1 1 0。。。,判断模3等于0就好了
#include<cstdio>
typedef long long ll;
int main(){
ll n;
while(~scanf("%lld",&n)){
if(n%==) printf("\"odd\"\n");
else printf("\"even\"\n");
}
return ;
}
A
B.丁姐姐喜欢LCS。签到2.找最长的首尾相接的,那直接枚举答案的长度,然后进行暴力匹配。
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=2e3+;
char a[N],b[N];
int main(){
while(~scanf("%s%s",a+,b+)){
int lena=strlen(a+),lenb=strlen(b+),ans=;
for(int i=min(lena,lenb),j;i>=;i--){
for(j=;j<=i;j++) if(b[j]!=a[lena-i+j]) break;
if(j>i){
ans=i;
break;
}
}
if(ans==) printf("\"NULL!\"");
else for(int i=;i<=ans;i++) printf("%c",b[i]);
printf("\n");
}
return ;
}
B
C.俏兔子大战傻贼鹰-Easy Version。简单模拟,判断一下有三张的牌的个数还有两张牌的个数即可,话说数据有点水,居然没有六张一样的牌
#include<cstdio>
#include<cstring>
char op,s[];
int num[][];
int main(){
int t,lens;
while(~scanf("%d",&t)){
getchar();
scanf("%c",&op);
while(t--){
scanf("%s",s);
lens=strlen(s);
bool flag=true;
for(int i=;i<lens;i+=){
int op1=s[i]-'',op2;
if(s[i+]=='S') op2=;
else if(s[i+]=='T') op2=;
else op2=;
num[op1][op2]++;
if(s[i+]==op){
flag=false;
break;
}
}
int num1=,num2=;
for(int i=;i<=;i++)
for(int j=;j<;j++){
if(num[i][j]==) num1++;
else if(num[i][j]==) num2++;
num[i][j]=;
}
if(flag&&((num1==&&num2==)||num2==)) printf("Yes\n");
else printf("No\n");
}
}
return ;
}
C
D.俏兔子大战傻贼鹰-Hard Version。简单模拟2,改一下判断条件那里即可,优先三张连续的再考虑三张一样的。
#include<cstdio>
#include<cstring>
char op,s[];
int num[][];
int main(){
int t,lens;
while(~scanf("%d",&t)){
getchar();
scanf("%c",&op);
while(t--){
scanf("%s",s);
lens=strlen(s);
bool flag=true;
for(int i=;i<lens;i+=){
int op1=s[i]-'',op2;
if(s[i+]=='S') op2=;
else if(s[i+]=='T') op2=;
else op2=;
num[op1][op2]++;
if(s[i+]==op){
flag=false;
break;
}
}
int num1=,num2=;
for(int i=;i<=;i++)
for(int j=;j<;j++){
if(i<=){
while(num[i][j]&&num[i+][j]&&num[i+][j]){
num[i][j]--;
num[i+][j]--;
num[i+][j]--;
num1++;
}
}
if(num[i][j]>=) num1++;
if(num[i][j]==) num2++;
num[i][j]=;
}
if(flag&&((num1==&&num2==)||num2==)) printf("Yes\n");
else printf("No\n");
}
}
return ;
}
D
E.[模板]欧拉筛。简单数学题,用不到欧式筛,埃式筛即可,不过我平时都是用欧式筛。入手点,在模数p是1e5级别的数,大于模数的阶乘取模后都为0就不用考虑了,所以先预处理出1e5内素数,然后for到min(n,p)来计算答案就好。
#include<cstdio>
typedef long long ll;
const int N=1e5+;
bool nop[N];
int pn,pri[N];
void init(){
for(int i=;i<N;i++){
if(!nop[i]) pri[pn++]=i;
for(int j=;j<pn;j++){
if(1ll*i*pri[j]>=N) break;
nop[i*pri[j]]=true;
if(i%pri[j]==) break;
}
}
}
int main(){
init();
int t,n,p;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&p);
ll jc=,ans=;
for(int i=;i<=p&&i<=n;i++){
jc=jc*i%p;
if(!nop[i]) ans=(ans+jc)%p;
}
printf("%d\n",ans);
}
return ;
}
E
F.[模板]后缀自动机。思维题。要是真的后缀自动机我还真不会。首先我们肯定可以想到是用S的最小后缀去跟T的最小前缀比较即可,S的最小后缀怎么求,后缀自动机?最小表示法?好像都不会,那么我们看T的最小前缀,那不就是第一个字符吗,所以只要判断S中有字典序小于T的第一个字符的字符即可。
#include<cstdio>
#include<cstring>
const int N=2e5+;
char s1[N],s2[N];
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%s%s",s1,s2);
int lens1=strlen(s1);
bool flag=false;
for(int i=lens1-;i>=;i--) if(s2[]>s1[i]){
flag=true;
break;
}
if(flag) printf("YE5\n");
else printf("N0\n");
}
return ;
}
F
G.走迷宫。数学题。可以看出就是螺旋矩阵给出序号求坐标,那么把它划分一层层,第一层的个数就有m+n-1+m-1+n-2也就是2*(n+m-2)个,第二层便是n-2,然后m-2,跟第一场的差便是8个,所以这是个等差数列,那么根据等差数列求和,我们就可以判断出给出的序号在哪一层,然后确定了在哪一层,再根据它在一条边判断即可,需要注意的是n=1,和m=1时的情况。
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
void solve(ll n,ll m,ll k){
if(k>=n*m) k=n*m;
ll d=((n+m)*-ceil(sqrt((n+m)*(n+m)*-k*)))/;
d=min(min(n/,m/),d);
ll x=+d,y=+d;
k-=(d*(n+m)*-d*d*)/;
n-=d*,m-=d*;
if(!k) y--;
else if(n==) y+=k-;
else if(m==) x+=k-;
else{
if(k<=m) y+=k-;
else if(k<=n+m-) y+=m-,x+=k-m;
else if(k<=n+m*-) x+=n-,y+=m*+n-k-;
else x+=(n+m)*-k-;
}
printf("(%d,%d)\n",x,y);
}
int main(){
int t,q;
ll n,m,k;
scanf("%d",&t);
while(t--){
scanf("%lld%lld",&n,&m);
scanf("%d",&q);
while(q--){
scanf("%lld",&k);
solve(n,m,k+);
}
}
return ;
}
G
H.捡金币。二维前缀和,个人感觉最难的一题吧。根据题意我们要求的就是一个菱形里的点权值和,但我只维护过正的矩形的和,没整过菱形的和,那咋办呢。通过点旋转公式,把整个图形旋转45度,它不就正的了吗,这时再维护这个正的二维前缀和即可。点旋转公式可以自行百度,然后旋转之后原先的坐标(x,y)便成了(√2/2(x+y),√2/2(x-y)),然后我们整体放大√2倍,就成了(x+y,x-y),x-y会存在负数,那便再加上y轴的偏移量,最后便是(x+y,x-y+m),因为k的点的绝对值坐标距离,所以不需要方法√2倍,否则要是两点之间的欧式距离的话,则也需要放大√2倍。
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=2e3+;
ll sum[N][N];
int main(){
int t,n,m,q,x,y,k;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(int i=;i<=n+m;i++)
for(int j=;j<=n+m;j++) sum[i][j]=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++){
x=i+j;y=i-j+m;
scanf("%lld",&sum[x][y]);
}
for(int i=;i<=n+m;i++)
for(int j=;j<=n+m;j++)
sum[i][j]+=sum[i-][j]+sum[i][j-]-sum[i-][j-];
scanf("%d",&q);
int lx,ly,rx,ry;
while(q--){
scanf("%d%d%d",&x,&y,&k);
lx=max(,x+y-k),ly=max(,x-y+m-k);
rx=min(n+m,x+y+k),ry=min(n+m,x-y+m+k);
printf("%lld\n",sum[rx][ry]-sum[rx][ly-]-sum[lx-][ry]+sum[lx-][ly-]);
}
}
return ;
}
H
I.排序。模拟,弄个结构体,照着题意来即可。
#include<cstdio>
#include<iostream>
#include<tr1/unordered_map>
#include<algorithm>
using namespace std;
const int N=;
struct Node{
string name;
int ts,zsj,tj[N],tg[N],sj[N];
bool operator<(const Node &n1)const{
return ts==n1.ts ? (zsj==n1.zsj ? name<n1.name : zsj<n1.zsj): ts>n1.ts;
}
}a[N];
tr1::unordered_map<string,int> mmp;
int main(){
int t,n,m;
string s;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
mmp.clear();
for(int i=;i<=m;i++){
cin>>s;
a[i].name=s;
mmp[s]=i;
for(int j=;j<=n;j++){
a[i].ts=a[i].zsj=;
a[i].tg[j]=a[i].tj[j]=a[i].sj[j]=;
}
}
int q,id,th,sj;
scanf("%d",&q);
while(q--){
cin>>s;id=mmp[s];
cin>>sj;cin>>s;th=s[]-'A'+;
cin>>s;
if(a[id].tg[th]) continue;
if(s[]=='A'){
a[id].tg[th]=;a[id].ts++;
a[id].sj[th]=sj;
a[id].zsj+=sj+*a[id].tj[th];
a[id].tj[th]++;
}else if(s[]!='C') a[id].tj[th]++;
}
sort(a+,a++m);
for(int i=,ra=;i<=m;i++){
if(i>&&(a[i].ts!=a[i-].ts||a[i].zsj!=a[i-].zsj)) ra=i;
cout<<ra<<" "<<a[i].name<<" "<<a[i].ts<<" "<<a[i].zsj;
for(int j=;j<=n;j++){
printf(" ");
if(a[i].tg[j]){
printf("+%d(%d)",a[i].tj[j],a[i].sj[j]);
}else printf("-%d",a[i].tj[j]);
}
printf("\n");
}
if(t) printf("\n");
}
return ;
}
I
J.n=a*b*c,数学题,由x*y<=n有x<=√n||y<=√n,那么√n枚举两个数,然后求第三个数,再更新一下答案即可。
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int main(){
int t,n,m;
scanf("%d",&t);
while(t--){
scanf("%d",&n);m=(int)sqrt(n);
int a=,b=-,c=n+,aa,bb,cc;
for(int i=;i<=m;i++)
for(int j=;j<=m;j++){
if(n%(i*j)!=||i*j==n) continue;
aa=min(min(i,j),n/(i*j));
cc=max(max(i,j),n/(i*j));
bb=i+j+n/(i*j)-aa-cc;
if(cc-aa<c-a||(cc-aa==c-a&&aa<a)) a=aa,b=bb,c=cc;
}
if(a==) printf("No solution\n");
else printf("%d=%d*%d*%d\n",n,a,b,c);
}
return ;
}
J
K.梅森素数,3 7 31 127 8191,就这样吧。
L.双流机场。思维题,一开始看错题意了,以为左上角能到其他地方即可,错了一发。然后仔细一看题意是任意两点可达,那就简单了。处于中间的点肯定会有能到达它并且从它出去的路线,所以我们只需要判读四个角不是没有进入的路线,或者没有出去的路线即可。
#include<cstdio>
const int N=1e5+;
char a[N],b[N];
int main(){
int t,n,m;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
scanf("%s%s",a+,b+);
if(a[]!=b[]) printf("Sad\n");
else if(a[]==b[m]) printf("Sad\n");
else if(a[n]==b[]) printf("Sad\n");
else if(a[n]!=b[m]) printf("Sad\n");
else printf("Happy\n");
}
return ;
}
L
M.lglg说要有题,于是便有了题。额,打表题,垃圾精度,怪恶心的,根据题目打表来观察即可,但精度很恶心恶心恶心。就小于3输出0,小于29输出1,小于11789输出2,其他输出3。
四川大学第二届SCUACM新生赛(同步赛)题解的更多相关文章
- 西南民族大学第十二届程序设计竞赛(同步赛) A.逃出机房 (bfs)
题意:有来两个人A和B,A追B,A和B每次向上下左右移动一个单位,一共有两扇门,问A是否可以追上B(在门口追上也算合法). 题解:当时看题意说在门口也算?就觉得是判断两个人到门口的时间,对他们两个人分 ...
- 南理第八届校赛同步赛-F sequence//贪心算法&二分查找优化
题目大意:求一个序列中不严格单调递增的子序列的最小数目(子序列之间没有交叉). 这题证明贪心法可行的时候,可以发现和求最长递减子序列的长度是同一个方法,只是思考的角度不同,具体证明并不是很清楚,这里就 ...
- 南理第八届校赛同步赛-C count_prime//容斥原理
大致思路就是先求出n的质因数假设是a1-an,然后在1-a的区间里面查找至少能整除{a1,a2...an}中一个元素的数有多少个,对1-b也做相同的处理,而找出来的元素肯定是与n不互质的,那么把区间的 ...
- NOIP2013,复赛及同步赛,报名及比赛,专题页面
本通知的对象仅仅是福州第十九中学的学生 所有参加复赛以及同步赛的选手,请务必要仔细阅读:<关于CCF NOIP2013复赛有关事宜的通知>,里面有比赛的时间.地点.以及比赛费用的说明. 参 ...
- Minieye杯第十五届华中科技大学程序设计邀请赛现场同步赛 I Matrix Again
Minieye杯第十五届华中科技大学程序设计邀请赛现场同步赛 I Matrix Again https://ac.nowcoder.com/acm/contest/700/I 时间限制:C/C++ 1 ...
- NOI Day1线上同步赛梦游记
Preface 第一次体验NOI,虽然不是正式选手,但是打打同步赛还是挺涨姿势的,也算是体验了一把. Day1很爆炸,一方面是NOI题目的难度高于自身的水平,另一方面也出现了比较大的失误,T1一个数组 ...
- NOI 2018网络同步赛(游记?)
刚中考完那段时间比较无聊,报名了一个同步赛,报完名才发现成绩单是要挂到网上的,而且因为报的早给了一个很靠前的考号...那布星啊,赶紧学点东西,于是在一周内学了网络流,Treap以及一些数论. Day1 ...
- 【NOI 2019】同步赛 / 题解 / 感想
非常颓写不动题怎么办…… 写下这篇博客警示自己吧…… 游记 7.16 我并不在广二参加 NOI,而是在距离广二体育馆一公里远的包间打同步赛(其实就是给写不动题找个理由) 上午身体不舒服,鸽了半天才看题 ...
- 2021NOI同步赛
\(NOI\) 网上同步赛 明白了身为菜鸡的自己和普通人的差距 DAY1 \(T1\) 轻重边 [题目描述] 小 W 有一棵 \(n\) 个结点的树,树上的每一条边可能是轻边或者重边.接下来你需要对树 ...
随机推荐
- 全面优化MySQL
MySQL性能瓶颈原因 硬件.系统因素 CPU 磁盘I/O 网络性能 操作系统争用 MySQL相关因素 数据库设计 索引.数据类型 应用程序性能 特定请求.短时事务 配置变量 缓冲区.高速缓存.Inn ...
- 小贴士--java篇
1. java: “.”和“|”都是转义字符,必须得加"\\" 2.java :如果在一个字符串中有多个分隔符,可以用“|”作为连字符,比如:“acount=? and uu = ...
- fabric.js 知识点整理
fabric.js是一个很好用的 canvas 操作插件,下面整理了一些平时项目中用到的知识点: //1: 获得画布上的所有对象: var items = canvas.getObjects(); / ...
- Springboot对JPA的支持及使用
目的: 1.springboot之jpa支持 2.Springboot+bootstrap界面版之增删改查及图片上传 springboot之jpa支持 导入相关pom依赖 <dependency ...
- IAT Hook 原理分析与代码编写
Ring 3层的 IAT HOOK 和 EAT HOOK 其原理是通过替换IAT表中函数的原始地址从而实现Hook的,与普通的 InlineHook 不太一样 IAT Hook 需要充分理解PE文件的 ...
- 利用 nodejs 解析 m3u8 格式文件,并下 ts 合并为 mp4
利用 nodejs 解析 m3u8 格式文件,并下 ts 合并为 mp4 以前看视频的时候,直接找到 video标签,查看视频地址,然后下载下来.. 后来发现,好多 video 标签打开元素审查,如下 ...
- mysql 查询表的字段名称,字段类型
select column_name,column_comment,data_type from information_schema.columns where table_name='查询表名称' ...
- log4net SmtpAppender 踩坑总结
错误集合: System.Net.Mail.SmtpException: 命令顺序不正确. 服务器响应为:Error: need EHLO and AUTH first ! System.Net.Ma ...
- 计算机等级考试【二级C语言程序设计】知识点整理
*免责声明:本文章中所收集或者引用到的内容的所有版权均为引用内容的原作者所有,本站仅作收集并整理,不承担任何法律责任! *题库收集来源于:[未来教育考试软件2017年版 - 计算机二级 - C语言程序 ...
- python使用Pyinstaller打包
一.前言 python文件打包,将.py文件转化成.exe文件(windows平台),可以使用Pyinstaller来打包 Pyinstaller可以在全平台下使用,但是请注意打包生成的文件不能在全平 ...