摘要:
从本质入手,这个东西影响取值的就是相邻两个哪个先取 设f[i][0/1]为前i个(i 1,i)中先取i/i 1的值(这里不算上i的贡献 转移就显然了,注意要先复制 inf cpp include include using namespace std; const int N=3005; int n 阅读全文
摘要:
首先看这个范围很夸张但是其实有限制的也就在1e18\ n范围里(走完一圈的边权),然后限制一定是有负环 用Floyd传递闭包,然后设f[i][j][k]为从1走了i步到j并且有k个x的最短路,用B F处理,然后有负环就是kx+f[n][i][k] include include include in 阅读全文
摘要:
首先恋人操作过一轮之后逆序对不会变多,所以设f[i]为把i个逆序对消掉的期望次数,f[i]=0.5f[i 2]+0.5f[i]+2,化简然后递推即可 cpp include include using namespace std; const int N=3005; int n,m,a[N]; do 阅读全文
摘要:
先跑spfa求出最短路构成的DAG,然后在DAG上跑出支配树dfs出size取max即可 关于支配树,因为是DAG,支配点就是入点在支配树上的lca,所以一边拓扑一边预处理倍增,然后用倍增求lca cpp include include include include include using n 阅读全文
摘要:
容易看出是用质因数凑n 首先01个因数的情况可以特判,2个的情况就是ap1+bp2=n,b=n/p2(mod p1),这里的b是最小的特解,求出来看bp2 include include include using namespace std; const int N=200005,M=316000 阅读全文
摘要:
给出的模型很难搞,所以转换一下,记p[i]为i这个数的位置,然后相邻两个p值差 k的能交换,发现使原问题字典序最小也需要使这里的字典序最小 注意到p值差 include include using namespace std; const int N=3000005; int n,k,a[N],p[ 阅读全文
摘要:
一开始没看到要保证最后是树……所以一定要从叶子开始删 枚举重心,如果k是偶数,那么按当前重心提起来deep大于k/2的全都要切掉,这样枚举重心然后取min即可 奇数的话就是枚举直径中间的边,然后从两边的点分别dfs删点 cpp include include using namespace std; 阅读全文
摘要:
如果枚举d来dp,那么就是设f[u][0/1]为u点不断/断掉和父亲的边,然后优先选取f[v][1]+w(u,v) include include include include using namespace std; const int N=300005; int n,du,v[N],d[N], 阅读全文
摘要:
先把所有边可动设为r[i]又这些边不是l就是r(如果想一个方向改变能更优的话就尽量多的改变),每次跑dijsktra,对于可动边(x,y),如果dis1[x] include include include define ll long long using namespace std; const 阅读全文
摘要:
这个告诉gcd的操作实际上就是告诉一个因数是否选,最坏情况是1,判断掉所有因数才能选 然后肯定是用猜不重复质数积比较划算,问题就变成若干个质数,分成数量尽量小每组乘积 include using namespace std; const int N=10005; int n,p[N],tot,ans 阅读全文
摘要:
有个容易混的概念就是第一问的答案不是k[i]字典序最小即可,是要求k[i]大的尽量靠后,因为这里前面选的时候是对后面有影响的(比如两条链a b c d,ka=4,kb=2,kc=3,kd=4,按字典序就先选c然后b就不能合法了) 所以倒着来,建反图,然后按照n k[i]从大到小拓扑,因为是反图所以是 阅读全文