0%

CF-1013-E1. Canteen (Easy Version)

思路讲解

其实也是自己琢磨琢磨出来的,当然不好好写复盘大抵是看不懂以前自己的思路的。

1
2
3
4
5
FOR(i,0,N-1){
diff[i]=B[i]-A[i];
}
ll ans=1;
// diff是负值表示需要调和

就是直接模拟肯定TLE,但是可以退而求其次,**一个一个模拟。**在这个需调和块遇到其他的需调和块之前,不用担心操作有后效性。在碰到其他调和块之后,让他先开路,如果他变成0了,再变成你了。

当然可能碰到多个调和块,这个时候就是使用栈来维护,一个为0弹出1个,换后面一个,直到处理完这个最初的,弹出。

AC代码

https://codeforces.com/contest/2089/submission/316959785

心路历程(WA,TLE,MLE……)

这段代码会造成这个死循环,虽然说比较隐蔽,但这个死循环的罪魁祸首就是upLab。

这个upLab和lab如果相同的会导致lab=upLab 这句话出现问题,并不起到作用。

这个代码过了5个点,但还是有点问题,怀疑是因为我这个算法没有去真实的记录每个点的实际抵消所需操作数,现在看起来要改一改了,确保这个每个点的抵消所需操作数都被真实记录。

但好像也不太对,就是我们都是把这个碰到的 diff<0diff<0 的点搞到 0≥0 才罢休,而且这个也会记录到最初的点当中

https://codeforces.com/contest/2089/submission/316947463

事实证明我的猜想是对的,只是ltot这个东西就有问题,直接改成栈,把这个ltot优化掉了就好了