嚯嚯嚯!补题!
补题: 6题/13题
- 状压
- __builtin_popcount(i);
- 分块dp
A. Ascending Rating
若是按照顺序的话,我们会将比他大的继续放着,比他小或者等于的删除,但是这样的话,比如7674821
的时候,对于6的时候,又要开始重新计算;所以我们开始想倒序;
用单调队列维护一个严格的单调递减序列;我们将队列的内容置为下标,这样的话,我们可以知道队尾即最大值的下标j
,这样我们就可以知道长度为j-now+1
;于是我们可以轻易找到长度为m
的maxrating
和count
的值了
忘记了初始化A
和B
,同时注意计算a[i]
的时候会爆int
|
|
C. Dynamic Graph Matching
f[i][S]
表示前i
次操作之后,S
集合的点已经匹配的方案数。
对于加边操作,显然$f[i][S]=f[i−1][S]+f[i−1][S−u−v]$。i
这一维可以省略,从大到小遍历S
,$f[S]+=f[S−u−v]$。
对于删边操作,注意到加边操作的顺序不影响结果,可以假设第i−1
次操作是加入要删除的边。将加边操作的更新倒过来,得到:从小到大遍历S
,$f[S]−=f[S−u−v]$。
看数据规模,我们可以用状态压缩;借用cnt[i]=__builtin_popcount(i);
统计1的个数;
这里脑抽了一下,计算中不用-
而应该使用|
,这样才可以加入新的点,否则会导致进位;
比如10[2]
和11[6]
会导致出现100[8]
的现象;当然我们可以通过先用if(!(i&x))
判断是否有借位,所以那个地方的代码有三种写法
|
|
D. Euler Function
观察素数打表公式可知:
euler[1]=1
对于素数来说就是euler[i]=i-1
,除了2
的素数以外,euler[i]
一定是一个偶数,所以除了3
以外euler[i]
一定是一个合数;【这里我们可以知道素数里只有2,3的欧拉值不是合数】
对于合数来说,p=q1^a1*q2^a2*……qn^an
,且q1<q2<……qn
,则euler[j]=j/q1*(q1-1)/q2*(q2-1)……=q1^(a1-1)*q2^(a2-1)*……qn^(an-1)*(q1-1)*(q2-1)
;
所以只有当所有因子都是1
【但是qi
的值各不相同】,或者只含有素数一个因子,且一次方的时候【这个显然不可以,除非只含有一个3和一个2的一次方的因子的时候】;且qi
的值不为1
,所以euler[j]=2【q1=2 a1=2】【q1=2 a1=1 q2=3 a2=1】
即为4,6的时候,对于其余的合数均为合数;
综上所述当1 2 3 4 6为合数,其余均为质数
|
|
F. Grab Tree
现将每一个数都异或起来,这样对于最高位来说一定是由奇数个1异或出来的,所以只要先手拿到最高位的1就可以了;当所有数异或出来是0的时候,假设Q拿的是A,T拿的是B,则A^B一定是0,则A和B一定相同,所以平局
|
|
G. Interstellar Travel
坐标相同的点,选择编号最小的最优,这样字典序才会小;
It is guaranteed that y1=yn=0
H. Monster Hunter(未完成
优先队列+并查集
刚开始觉得,直接根据策略,选择最优的就可以,后来发现不是这样的,如下数据,就会导致我可能会先走减少血,但之后大幅加血的路
|
|
所以,从头开始分析
L. Visual Cube
先画了横的边,之后再画侧面的边,剩余点填充.
本来想直接打印的,但是总结不好,就用无脑方式啦!
打了一些漂亮的立方体,暗暗戳戳动次打次的博博,想回宿舍了【快十点半了哟
|
|
|
|
M. Walking Plan
首先最直接的思路就是
$dp[k][i][j]=min(dp[k-y][i][x]+dp[y][x][j],dp[k][i][j]);$
但是这样的话时间复杂度就是10000*50*50*50
,就会爆掉;于是想到分块做,我们分为100为一块;
首先处理0-100的我们放在dp数组中,dp[k][i][j]
表示恰好经过k条边从i走到j点的最短路
之后,通过每次叠加dp[100][i][j]
,用dp1[k][i][j]
表示恰好经过100*k
条边从i走到j点的最短路
最后处理余数的k条边,首先将dist用最短路处理,那么dp2[k][i][j]
表示至少经过k条边从i走到j点的最短路
这样对于任意两个点我们都可以通过dp1[k/100][i][x]+dp2[k%100][x][v]
来构成
|
|
题解的思路是将合并的过程看作乘法,则 $f[t] = f[x]f[t − x] = G^t $
同样他也经过分块的处理,之后
设a[i] = G^{100i} , b[i] = G^i
,那么 a[i]
即为经过恰好 100i
条边的最短路,对于 b[i]
需要再进行一次Floyd
得到至少i
条边的最短路。
枚举中间点u
,则 ans = min(a[A][s][u] + b[B][u][t])
也就是说,在计算dp1和dp2数组的时候,他利用了线性代数中的矩阵的乘法,这点感觉很厉害呢!
不过时间复杂度是一样的,估计常数不同啦!
碎碎念
2018.08.24
说好的前几场超级简单的呢!
嚯嚯嚯!明天去看漫威!
2018.08.27
校园里人越来越多了呢!
转载请注明出处,谢谢。
愿 我是你的小太阳