文章目录
· 写在前面
非常荣幸能参加GDKOI ~ !!!
首先不知道为什么我普及组二等还能是GDKOI的正式名额。
其次这次GDKOI是线上比赛,我在机房里打比赛,然后就全程监控不能说话,非常困😪。
然后就是觉得GDKOI普及组的难度略大于CSP-J,大概T2就是CSP-J三四题的样子。
所以写题写的比较艰难(我比较菜),现在的比赛每次都是前两个小时死磕T1T2,
然后剩下两小时怒怼T3或T4,最后能不能写完四题都要看今天状态和时间了。
(不知道之后提高组会难成什么样o(╥﹏╥)o),不过也算是见见世面,了解新的算法的途径了。
其次信息奥赛必须要重视起来了!必须要在初三提高组比赛时拿到一等,不然可能就要退役了……,因为如果不能有出色的成绩就压根都看不到省队的影子,然后还会把文化课往后拖,这样就连想用文化课反击的机会都没有了。
· Day 1
0 + 50 + 0 + 0 = 50 p t s 0+50+0+0=50pts 0+50+0+0=50pts
今天是比赛的第一天,考试前一个晚上老师就把摄像头装了,然后GDKOI官方人员用腾讯会议来看监控?
所有人的桌面都收的比较干净,然后就感觉比较正式,有一点紧张。
· Day1 比赛时间
今天非常没有状态,老师说Day 1比较简单,
比较签到,是为后面的比赛来增加信心的,
结果我Day 1考的分数是普及组三天中 考的最低的(雾)。
T1
说出来你可能不信,Day1T1我调了两个小时,最后还爆零了就离谱。
比赛时一直调不出 x = 1 → n , y = 1 和 x = 1 , y = 1 → n x=1\to n,y=1和x=1,y=1\to n x=1→n,y=1和x=1,y=1→n 的的情况。
后来乱搞过了大样例就丢了。
教训: 对于自己的思路,发现已经是不正确的了,就不要继续死磕,乱搞企图拿分,果断点放弃,去做其他题,或是重构代码以尽可能拿到更高分。
然后这道题正解就是直接模拟异或过程,然后找两个错误行或列的交点即可。
考试代码(0分):
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<cmath>
using namespace std;
int a[2010][2010],b[2010][2010];
int bj[2010][2010];
int n,ans,ii,jj;
int main()
{
freopen("map.in","r",stdin);
freopen("map.out","w",stdout);
cin>>n;
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
{
scanf("%d",&a[i][j]);
if(i==n||j==n)
b[i][j]=a[i][j];
}
for(int i=1; i<=n-1; i++)
for(int j=1; j<=n-1; j++)
{
if((i==1&&j==1))
continue;
else if(i>=2&&j>=2)
{
b[i][1]=b[i][1] xor a[i][j];
b[1][j]=b[1][j] xor a[i][j];
}
}
for(int i=1; i<=n-1; i++)
{
b[i][1]=a[i][n] xor b[i][1];
for(int j=2; j<=n-1; j++)
b[1][j]=a[i][n] xor b[1][j];
}
for(int j=1; j<=n-1; j++)
{
b[1][j]=a[n][j] xor b[1][j];
for(int i=2; i<=n-1; i++)
b[i][1]=a[n][j] xor b[i][1];
}
for(int i=1; i<=n; i++)
{
if(i==1)
continue;
if(b[i][1]!=a[i][1])
{
for(int j=2; j<=n; j++)
bj[i][j]++;
for(int j=1; j<=n; j++)
bj[n][j]++;
}
else
{
for(int j=2; j<=n; j++)
bj[i][j]--;
for(int j=1; j<=n; j++)
bj[n][j]--;
}
}
for(int j=1; j<=n; j++)
{
if(j==1)
continue;
if(b[1][j]!=a[1][j])
{
for(int i=2; i<=n; i++)
bj[i][j]++;
for(int i=1; i<=n; i++)
bj[i][n]++;
}
else
{
for(int i=2; i<=n; i++)
bj[i][j]--;
for(int i=1; i<=n; i++)
bj[i][n]--;
}
}
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
if(bj[i][j]>ans)
{
ans=bj[i][j];
ii=i,jj=j;
}
cout<<ii<<" "<<jj;
return 0;
}
T2
这道题考试时样例是错的,老师后来改了,可是我没看到,所以没写???直接暴力能拿40分啊!
然后这道题正解是单调队列+二分。
考试代码
这道题没有写代码。
T3
这道题是我唯一拿分的题,考试的时候一眼想到贪心,然后思考一会儿后发现可以二分删数的个数,调了一会儿程序之后发现自己的贪心策略错了,于是又想了一会儿,发现可以排序之后用两个指针 i , j i,j i,j 控制头和尾,然后当 a [ i ] + a [ j ] > 左 边 界 a[i]+a[j]>左边界 a[i]+a[j]>左边界 就把j往左移, a [ i ] + a [ j ] < 右 边 界 a[i]+a[j]<右边界 a[i]+a[j]<右边界 就把 i i i 往右移,之后维护一下答案就好了,调了大约40分钟过了大样例。最后成绩发下来我的是正解,但是只拿了50分,发现特判奇数情况判错了,于是……
更正后代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>