GDKOI2021 普及组游记【总结】【游记】【凸包】【数论】【概率论初步】


· 写在前面

非常荣幸能参加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=1n,y=1x=1y=1n 的的情况。
后来乱搞过了大样例就丢了。

教训: 对于自己的思路,发现已经是不正确的了,就不要继续死磕,乱搞企图拿分,果断点放弃,去做其他题,或是重构代码以尽可能拿到更高分。

然后这道题正解就是直接模拟异或过程,然后找两个错误行或列的交点即可。

考试代码(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 ] < 右 边

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值