ICPC2018南京站 VP总结+部分简要题解

鸽子回笼。

CF101981,赛中8题,罚时1264,直接上天,3h45min后弃疗,youngk和xyf和bangbang都在,直接开始茶话会(

开始口胡。

A题
ls表示不会。
卢姥爷表示不会。
ghj表示卧槽你们这个都不会。

定理——当场上有两个一模一样的游戏时,先手必败。
故先手玩家试图整出两个一模一样的游戏。
注意N可以等于0

D题
拿到之后一脸不会。
估摸着和最校园覆盖差不多,但三个人都搞忘了最小圆覆盖怎么搞。
大力猜想了一发XYZ均单峰,一维显然单峰,二维ghj证出来单峰。
一发三分套三分套三分抬走。

E题
观察到如果可以从S到T,那么一定可以从T到S
手玩一波发现连续k个0或者1可以任意移动,其他不能变。
于是就有了把所有的连续k个0/1提走,判断剩下的一不一样
然后就变成了祖玛题。链表搞定。
我们来证明一下连续k个0/1可以任意移动这件事。
不妨考虑连续k个0
若右边为1,则先reverse这k个0,得k+1个1,再reverse靠右的k个1,得1个1和k个0,完成移动。
若右边为0,则假装他移动了就好。
连续k个1,往左移动情况同理。
核心思想是,找到某个固定形状,把S和T都往上转化。
中途相遇的味道。

G题
ls + 卢姥爷:“这东西绝壁是个多项式”
于是转为数数+找规律
ghj数的很开心
卢姥爷数的很开心
liangs333不想数数,他把每个点的实数坐标弄出来,N^3大力枚举,变算几题。
算出来 n=4时答案为35,n=5时答案为70,n=6时答案为126
ls和卢姥爷在推通项。
ghj在打拉格朗日插值。
他们仨都很开心。

#include <bits/stdc++.h>
using namespace std;
 
const int xkj = 1000000007;
int ghjyyds[6] = {0, 1, 5, 15, 35, 70}, lsyyds[6][6], ljryyds[6];
 
int qpow(int x, int y)
{
	int ans = 1;
	while (y > 0)
	{
		if (y & 1) ans = ans * (long long)x % xkj;
		x = x * (long long)x % xkj;
		y >>= 1;
	}
	return ans;
}
 
void work()
{
	int x; scanf("%d", &x);
	int ans = 0;
	for (int i = 1; i <= 5; i++)
	{
		int sb = 1;
		for (int j = 1; j <= 5; j++)
		{
			if (j != i)
			{
				sb = sb * (long long)(x - j + xkj) % xkj;
			}
		}
		ans = (ans + sb * (long long)ghjyyds[i] % xkj * ljryyds[i] % xkj) % xkj;
	}
	printf("%d\n", ans);
}
 
int main()
{
	int t; scanf("%d", &t);
	for (int i = 1; i <= 5; i++)
		for (int j = 1; j <= 5; j++)
			lsyyds[i][j] = qpow((i - j + xkj) % xkj, xkj - 2);
	for (int i = 1; i <= 5; i++)
	{
		ljryyds[i] = 1;
		for (int j = 1; j <= 5; j++)
		{
			if (i != j)
				ljryyds[i] = ljryyds[i] * (long long)lsyyds[j][i] % xkj;
		}
	}
	while (t--) work();
	return 0;
}

I题
一眼网络流题。
第一次很naive的以为,S到人连2的流量,人到怪连1,怪到T连1,从S推流时,总流量限制为n+k就能过。
写了一发,TLE4。
以为被卡常,此时还没发现这建图和这网络流板子都是WA的。
反例:
5个人5个怪,1号2号通杀12345怪,345啥都不干,一瓶药。
上述建图跑出来ans=4,实际ans=3
以为这题卡网络流,隧转匈牙利。
考虑一个人拆两个点,优先匹配原生点,之后匹配药水点。统计多少对原生点和药水点同时产生贡献,记为p,与k进行chkmin操作
ans = pip - p + min(k,p)
还好过了。
获得教训*2
教训1: 网络流建图不能想当然,一定得上手画一画跑一跑
教训2:
如果这当前弧只加了上半截,那人就没了。
这波是反应过来自己板子假了。

short dfs(int nw,short nflow,short ftar) { 
	if(nw == ftar) 
		return nflow;
	short ret = 0;
	for(int i=cur[nw];i<ed[nw].size();i++) { 
//		cur[nw] = i;
//		上半截
		int tar = ed[nw][i].to;
		if(ly[tar] != ly[nw] + 1) 
			continue;
		short ncanf = dfs(tar,min((int)ed[nw][i].flow,nflow - ret),ftar);
		ed[nw][i].flow -= ncanf;
		ed[tar][ed[nw][i].opp].flow += ncanf;
		ret += ncanf;
//			if(ret == nflow) break;
//			下半截
		} 
	return ret;
} 

J题
ghj搞的,不知道是个啥,看起来瞎搞一搞就好了。

K题
ICPC2020南京告诉我们,输出5w个随机就好了(雾)
这玩意赛场初见上我觉得我也想得出来
乱搞使人强大.jpg
口个正解,每次随便找一个还未和1号点重合的点,bfs寻路找到他到1号点的最短路,然后对于每个点更新一发位置,迭代下去,啥时候找不到非重合点了就好了。
顺手randomshuffle寻找顺序,不然可能会被卡。

M题
ghj:“ls过来帮我写个后缀自动机”
ls:“蛤你要干啥?”
ghj:“俩串,第一个串对于每个位置i,判一判从他往后最多能匹配第二个串的多长的前缀。”
ls:“woc这不是二分+哈希吗?”
ghj:“woc对啊这不是二分+哈希吗。”

反过来二分+哈希判LCP,对于每个点作为结尾,贡献的倍数为“以他后头那个点作为结尾的回文串数”,马拉车+前缀和统计个贡献,加一加乘一乘就好。

总体来说演得很开心。
罚时很上天。
还好心态稳住,后程扳回来了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值