2019ICPC EC final赛后感

赛前感想

不得不说西北工业大学长安校区还是相当偏远的,刚下飞机看地图差点以为我们跑到隔壁市去了。。。在热身赛测试机器的时候,评测机是真的强。我们写两层for循环

for(int i=0;i<N;i++)
	for(int k=0;k<N;k++)
		cnt++;

把N开到1e9竟然还能AC。不过也可能是这个原因,热身赛一开始评测机炸了。。。提交A题一直在pending。曾经我们一度认为这个评测机认为TLE是报WA,直到我们暴力1e10的复杂度写了B题爆了TLE。B题是FFT?太菜了没做出来。热身赛之后就去食堂用了餐券,不过伙食,只能说还算可以,我吃不饱。。。然后我们就在周围逛了逛,然后回酒店等第二天的正式赛。热身赛的时候队友整理板子突然发现,线段树板子整理的不大行,然后晚上我就手写了线段树的板子,顺便整理了一下用rope实现可持久化平衡树。

赛时感想

按照时间顺序把自己的经历写了一遍。。。

还有几分钟就开始比赛了,我们那一大片都还没有拿到题,略有焦虑。不过差不多还有一两分钟的时候志愿者很快都把题目送过来了。

开始之后我就先翻译了A题。不得不说这次题目题干很多都不长,读题体验极其良好。很快读了A题,然后给队友说了题意。第一感觉这个题是个大水题,当时没仔细想,以为枚举中点直接完全暴力就能过(我真的感觉是我一开始带偏了队友思路),然后就去看M题。M题也是能做的题目。这时候场上一堆人开始过A题,不过我坐在最边上,队友在敲A题,我就只能抬头看场边贴的气球。可能是光线原因,还有A题气球在场边贴的是瘪的,我以为一堆人过了F题,然后就去研究F题,两个队友就在研究A题。F题题干还是有点长的,不过也不难理解,就是下陆战棋。我们知道一个人的陆战棋是怎么摆放的,这个人还能交换一次我们的任意两个棋子。我们要给出必胜方案,找不到就输出-1。主要是不知道怎么处理对方能交换我们的棋子这个问题,我就开始研究样例。看了样例应该主要考虑工兵,地雷,炸弹这三个棋子的位置,因为在样例中很多棋子是送死的。场上越来越多的气球,我就感觉F肯定是简单思维,肯定就是工兵,地雷,炸弹这三个棋子的相关位置关系。然后队友看了榜,woc不是F是A,然后我就弃了F看A。队友这时候已经开始敲了,然后我又转头去看M题。

这场比赛很多题我看的都想暴力,但是复杂度让我不敢去敲暴力。然后我就研究M怎么找最优,一开始想的是用一个vis数组,用筛法的思想去筛。后来准备想去敲的时候发现考虑情况并不完全,然后就继续推M题了。这时候队友还在敲A题,没过,由于当时欠缺考虑,我一直觉得不用那么麻烦,直接写个纯暴力就能过,他们还在推我就没去阻止,就说了一句实在不行写个纯暴力,就去看了看H题。因为M题我当时没啥思路了,换个题研究换个思路。

H题那个同余式,设几个未知数展开然后化几下就能发现我们找的是一个最长的等比数列。推到这个地步,就感觉和M题有异曲同工之妙。然而M题卡住了,H题一和M题想到一起去,也就没了思路。

这时候队友又在看榜,榜上过的最多的是A,其次是M,然后是E题。然后队友让我去翻译一下E题。E题一开始给出了一个universe图的概念,就是有k条长度相同的从1到n的路,并且这些路除了起点和终点没有公共点。然后我们可以进行一些操作:选择一个拥有正数权值的边,这个边的权值减一,然后再选另外一条边让它边权加一。我们要求进行最少的操作次数,使得从1到n的最大流最大。第一个样例还是很清晰的,然而第二个样例,当时感觉最少操作次数应该是0(赛后队友说最少操作次数不是0,赛场上考虑欠妥),但是样例答案是1,然后很懵。

