D
LYF 模拟
C
题意:给定n,m,在n*m个格点上两个人玩游戏,每一轮都可以画一条的起点与终点相邻的路径(路径就是正常的连接各个相邻格点的那种),并且不能使盘面上出现任何多边形。不能走的人输。(n,m<=4)
ZRC解:
不能形成任何多边形,即画线不能成环。可以发现,每一步后盘面状态必然是森林,而形成生成树后就无法走动。因此总共可以连接n*m-1条线。对于每一轮,由于起点与终点需要相邻,因此连接的线一定是偶数条。判断n*m的奇偶性即可。
K
题意:
某个操作是对给定的1e6的a数组跑单调栈,并记录下每个时刻栈的大小于b数组中。现有b数组的几个位置的值,构造一组a数组的可能取值。
LYF解:
首先发现对于每个位置,栈的大小只会是前面的位置+x(x<=1)。可以先遵循这个规律构造出一种可能的b数组(感性认识这玩意一定会对应某种a的取值),再利用链表跑出可能的a数组取值。
题解:
遵循上述规律可以搞出一个非常简单的构造方式:除了给定的位置以外每个点都+1。构造完成后可以发现形成了一系列拓扑关系,做拓扑排序即可。
I
ZRC BFS
F
题意:
求两个阿波罗尼斯球的体积交
ZRC WD解:
几何题。没板子的话余弦定理+积分可做
补L
题意:
给定n2e5个人之间的好友关系(无向图),每次单点增加一个人的步数,求每个人在自己列表里保持冠军的时间。保证每个人在每一秒的步数都不超过10000
LYF解:
考虑临界值B=sqrt(n),以B为基准对点分类,分为度数>=B的大点和<B的小点,显然每次修改至多使一个人从非冠军变为冠军,也就是说冠军的变化次数是O(n)的,意味着我们可以在每次修改后都更新冠军情况,保持所有人的冠军情况是最新的,从而求出答案。
对于小点,每次修改后主动查询相邻的所有点并更新这些点的冠军情况O(B),并且将修改后的权值信息传递给相邻的大点O(B),记录在对应大点的集合中
对于大点,主动查询周围所有大点并更新这些点的冠军情况O(B)。然后考虑小点:如果查询所有当前状态为冠军的小点,则显然可以被1个走不了几步的大点和一圈走很多的小点的情况卡掉。这里由于题目保证每一秒步数不超过10000,因此可以将周围所有冠军小点按步数存进vector,每次查询原步数~现步数间的所有小点,更新他们的冠军情况。这样的信息在所有大点的集合中的数量为O(nB),且不会重复查询,因此复杂度有保证。为了避免重复查询,可以根据权值再将集合分成多个区间,每次将点u增加v后,仅查询[val[u]+1,val[u]+v]区间