zcmimi's blog
avatar
zc
2019-12-21 19:47:00
查看原题

点击跳转

当我们选中一个i

i,i^2,i^3...,i^k都会被去掉

我们设d_t为可以去掉t的数字的个数

ans = \sum_{i=1}^n \frac 1 {d_i}

那么如何统计呢?

分解质因数

n = p_1^{k_1}p_2^{k_2}p_3^{k_3}p_4^{k_4}...

对于k_i贡献为1+\frac12+\frac12+\frac14+...

avatar
zc
2019-12-21 19:47:00
查看原题

点击跳转

题意:

给出一个矩阵,要求每行只能选一个节点,每列选的节点不能超过所有选的节点的一半,不能不选, 给出每个节点的选择方案数,求总方案数

解法

考虑到限制是每列选择的不能超过一半,我们可以想到不合法的最多只有一列

我们可以用总方案数减去不符合的

s_i=\sum_{j=1}^m a_{ij}

总方案数:\prod_{i=1}^n (s_i+1) - 1

\because k=\frac {tot}2

所以我们有一个很妙的方法:

设选中目标行之外的权值+1,不选+0,选中目标行权值位+2

最后只要权值> n,那么目标行一定被选了超过\frac n2

f(i,k)表示总共选了i次(也就是选到第i行)权值为k的方案数

f(i,k) += f(i-1,k)*(s_i-a_{ij})(当前行不选目标列

f(i,k+1) += f(i-1,k)(当前行完全不选

f(i,k+2) += f(i-1,k)\times a_{ij}(当前行选中目标列

ans = \prod_{i=1}^n (s_i+1) - 1 - \sum_{i=n+1}^{2n} f(n,i)

avatar
zc
2019-12-21 19:47:00
查看原题

点击跳转

f_i为前i个任务的费用,t_i为前i个任务时间的总和,w_i为前i个任务费用的总和

f_i=\min_{j=0}^{i-1}(f_j+s\times(w_n-w_j)+t_i\times(w_i-w_j))

设任意0\le j<k<ij转移比从k转移优,那么

f_j+s\times(w_n-w_j)+t_i\times(w_i-w_j) \le f_k+s\times(w_n-w_k)+t_i\times(w_i-w_k) \\ t_i(w_k-w_j)\le f_k-f_j+s(w_j-w_k) \\ t_i\le \frac{f_k-f_j+s(w_j-w_k)}{w_k-w_j}

维护了个下凸壳交了上去,结果听取\color{red}\text{WA}声一片

仔细看了看|T_i|\le 2^8

这也就意味着我们每次截取的直线的斜率不再单调递增,单调队列不能再满足需要

为了保证决策状态的有序性,我们还是选择用一个单调栈维护下凸包。

因为决策集合已经有序,对于任意直线,我们只用在队列中二分出使截距最小的交点

由于出题人十分毒瘤,我们要把斜率大小的判断从相除改成十字相乘

avatar
zc
2019-12-21 19:47:00
查看原题

点击跳转

先筛选出d_a,d_b,d_c

如果a,b,c的约数都不相同,那么ans = d_a \cdot d_b \cdot d_c

我们来考虑要减去的部分

(a,b,c) , (b,a,c)这样的是不符合的,减去其中一个

也就是减去d(gcd(a,b))\times(d(gcd(a,b)-1))

同理,(a,c,b),(c,b,a)也要减去.

这样的话会多减了一个d(gcd(a,b,c))*(d(gcd(a,b,c))-1),要加回来

...

https://www.luogu.com.cn/blog/lingchi/solution-cf1008d

avatar
zc
2019-12-21 19:47:00
查看原题

点击跳转

avatar
zc
2019-12-21 19:47:00
查看原题

点击跳转

avatar
zc
2019-12-21 19:47:00
查看原题

点击跳转

好题

思路很妙

L[i][j]表示区间[i,j-1]作为j的左儿子是否合法

R[i][j]表示区间[i+1,j]作为i的右儿子是否合法

avatar
zc
2019-12-21 19:47:00
查看原题

点击跳转

tarjan找出环 答案是每个环上的最小值加起来

avatar
zc
2019-12-21 19:47:00
查看原题

点击跳转

其实一点stl什么的都不用用到

区间交也就是[\max(l_i),\min(r_i)]

我们要求的就是每次删掉某个区间后其他区间的区间交

我们只需要记录最大l_i和次大l_i还有最小r_i和次小r_i

若当前要删掉的区间[l_i,r_i],l_i为最大L,那我们就取次大L

R同理

avatar
zc
2019-12-21 19:47:00
查看原题

点击跳转

我们假设现在要合并的两个数是x,y,那么合并后是x\cdot10^{\ln y+1}+y

我们可以预处理出 a_i \cdot 10^t \mod k(t\le 10)

每个a_i统计有多少个数接到它前面符合要求

64/74
Search
search