这时候周围的队伍都有一个气球了。左手边的队伍都有两个气球了,队友还在推A题,还推出了反例推翻了之前的做法,当时想的是2x2,4x4等方格的斜线,发现2x4等格子的斜线也是可以的。。。然后我就和队友说写纯暴力,然后队友立刻反驳我才发现我一开始的想法是 O ( n 4 ) {O(n^4)} O(n4) 。然后我就意识到A题没那么简单。看到队友还在推利用中点来找线段,突然想到从性质这个角度思考。一旦想到性质这两个字,当时我就有种想法:直线的话,满足条件的直线必定是偶数长度的。如果是奇数长度那么中点必定不在格点上。然后斜线的话,只要两条直角边都是偶数,中点必定在格点上,而且只要两条直角边有奇数长度的,那中点就肯定不在格点上。然后在草稿纸上写了些伪代码:

int ver[1000],Line[1000];//一个是垂直,一个是水平
int flag1=0,flag2=0;//分别代表两个数组内的元素个数
//用V代表垂直方向的长度,用L代表水平方向的长度
for(int i=2;i<=V;i+=2){
	ver[flag1++]=V+1-i;
}
for(int i=2;i<=L;i+=2){
	Line[flag2++]=L+1-i;
}

然后就有了两个数组,代表能有多少个长度为2、4、6、8。。。的区间。然后豁然明白了这个题。

for(int i=0;i<flag1;i++){
	for(int k=0;k<flag2;k++){
		ans+=ver[i]*Line[k]*2;
	}
}

这段代码就把所有斜线统计了起来。然后统计直线:

for(int i=0;i<flag1;i++){
	sum1+=ver[i];
}
sum1=sum1*(L+1);
for(int i=0;i<flag2;i++){
	sum2+=Line[i];
}
sum2=sum2*(V+1);
ans+=sum1+sum2;

然后输出ans就是答案了。。。这时候队友WA了换人,我就直接上去了把这个敲了上去,然后测试样例发现有几个小细节敲错了,稍微一改,然后提交AC。。。我们终于拿了一个气球,然后就赶紧去搞M题。

但是M题我是真的没思路。然后队友就一直在研究M,我又看了看H,就和队友说如果我们能A了M,H大概率应该也能A。由于M实在是没什么思路,我就把整本题都翻译了一遍。像是C这种题,底子薄弱想都不想。看到G题,一个模拟,能做。然后就准备队友A了M之后,我去根据M看H,队友研究G。队友的代码能力比我强很多,他们来做G题比我有很大优势。然后我当时感觉我们能做的题就是A,M,H,G,E(从简单到难)。然后我就处于无事可干的状态了,所以就跟着队友去研究M。

关于M是真的不敢写暴力。然后再脑子里搜索有什么相应的算法,什么都没有。。。然后就盯着题目发呆,读了几遍题目,然后继续发呆,没有思路。至于为什么不当场弃M转G,因为风险比较大。。。当时M题过的人挺多的,G题远没有M题过的人多,就怕G题做起来发现并没有那么简单,然后我们最后没做出来的话可能就要谢罪了。。。赛后再看,真的不如弃M转G,至少还有A的可能。M的话我们思路是正确的,就是不敢去写暴力。然后盯着M,直到比赛结束。。。

赛后感想

不管怎么说,菜是原罪。M题分块之后,数据规模很小了,就十几个元素就算是 O ( n 3 ) {O(n^3)} O(n3) 又何妨。我们之所以真的没有思路了就是因为我们想的是对的。。。最后马总好像是写了暴力了,然后提交上去一直在pending,等了半天然后莫名RE,然后继续调最后一直pending到结束。估计是什么地方没注意,或者是没初始化什么东西?总之最后调的太晚了,没来得及。

这场比赛,以不丝滑拿铁为结局。感受就是,如果真的没有思路了,真的不妨就按照自己觉得不行的思路写一写,推一推,或许自己觉得不行的思路就是正确的。还有就是我们应该加强训练强度。每场CF不能最多做完D题就心满意足扔掉。CF结合算法,加强训练,同时多写笔记,把做过的题重新思考一些写出来。否则学过去就容易忘干净。听队友说上交大一晚上能训练三套区域赛题?神仙。。。我们做的还远远不够。明年一年,我们必须得拿到奖项,接下来,准备期末考试,然后加强训练,全身心投入,明年赛后,再写博客。希望能有个好的结果!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值