A.Water The Garden
题意就是给你$n$个待浇水的位置和$k$个水龙头,按照浇水规则求把所有位置都浇到水的最短时间。
暴力从小到大模拟一遍找到最小可行时间输出即可。
代码:
1 |
|
B.Tea Queue
题意就是给你$n$个人和他的开始排队时间$l_i$,离开队伍时间$r_i$,按照开始排队时间进行入队,顺序小的排在前面,如果领到茶的时间大于$r_i$,那么这个人会离开队伍,求最后每个人领到茶的时间,无法领到记为$0$
优先队列维护排队顺序,然后按时间模拟一下,该领茶的领茶,该离开的离开。
代码:
1 |
|
C.Swap Adjacent Elements
题意就是给你$n$个数,和一串字符串,表示一些位置是否可以和它前面一个位置交换数字,交换顺序和次数不限,求最后整个数列能否排成不降数列。
由于交换顺序和次数不限,因此连续的$1$对应的区间内一定是可以被排序的,因此可以把字符串中连续的$’1’$找到,然后把数列中对应的连续区间$sort$一下,这里要注意$s[i]==1$表示第$i$个位置可以和第$i+1$个位置交换,因此实际排序连续区间为$[l,r+1]$
代码:
1 |
|
E.Connected Components?
题意就是给你$n$个点的完全图和$m$条边,表示有$m$对点对之间的边被删掉了,求最后图内连通块的个数和每个连通块的大小。
实际上这题就是暴力$BFS$所有连通块大小,看似复杂度很高,实际上如果只考虑点的话,$BFS$只把那些没访问过的点搜索一次,这样一来复杂度大大下降,用$map$记录一下删掉的边即可,燃鹅这里有个问题,每一次$for$邻接点的不能是$[1,n]$,这样就算一些点不会入队,但是循环次数仍然很多,很可惜没想到用set T到比赛结束……,实际应该用$set$优化,$set$记录图中未访问过的点,每一次把访问过的点从$set$中$erase$掉就可以用了,当然在遍历的时候$erase$可能会使迭代器失效报错,应该把要$erase$的点储存一下,遍历完后再删掉即可。
代码:
1 |
|
F.SUM and REPLACE
题意就是给你$n$的数的序列,记$D(x)$表示$x$的因子数,给定两种操作:
1.把$[l,r]$的每一个数$x$变成$D(x)$
2.求和$[l,r]$
先打个$D(x)$的表,一个数的因子数个数为它分解后所有的素因数上的指数$+1$的连乘。
然后就是个线段树剪枝优化问题,主要在于求和和更新的时候如果一个区间内的数完全相同,那么可以直接得到答案而不需要递归下去。
太菜了,$openinghack$之后被$1\;2\;1\;2….$这样的数据卡超时了,那么上再加一个区间是否需要被更新的标记$eq$就行了,如果这个整个区间都小于$2$显然就没有再被更新的必要了。
代码:
1 |
|
G.List Of Integers
题意就是给你一堆询问${x,p,k}$,求大于$x$和$p$互质的数中第$k$小的数。
这里涉及到求$[1,n]$中与$p$互质的数的个数问题,需要用到容斥原理,如果$[1,p]$的话就可以直接欧拉函数了,但这个范围是会变的,因此我们应该算$[1,n]$中与$p$不互质的数的个数,因此求法如下:
- 将$p$质数分解(10+的阶乘就超过1e6了,最多只有十几个质数)
- 状压枚举用了哪些质数。
- 假设用到的质数的个数为$t$,乘积为$w$。
- 容斥原理可得当$t$为奇数的时候,答案应减去$n/w$,否则加上$n/w$。
好吧其实上面只是算出了$[1,n]$中不互质的个数,用$n$再减一下就是互质的个数了,然后得到$[1,n]$的计数,$[l,r]$的答案差分一下就是$[1,r] - [1,l-1]$。
由于题目固定左端点为$x+1$,那么二分一下右端点即可。
代码:
1 |
|