概述
鸽子回笼。
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("%dn", 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,对于每个点作为结尾,贡献的倍数为“以他后头那个点作为结尾的回文串数”,马拉车+前缀和统计个贡献,加一加乘一乘就好。
总体来说演得很开心。
罚时很上天。
还好心态稳住,后程扳回来了。
最后
以上就是无心雨为你收集整理的ICPC2018南京站 VP总结+部分简要题解的全部内容,希望文章能够帮你解决ICPC2018南京站 VP总结+部分简要题解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复