CCPC读题速度训练&hdu2022多校补题

发布时间 2023-07-12 17:01:58作者: Anticipator

标题党,其实是JSOI赛前康复训练

CCPC2021威海:

这场单挑Cu,还行

M:简单容斥,能推式子就不要老想着dp

E:简单概率题

F:

H:你tm看题目看清楚啊,明明是裸的最大权闭合子图啊啊啊啊

中间鸽了不知道多久,省选后upd:

CCPC2021Final:

G:

每个区间SG独立

令P=2,枚举L,R,打表能找到规律

icpc2022沈阳g题

给两棵树 ,q次询问a,b,要求找一个t使得dis1(a,t)+dis2(b,t)最小

分别建立点分树,从a往上跳,每个点记录子树内的各个点到他的距离与在另一颗
点分树上的log个祖先以及到祖先的距离,扔进vector,记录每个点(即枚举t)作为第二颗树的祖先时dis1(v,lca1(v,a))+dis2(v,lca2(v,b))的最小值即可

O(n logn^2),要用tarjan lca,否则t飞

ICPC2022杭州 I题

先随便走3333步,设此时min+max=m,高概率下m<=n<=m+1e7

然后大步小步,设走n-m=k,0<=k<=1e7

你会发现给的10000次刚好和sqrt(1e7)一个量级,正好大步小步

设k=3333*a-b(a、b<3333)

k+b=3333*a

于是走b步,步长为1

(如果此时已找到两个相同x,直接退出)

再走一步,步长为k

再走a步,步长为3333

如果走到两个相同的x,累计步长之差即为n


标题党,记录去年因为上whk而错过的hdu多校里面的一些好题

打算只要不是个位数ac的题都写/口胡一遍

2022hdu多校1 F travel plan

仙人掌,求简单路径数

缩点完,方点内仅仅只有一个简单环

这个方点的儿子都是圆点,并且在环上有两条路径可以贡献到方点

于是

int solve() {
		sort(node.begin(), node.end());
		node.erase(unique(node.begin(), node.end()), node.end());
		for(auto u : node) if(!dfn[u]) {
			tarjan(u, -1);
			stk.clear();
		}
		for(auto u : node) dfn[u] = 0;
		int ans = 0;
		function<void(int, int)> dfs = [&] (int u, int par) {
			dfn[u] = 1;
			f[u] = (u <= n) ? 1 : 0;
			for(int i = head[u], v = e[i].to; i; v = e[i = e[i].nxt].to) if(v != par) {
				dfs(v, u);
				upd(ans, mul(f[u], f[v]));
				upd(f[u], mul(f[v], 1 + (u > n)));
			}
		};
		for(auto u : node) if(!dfn[u]) dfs(u, -1);
		return ans;
	}

upd(f[u], mul(f[v], 1 + (u > n))) 这一句,当u>n时说明u是方点,它的儿子对他的贡献有两条路,要乘2

多校3,整场不会,全写了:

A:

这种既有1..i-1->i,又有i->i+1的期望题

你把式子写出来 $F_i=aF_{i+1} + \sum b_j \times F_{i-j}$

移项 $ aF_{i+1}= -F_i+ \sum b_j \times F_{i-j} $

右边是卷积

但是你要求F0,没法逆推回去,怎么办呢?

可以设Fi=Ai*F0+Bi

A0=1,B0=0

然后代入,只剩关于a、b的递推,推到Fn

由于Fn已知,于是解个一元一次方程就行了

B:

读懂题意很重要

技能发动时间只与之前选过的集合内的ti之和有关

于是二分答案+状压DP即可

H:

枚举三个点确定一个平面,并且这个平面与这些线段的相交情况已经完全被涵盖了(可以从二维角度思考,两两点的连线也已经包括了所有点是否经过的情况)

暴力,但要深入分析

I:

又是套路堆题,CSP2021

第一个关键点取到r最小的区间是最优的,然后按r从小到大删去包含它的k个区间。。。重复以上步骤。用优先队列即可维护。

这种题,很多都可以先想“第一个点该选谁”“第一个区间该选哪个点”然后一步步“递归”

我总是希望Rmin一次次变得更大些,这样关键点就不用放那么多

K: 简单题,用中点做分治更简单

L:

艹,不会做的数数都是dp

E:

可以拆边,然后分开,按找kruscal边权大小考虑:

若a<=b: (u,v,a,1),(u,v,b,-1)

若a>b:(u,v,b,0),(u,v,a,1)

然后选边,把各自的0/1加起来为sum

F[i][S][sum]表示选到第i条边,当前点的联通状态为S,0/1和为sum的方案数

原来贝尔数记录联通状态就可以dp了啊,孤陋寡闻了

(话说想到前年停课的那段时间做的很多题还挺有启发意义的呢)