前言:
作为打的第一场比赛实在是失误太多了,比赛结束时候颤抖的手和队友以及我自己的叹息现在还历历在目,今天补完题,想了一下还是决定记录一下。
比赛过程:
比赛是10点到15点的,我们7点起床之后在酒店吃了饭(学校定的酒店的饭是真的难吃啊,完全吃不好,比赛开始1小时我就开始饿了)就开始赶路路上三十多个人背着书包一起赶路还挺有喜感的(就是真的累死人啊,惹,背个电脑什么的是真的重),到了郑轻之后就是拍了合照然后教练交代一下不要紧张什么就去机房准备比赛了
比赛开始之后,先开始找签到,我看到D题好像是一个图论题就在边看题意(这也是这场比赛最大的失误),然后gxr说A是签到然后就和我一起看A他在敲代码,我帮忙看,也是一发a过了,接着就是接着F题,睿哥说是线段树,就开始写,我就接着去看D题,J哥在看别的题目,随后线段树敲好之后交了一发wa掉了,然后就是开始找问题,找了半天没找到,中间改了一个int变成longlong交了一发还是wa,随后我开始问思路,然后 r哥给我讲了一遍我也觉得没啥问题,随后就开始帮忙找,然后我发现题目范围1e9如果两个1e9相乘范围应该最大是1e18,但是 r哥极大值赋值的1e17+5,我把他改成了0x3f3f3f3f3f3f3f3f,直接就过掉了,随后我在看的D题我也有了思路,我就直接上去写了,写完之后过掉了样例,然后自信交了一发也是喜提wa,然后J哥的H题也是有了点思路就上机写了但是还是wa掉了,然后我就改了改D题的并查集又交了一发又是wa,这时候心态已经开始难受了,后面J哥和r哥交流了之后不知道怎么改的然后顺利过掉了H题,然后我去给r哥讲了一下D题题意之后,也觉得可以写,让我把并查集改成DFS试试,之后他们在我后面推B题我在改D,改成DFS之后还是wa,看了一下榜,已经很后面了,而且这一题还是0队过,就打算换题了,这里其实心态已经崩掉了,然后他们两个推得B也有结果了,J哥上机一发敲完调了一遍一发就过掉了,NB!(没有这个B题可能要打铜了),这个时候已经接近封榜了,我们排在41题,然后就是J哥在推E题dp,我和r哥推k题结论,然后就是最后最刺激的时候了还有30分钟时候r哥说他推出来了,然后我随便问了一下,就开始敲了,我接着推,(说实话当时心态已经爆炸了,可能状态好点我可以更快推出来的),然后我有了一点灵感之后我也推出来了,这时候时间还有20分钟,然后测了几个样例之后交了第一发,答案错误了,然后就开始敲验证暴力程序,发现没问题,然后我说我来改一下,然后我把偶数部分改了,测了几个没问题,交了还是答案错误,然后我又去推了一下,1分钟把奇数也想出来,又上机,改了奇数之后,调了一下发现少了一个数,然后加了个特判之后过掉了自测,然后又叫,格式错误,当时瞬间十分激动,因为看到了希望,以为是行末空格,然后赶紧让r哥上改,当时还有4分钟我以为百分百可以改出来,但是最后太紧张了,点错好多东西,还是耽误了时间,最后改了两次空格都交了上去之后依旧是格式错误,当时就是一分钟了,我一想这个题只有一组输入,我们加了换行,然后我赶紧上去改但是最后10s根本改不完,因为上面1~10的情况是暴力特判的,要删好几个\n,最后删的时候手都是在抖得,随后比赛结束,我们不是被眷顾那一个。
比赛结束之后,刚回到宿舍就开始写K,因为前面暴力10个不是我写的,在群里问了之后验证了正确性,直接交了,然后一发过掉了,当时心情只能说是非常的遗憾吧
我的第一场CCPC省赛也就在银牌中,带着遗憾结束,本以为还有ICPC省赛,结果第二天告诉我们ICPC只能去3队,之前因为一些变故导致我的西安邀请赛也打不了,相当于上半年我的比赛就结束了
得知没有比赛之后也是极度难受,直接回宿舍摆烂了,今天中午吃完饭想想还是接着去学习了,把题目补了一些
补题:
C. Toxel 与随机数生成器
题意:题意很简单,就是给出一个长度为1e6的二进制01序列,然后问你这个二进制01序列是不是每隔 lengthi 个位置,序列就会开始重复。给了范围保证1e3 ≤ lengthi ≤ 1e6且 lengthi =1e6。
思路:其实很好写,因为序列长度是固定的1e6,那么在lengthi最大1e4的情况下,也就是有100个重复单元,那么我们可以从1~1e6-1000开始的取长度为1000的子串跟0~1000的子串对比看是否为m>=100,是的话输出No。
代码:
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<math.h>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<list>
//#include<unordered_map>
#define endl '\n'
#define PI acos(-1.0)
#define int long long
#define PII pair<int,int>
//priority_queue<PII,vector<PII>,greater<PII> >q;
using namespace std;
const int N=2e5+5;
string s;
void solve()
{
cin>>s;
string a(s,0,1000);
int cnt=0;
for(int i=1;i+1000<=s.size();i++)
{
string b(s,i,1000);
if(a==b)
cnt++;
}
if(cnt>=100)
cout<<"No";
else
cout<<"Yes";
}
signed main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
// int T;
// cin>>T;
// while(T--)
solve();
return 0;
}
E. 矩阵游戏
思路:三维dp不难想,但是三维数组会炸内存,所以,重点在于三维转二维,后面我想了一下,因为他转移的方向是固定的,那么直接去掉存储行的那一维,然后并不影响结果,剩下的按照三维的转移思路写就行了
代码:
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<math.h>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<list>
//#include<unordered_map>
#define endl '\n'
#define PI acos(-1.0)
#define int long long
#define PII pair<int,int>
//priority_queue<PII,vector<PII>,greater<PII> >q;
using namespace std;
const int N=1e3+5;
int f[505][N];
char g[505][505];
void solve()
{
int n,m,x;
cin>>n>>m>>x;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>g[i][j];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
for(int k=x;k>=0;k--)
{
if(g[i][j]=='?')
{
if(k>=1)
f[j][x]=max(f[j-1][k-1],f[j][k-1])+1;
}
else
{
f[j][x]=max(f[j-1][k],f[j][k])+(int)(g[i][j]-'0');
}
}
}
// int ans=-1;
// for(int i=0;i<=x;i++)
// ans=max(ans,f[m][i]);
// cout<<ans<<endl;
for(int i=1;i<=m;i++)
cout<<f[i][x]<<" ";
}
signed main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
int T;
cin>>T;
while(T--)
solve();
return 0;
}
然后就是最可惜的K题,还是把赛后代码放这吧
K. 排列与质数
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<math.h>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<list>
//#include<unordered_map>
#define endl '\n'
#define PI acos(-1.0)
#define int long long
#define PII pair<int,int>
//priority_queue<PII,vector<PII>,greater<PII> >q;
using namespace std;
const int N=2e5+5;
vector<int>a;
void solve()
{
int n;
cin>>n;
if(n<=10)
{
if(n<=4)
cout<<"-1";
else if(n==5)
cout<<"1 4 2 5 3";
else if(n==6)
cout<<"1 3 5 2 4 6";
else if(n==7)
cout<<"1 3 5 7 2 4 6";
else if(n==8)
cout<<"1 3 5 7 2 4 6 8";
else if(n==9)
cout<<"1 3 5 2 4 7 9 6 8";
else if(n==10)
cout<<"1 3 5 2 4 6 9 7 10 8";
}
else
{
if(n%2==0)
{
for(int i=n;i>2;i-=2)
a.push_back(i);
for(int i=1;i<n-1;i+=2)
a.push_back(i);
for(int i=0;i<a.size();i++)
{
cout<<a[i]<<" ";
if(a[i]+3==n-1)
cout<<n-1<<" ";
if(a[i]==5)
cout<<2<<" ";
}
}
else
{
for(int i=n-1;i>2;i-=2)
a.push_back(i);
for(int i=1;i<n-2;i+=2)
a.push_back(i);
for(int i=0;i<a.size();i++)
{
cout<<a[i]<<" ";
if(a[i]==n-3)
cout<<n<<" ";
if(a[i]==n-5)
cout<<n-2<<" ";
if(a[i]==5)
cout<<2<<" ";
}
}
}
}
signed main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
// int T;
// cin>>T;
// while(T--)
solve();
return 0;
}
后记:
D题下午去了就开始看,后面发现是一个没有学过的图论算法:无向图的连通分量,晚上补完题之后,看到这个界面真的挺难受的
要是我早点放弃D去看K题是不是就不会是格式错误,C题全程三个人没有去看过,看了之后是不是就可以多一道题,要是去帮J哥看E题DP是不是就可以再出一道题,感觉状态差,开题写题有问题,全都是失误,如果早点去放弃掉一道到现在都只有一个人过题的D会不会结果不一样,可惜没有如果,借用Showmaker的一句话"比赛结束后,我感觉头脑空白,但是大家想一想,失败总是贯穿了人生始终,这就是人生",只希望我从这次失败的比赛经历中,吸取到教训,明年去弥补我的遗憾,以及今年下半年的区域赛争取拿到名额和奖牌。