3.31省选模拟


很久以后,还会是我一个人,站在风里,听着自己的心事

\(5.20k\)提交祭

\(T1\)

转化题意,恰好取出\(k\)条链,使得权值尽可能大

首先贪心的想,每次都选出来最大的即可,然后这样显然不能保证最优吧

首先选一个,肯定是要选最大的,那么我们考虑这次操作可能对下次产生影响

我们第二次选,可能需要撤销一部分第一步的操作,然后选出一条最长链

考虑正确性,我们要假设目前存在更优的选择选另一条链,那还是表示加上一个最大的权值,那么我们这么选的话,肯定能选出来

本质是就是反悔贪心吧,模拟费用流的过程

发现,我对于贪心的证明一直都不是很容易理解,或许思维过于僵化了

当然这道题可以\(wqs\)二分,至于凸性的话,还有种证明方法,如果能把模型转化为费用流形式就满足凸性

#include
#define INF 2147483647
#define MAXN 200005
using namespace std;
vectorlu[MAXN];
vector >rd[MAXN];
int dp1[MAXN],dp2[MAXN],val[MAXN],nxt1[MAXN],nxt2[MAXN];
int n,k,Ans;
void dfs_pre(int now,int fa)
{
	 for(int i=0;idp1[now])
     	 {
     	    nxt2[now]=nxt1[now];
			dp2[now]=dp1[now];
			nxt1[now]=y;
			dp1[now]=dp1[y]+val[y];
		 }
		 else if(dp1[y]+val[y]>dp2[now])
		 {
		 	nxt2[now]=y;
			dp2[now]=dp1[y]+val[y];
		 }
	 }
//	 cout<<"now: "<

\(T2\)

推式子的\(ppt\)\(87\)页,很好,那咱们开推

(笑)大概要不少时间呢

\(sub_1:n<=10\)

考虑枚举所有二叉树形态,没想到题解的办法,吃饭的时候糊了一个,由于二叉树可以二进制表示,那么枚举所有的二进制状态就好了,复杂度\(O(2^nn),\)可以打出前十项的表

\(Sub_2\)

推式子

#define Eternal_Battle ZXK
#include
#define mod 1000000007
#define int long long
#define MAXN 2000005
using namespace std;
const int up=259;
inline int re() {
	int x = 0, p = 1;
	char ch = getchar();
	while(ch > '9' || ch < '0') {if(ch == '-') p = -1; ch = getchar();}
	while(ch <= '9' and ch >= '0') {x = (x << 3) + (x << 1) + (ch ^ 48); ch = getchar();}
	return x * p;
}
int p,inv[MAXN],pw[MAXN],dw[MAXN],*C=inv,n,T;
int iv3,iv6,iv15,iv120,c1,c2;
void Init() 
{
	inv[1]=1; 
	for(int i=2;i

\(T3\)

毒瘤数据结构,待补