HDU 多校 2022 游记

HDU 多校 2022 游记

在 XJ 501 机房打。

队伍:

team1093 学军中学二队

为什么有二队而没有一队,这是一个问题。


Day 1

我们原来是打算九个人打。

因为今天隔壁机房的人搬迁过来,机房里充满了快活的气息。

因为隔壁机房的人加入进来,机房里感觉有十几个人在打。

感觉非常 exciting 啊!

由于 12:00 - 17:00 比赛,提前去吃饭了。

回来时已经是 11:50 了。


EricQian:myee,那你比赛先开中间的?

myee:好。

我开场就开 G 题(一共 \(12\) 题),我超勇的!

我看到意简述:

给你一张图,每个点有颜色和权值,边有权值。

一个人能通过一条边当且仅当其实力不小于边权。

他可以从每种颜色的点中挑一个他可以从起点到达的点,获得其权值的贡献。

现在有两种操作。

其一,把某个点点权增加一个正值。

其二,查询某个实力的人从某起点出发所得的最大奖赏。

数据范围均为 \(10^5\),时限 \(4s\),多测(\(5\) 组)

我一看到就知道是 Kruskal 重构树,很快啊!

用 Dfn 转化一下,就变成了单点点权加,区间查询颜色最大权之和。

然后想都不用想,肯定是根号做法啊对不对对不对?

...


代码写了 \(9Kb\),包括 Kruskal 重构树、由乃救爷爷式 RMQ、根号分治、二维分块、\(n^{\frac13}\) 叉树等等,复杂度 \(O(n\sqrt{n\log n})\),成功贡献了 \(13\) 发罚时,我觉得很下饭啊!

大家好啊,我是 \(13\) 发罚时老哥 myee 啊,我来给大家直播下饭!


然后后来看到 sjy 过了这题,很快啊!

我打开一看:

我敲,这怎么这么搞的???

PolyLog 做法???没有设块长!!!


后来听神 SegmentTree 说,这题是虚树可以做的。

而且我还漏掉了一个重要条件——每种颜色最多出现 \(10\) 次!(根号分治、\({}^3\!\!\sqrt n\) 叉树白写了)

sjy 打的神仙单 log 做法依赖于此。

SegmentTree 说他有一个不依赖于此的 2log 做法,我觉得很厉害啊!


队伍总排名第二十。

大佬带我飞!

Time Problem ACer(Luogu ID)
12:03 K rwalxfhg
12:09 L rwalxfhg
12:15 C realMatrixCascade
12:58 B rwalxfhg
13:15 A zhoukangyang
13:40 I SegmentTree
14:40 J zhoukangyang(First Blood)
15:20 H SegmentTree
15:37 D zhoukangyang
16:46 G Rainbow_qwq

Day 2

提前打开 HDU 看比赛界面。

焕然一新!这个 UI 很 smart 啊!


EricQian 说他不打。

于是我就跟几个人去快速恰完饭后回来了。


12:00,很快啊!

打开 T9。

噔噔咚,这个 \(encrypted_data\) 是什么鬼啊。

然后立刻发了个 Clar。

然后就改成了 \(encrypted_{data}\),然而我刷新页面已经是我提交 Pollard-Rho 通过后了。

别的队有两位老哥比我早切,痛失一血。(迫真)


然后就去手玩 T7。

一眼看去像统计合法对数。

打开翻译仔细一看不是。

啊这,出题人这么敢的吗?

背景:

“SNATCH GROCERIES first, then get a covid test” has quickly become an anthem for the lockdown that started suddenly in Shanghai in the early hours of March 28th. We can describe scenes of panic buying—qiang cai, or snatching groceries—and the threat of being locked out of one’s home amid a frenzied bid to control an outbreak of covid-19 in China’s main business and finance hub. Here is the question, how does the server determine who succeeded When millions of people press the order button on their mobile phones at the same time.

译文(百度翻译):

“先抢杂货,然后做新冠肺炎检测”很快成为3月28日凌晨突然在上海开始的封锁行动的颂歌。我们可以描述在中国主要商业和金融中心疯狂控制新冠肺炎疫情的过程中,抢购强菜、抢夺杂货以及被锁在家中的威胁的场景。问题是,当数百万人同时按下手机上的订单按钮时,服务器如何确定谁成功了。

怕不是政治敏感?

去看有公式的一段,发现好像是统计有多少区间不与其余相交

光速写了一发上去,过了样例,快速的 WA 了。

罚时喜++。

仔细读题,好像是自左往右扫描,一遇到重叠就停止

那没事了,直接写啊!然后就过了。


发现阿中队伍过了 T3,就去瞄一下题目。

看到 Clar 里面有人问这题 \(n\),是否在插入后改变,admin 说不变。

开始理解为往序列最后加,看了看样例不是。

根本不为左!

直接跑了,去看别的题。


由于午睡熄灯,所以是在黑暗中打题。

打开 T11。

感觉非常智慧。

\((a_i-a_j)(a_i+a_j)=a_i^2-a_j^2\),其中 \(i<j\)

也就是 \(4\) 个点中每个点的贡献要么正要么负。

不难发现仅 \(++--\)\(+-+-\) 两类。

尝试分类统计贡献无果。

突然想起有个叫猫树分治的东西。

然后直接对着状压 dp,前后缀信息分讨合并即可。

写起来十分恶心。

voi dfs(uint l,uint r,std::vector<uint>Q)
{
	if(Q.empty())return;
	uint mid=(l+r)>>1;
	for(auto&a:Pre[mid])for(auto&b:a)b=-1e18;
	Pre[mid][0][0]=0;
	for(uint i=mid;i<r;i++)
		for(uint len=4;len;len--)
			for(uint op=0;op<(1u<<len);op++)
				Pre[i+1][len][op]=
					std::max(Pre[i][len][op],Pre[i][len-1][op>>1]+(op&1?A[i]:-A[i]));
	for(auto&a:Suf[mid])for(auto&b:a)b=-1e18;
	Suf[mid][0][0]=0;
	for(uint i=mid;i>l;i--)
		for(uint len=4;len;len--)
			for(uint op=0;op<(1u<<len);op++)
				Suf[i-1][len][op]=
					std::max(Suf[i][len][op],Suf[i][len-1][op>>1]+(op&1?A[i-1]:-A[i-1]));
	std::vector<uint>_L,_R;
	for(auto q:Q){
		if(R[q]<mid)_L.push_back(q);
		else if(L[q]>mid)_R.push_back(q);
		else
		{
			uint l=L[q],r=R[q];
			Ans[q]=
				std::max({
					Suf[l][0][0]+Pre[r][4][12],
					Suf[l][1][1]+Pre[r][3][4],
					Suf[l][2][3]+Pre[r][2][0],
					Suf[l][3][3]+Pre[r][1][0],
					Suf[l][4][3]+Pre[r][0][0],
					Suf[l][0][0]+Pre[r][4][10],
					Suf[l][1][1]+Pre[r][3][2],
					Suf[l][2][1]+Pre[r][2][2],
					Suf[l][3][5]+Pre[r][1][0],
					Suf[l][4][5]+Pre[r][0][0]
				});
		}
	}
	dfs(l,mid,_L);
	dfs(mid,r,_R);
}

其实空间可以线性,但是懒了,不想打前向星。

然后就过了。


打完后考虑做哪道。

这时右后方突然出现一个 zhouAK

此时灯还没开。

zak:T3 是可持久化平衡树板题,我去写了!

害怕。

zak 恐怖如斯。/jk/jk/jk


接下来就是“打开一题,不会一题”的状态。

最后我打开了 T4(计算几何)。

就是判断空间中两个圆环是否相互套住。

我细细想了想,直接搞个随机向量向圈一做正交投影,看它方向上 \(R\) 处在不在圈二平面上,多随机几次判断就好了???

身后突然出现神 SegmentTree。

他发现我也在做此题,问我咋做求两平面交线上任一点。

我大肆宣扬了乱搞做法,使他大受震撼,他半信半疑的走开了。

我写完后交掉,愉快的 WA 了。

然后想了想,改成了一个基于交线法向步进微小位移的做法,刚刚打完要调试时,神 SegmentTree 说他过了


Fire Blade Master 说要我们认真做 XJOI 题,赶紧上去把几道做过的多项式板子题秒了,然后回去看了眼榜,现在我们还是过 \(9\) 题的状态(zak 早就已经切 C 了)。

反正其它题也不会了,直接跑路去洛谷上做题了。

顺带给某些上午没认真听 \(O(n^2)\) 多项式的课的小朋友辅导了一下 \(O(n^2)\) 的求逆与 exp。


晚饭后过去看了看榜,排名出来了,第 \(8\) 名。

zak 他们不知道啥时候切了剩下 \(3\) 题,成功阿克了。

Time Problem ACer(Luogu ID)
12:10 I myee
12:11 L realMatrixCascade
12:13 B realMatrixCascade
12:19 G myee
12:31 A SegmentTree
12:44 E zhoukangyang(First Blood)
12:59 K myee
13:19 C zhoukangyang
14:19 D SegmentTree
15:39 F zhoukangyang
16:11 J zhoukangyang
16:43 H Forever_Pursuit

Day 3

听 EricQian 说:

Claris 命题

Claris!


然而比赛当天完全忘了比赛,12:00 才刚刚敲好某毒瘤题,打算去吃饭了才想起来。

直接不吃饭了!开题开题开题!

P.S. 今天大多数人 12:00 前似乎都忘了多校。


打开账号发现 C 题过了一车人,直接开打。

写的 getchar(),用的 CP Editor。

我敲,咋卡样例超时住了!

找了 0.5min bug 无果。

突然发现样例 copy 时末尾忘换行了!!!

加了一个,交上去,过了。

此时已经快 10min 了。


随机开了个 F 题。

我敲带修区间最小覆盖圆???

楞了 3min 才发现输入格式里保证数据随机

这不随机增量???分块即可。

化了 30min 打了出来。

Runtime Error

仔细一看处理整块答案时发现了一句 Circle ans=C[(l/B+1)*B][r/B*B];

蛤?


改掉后就是持续的 TLE 和 WA。

陆陆续续地一共交了 \(\bf28\)

最后弃坑了。此时比赛已过了 3h。

后来 sjy 用线段树过了这题。梦回一周前 Day 1。

我上次罚这么多时还是上次!

我上次分块碾不了标算还是上次!


和灰鹤交流了一下,他开 T2,我开 T8。

T8 计算几何?

刚开始要写时神 SegmentTree 过了此题。


于是打算刚 T10(因为我开始看成了无向图,以为是莫队裸题)

然后打完后发现样例第一问过不去,才意识到题目读错了。

后来想了想正解应该是 bitset 之类的。


听说灰鹤 T2 算法假了。

我去围观。发现不会。


最后成绩出来了,38 名。

我成功为队伍贡献了 28 发罚时,使我们荣获 8 题倒数!

要被乳了(悲)。

Time Problem ACer(Luogu ID)
12:09 C myee
12:54 A zhoukangyang
12:55 L SegmentTree
13:50 I SegmentTree
14:38 G 猫猬兽
15:07 H SegmentTree
15:15 D zhoukangyang
15:52 F Rainbow_qwq

Day 4

草又忘掉比赛了。

恰饭时想起来,火速吃完去写。

到机房已经 12:18 了。

今天人手相对不足,根本没得玩,GG。


先开 D。

草这不显然没有。


再开 F。

题目读了一年。

你这个 \(199\)已经花的钱数而不是第一张票的钱数你不加粗哒?


然后是 A。

简单区间 dp。

细节调了一会。

const ullt Mod=1e9+7;
typedef ConstMod::mod_ullt<Mod>modint;
typedef std::vector<modint>modvec;
modint Ans[2][505][505];
int A[5005];
int main()
{
	uint t;scanf("%u",&t);
	for(uint i=0;i<=500;i++)Ans[0][i][i]=Ans[1][i][i]=1;
	while(t--){
		uint n,m;scanf("%u%u",&n,&m);
		for(uint i=0;i<n;i++)scanf("%d",A+i);
		for(uint len=2;len<=n;len+=2)for(uint l=0;l+len<=n;l++)
		{
			Ans[0][l][l+len]=0;
			if(A[l]>=0&&A[l]+A[l+len-1]==0)
			{
				if(A[l])
					Ans[0][l][l+len]+=Ans[1][l+1][l+len-1];
				else
					Ans[0][l][l+len]+=Ans[1][l+1][l+len-1]*m;
			}
			else if((!A[l]||!A[l+len-1])&&(A[l]>=0&&A[l+len-1]<=0))
				Ans[0][l][l+len]+=Ans[1][l+1][l+len-1];
			Ans[1][l][l+len]=Ans[0][l][l+len];
			for(uint j=l+2;j<l+len;j+=2)
				Ans[1][l][l+len]+=Ans[0][l][j]*Ans[1][j][l+len];
		}
		Ans[1][0][n].println();
	}
	return 0;
}

接着是 G。

简单贪心,一个细节写挂又罚了一发。

namespace PQueue
{
	std::priority_queue<llt>Q;
    llt Lazy;
    voi clear(){Lazy=0;while(!Q.empty())Q.pop();}
    voi insert(llt v){Q.push(v-Lazy);}
    voi cut(llt v){Lazy-=v;}
    llt top(){return Q.top()+Lazy;}
};
llt A[100005];
bol solve()
{
    uint n,k;llt ATK;
    scanf("%u%lld%u",&n,&ATK,&k);
    for(uint i=0;i<n;i++)scanf("%lld",A+i);
    uint Lim=1;
    for(uint i=0,j;i<n;i=j)
    {
        PQueue::clear();
        Lim=k+1-Lim,j=i;
        do PQueue::cut(A[j]),PQueue::insert(A[j++]);while(j-i<Lim&&j<n&&PQueue::top()>ATK);
        if(PQueue::top()>ATK)return false;
        for(uint t=i;t<j;t++)ATK+=A[t];
        Lim=j-i;
    }
    return true;
}

最后是 B。

看到罚时罚了一火車就知道这题有坑。

翻了翻 Clar 发现有零环。

和灰鹤交流了一下,得到一个 dijkstra+SCC+DAGdp 的做法。

直接刚 WA 了一发。

结果发现是某个布尔数组每轮用了两次,第一次用完后没清干净导致的。

然后过了。

// 最短路 + SCC + DAG 最长路 /qd
struct Kosaraju{...}K;
llt E[100005],P[100005];
typedef std::pair<llt,llt>Val;
typedef std::pair<uint,Val>Pair;
typedef std::pair<uint,llt>Pair3;
std::vector<Pair>Way[100005];
std::vector<Pair3>RWay2[100005];
bol Gone[100005];
llt dfs(uint p)
{
    if(!Gone[p])return P[p];
    Gone[p]=false;
    for(auto s:RWay2[p])_max(P[p],dfs(s.first)+s.second);
    return P[p];
}
int main()
{
    uint t;scanf("%u",&t);
    while(t--){
        uint n,m;scanf("%u%u",&n,&m);
        for(uint i=0;i<n;i++)Way[i].clear(),RWay2[i].clear(),E[i]=1e18,P[i]=-1e18,Gone[i]=false;
        while(m--){uint u,v;llt e,p;scanf("%u%u%lld%lld",&u,&v,&e,&p),Way[u-1].push_back({v-1,{e,p}});}
        typedef std::pair<llt,uint>Pair2;
        E[0]=0;std::priority_queue<Pair2,std::vector<Pair2>,std::greater<Pair2> >Q;Q.push({0,0});
        while(!Q.empty())
        {
            uint p=Q.top().second;Q.pop();if(Gone[p])continue;
            Gone[p]=true;for(auto s:Way[p])if(_min(E[s.first],E[p]+s.second.first))Q.push({E[s.first],s.first});
        }
        printf("%lld ",E[n-1]);
        K.bzr(n);
        for(uint p=0;p<n;p++)for(auto s:Way[p])if(E[s.first]==E[p]+s.second.first)K.insert(p,s.first);
        uint cnt=K.run();
        for(uint i=0;i<cnt;i++)Gone[i]=true;
        for(uint p=0;p<n;p++)for(auto s:Way[p])
            if(E[s.first]==E[p]+s.second.first&&K.host(p)!=K.host(s.first))
                RWay2[K.host(s.first)].push_back({K.host(p),s.second.second});
        Gone[K.host(0)]=false,P[K.host(0)]=0;
        printf("%lld\n",dfs(K.host(n-1)));
    }
	return 0;
}

打完这题后就跑路了。

因为啥都不会。

似乎 Rainbow_qwq 与 SegmentTree 轮流冲 I 没有冲出来。(悲)


最后成绩出来了,127 名,6 题中的第一。

如果再过一题能前进几十名。

这边几乎没人在打,所以这场我捡漏了 5 题。

Time Problem ACer(Luogu ID)
12:20 D myee
12:36 F myee
12:57 A myee
13:13 K SegmentTree
13:19 G myee
14:38 B myee

Day 5

和上午模拟赛无缝衔接!

因为断网,上午不能提前交题离场。

所以今天又是空着肚子打比赛。


开题。准备跟榜做。

蛤你这咋 10min 无人过题哒?

蛤你这咋 10min 无人过题哒?

蛤你这咋 10min 无人过题哒?

其间随机开题几轮,均告失败。

做好没有签到的准备。


咕咕咕了一会,发现 C 有人过而且好像交的人不少,就去康了。

同时发现 L 神切 G 了。(一血!)

stO L 神 Orz。

C 题题意好迷惑啊。

1e6,看上去像贪心。

仔细想了想建了一个流量为 \(1\) 的费用流模型,掏了个类 Dinic 出来。

MLE 了 2min。

和 EricQian 在黑暗中(午睡时间)亲切交流了一会,发现自己 Naive 了……

最大流量为 \(1\) 的最小费用最大流(无负权)不就是 Dijkstra 最短路吗!

打了个 Dijkstra,T 了。

突然发现自己写假了,改了改就过了。


看到 T12 过了一火車,去看了看。

草这就是潜藏的签到题吗……

按题意模拟一遍,拿个堆优化一下就完了。

然后撞车撞上了 sjy。

T12 撞 sjy

sjy 在写,我不知道,交完才发现他已经过了。


摆烂,摆大烂。

打开 B 题。

是道数论。

转化题意:

积性函数 \(f(n)\) 满足 \(f(p^c)={p^c\over c}\)

\({1\over n}\sum_{k=1}^nf(k)\)

\(29\times2^{57}+1\) 取模。

\(n\le10^{12}\),多测(其中不多于 \(6\)\(n>10^6\)),时限 \(6s\)

积性函数前缀和,我一下就想到了 Min_25 筛,很快啊!

虽然我不会写(

但复杂度总是知道的,\(O(\frac{n^{\frac34}}{\log n})\)

这个东西很难跑得过去吧……更何况还要 u128 或 long double 快速乘。

\(O(n^{\frac23})\) 的估计也过不了了,只能考虑 \(O(\sqrt n)\) 了。

想起初三时自学但没写过的 PN 筛了!

打开 OI-wiki 重新看了遍流程,差不多记起来了。

构造 \(g=\operatorname{id}\),直接做就好了。

差不多打完时发现和 zak 撞车了。

PN 撞 zak

T 了,快乐!

反正有 zak 在,我是不是可以尽情摆烂,T 了也不用罚时。

赶紧修锅,然后把一火车的锅修掉 AC 后就跑去订正 XJOI 了。


回来看了看,发现 T4 过的人比较多但我们没人做。

开题一看,计算几何

10kb 计几模板,走你!

由于线段判交(快速判断试验 & 跨立试验)我写过并且封装好了,直接就拎过来用了。

花了 10min 打了个状压就过了。

我超这个计几签到我们咋就没人做啊?

using namespace Geo2D;
typedef std::bitset<405>BIT;
Point P[4][105],Q[25];
BIT To[25];
uint Ok[25];
BIT Bf[1u<<20|1];
uint Ok2[1u<<20|1];
uint Log2[1u<<20|1];
voi solve()
{
    uint n,m;scanf("%u%u",&n,&m);
    for(uint i=0;i<n;i++)Q[i].read(),To[i].set(),Ok[i]=(1u<<n)-1,Ok[i]&=~(1u<<i),Log2[1<<i]=i;
    for(uint i=0;i<m;i++)P[0][i].read(),P[1][i].read(),P[2][i].read(),P[3][i].read();
    for(uint p=0;p<n;p++)for(uint i=0;i<m;i++)for(uint op=0;op<4;op++)
        for(uint j=0;j<m;j++)for(uint op2=0;op2<4;op2++)
            if(i!=j||(op2!=op&&((op2+1)&3)!=op))
                if(Pass(Segment(P[op][i],Q[p]),Segment(P[op2][j],P[(op2+1)&3][j])))
                    To[p][i<<2|op]=false;
    for(uint p=0;p<n;p++)for(uint q=0;q<n;q++)if(p!=q)
        for(uint j=0;j<m;j++)for(uint op2=0;op2<4;op2++)
            if(Pass(Segment(Q[p],Q[q]),Segment(P[op2][j],P[(op2+1)&3][j])))
                Ok[p]&=~(1u<<q);
    uint ans=-1;
    for(uint i=1;i<(1u<<n);i++)
    {
        Bf[i]=Bf[i-lowbit(i)]|To[Log2[lowbit(i)]];
        Ok2[i]=Ok2[i-lowbit(i)]|Ok[Log2[lowbit(i)]];
        if(((i&Ok2[i])==i)&&(~Bf[i]).none())
            _min(ans,(uint)__builtin_popcount(i));
    }
    if(~ans)printf("%u\n",ans);
    else puts("No Solution!");
}

AC 后我们变成了第一名。

10min 后就被杭阿中赶超了。

草我是不是如果早点开这题还能略微挽回颓势。可惜没有如果。


之后我就是纯正摆烂状态。

反正神仙带我飞

最后 \(11\) 题收场。zak 最后 1min 遗憾未能成功绝杀 E。


这场我们是 rank2!!!

Time Problem ACer(Luogu ID)
12:12 G SegmentTree(First Blood)
12:47 F zhoukangyang
12:54 C myee
12:58 J (暂缺)
13:10 L Rainbow_qwq
13:27 H zhoukangyang
13:48 B zhoukangyang
14:31 K zhoukangyang
15:05 A Rainbow_qwq
15:14 D myee
16:10 I zhoukangyang

前五场成绩

HDU2022 前五场

看起来真的是神仙大佬带我飞了捏


Day 6

又是与模拟赛无缝衔接的一天!

照常不恰饭。


开题时间到了,却因个中原因未能及时到达。

12:11 分打开题一看,发现 F 过了很多人,就跑去写。

手玩了几分钟,得到了贪心结论,然后就去写了。

ullt Ans[500005],Siz[500005];
std::vector<uint>Way[500050];
voi dfs(uint p,uint f)
{
	Ans[p]=0,Siz[p]=1;
	for(auto s:Way[p])if(s!=f){
		dfs(s,p),
		_max(Ans[p],Ans[s]);
		Siz[p]+=Siz[s];
	}
	Ans[p]+=Siz[p];
}
int main()
{
	uint t;scanf("%u",&t);
	while(t--)
	{
		uint n;scanf("%u",&n);
		for(uint i=0;i<n;i++)Way[i].clear();
		for(uint i=1,u,v;i<n;i++)scanf("%u%u",&u,&v),Way[--u].push_back(--v),Way[v].push_back(u);
		dfs(0,-1);
		printf("%llu\n",Ans[0]);
	}
	return 0;
}

然后与 cmll02 以几秒之差成功撞车。


百无聊赖之中开了个 T9。

申比计算几何。

大概就是把一个矩形及其放缩、旋转后的矩形在平面上的坐标给你,让你求它们的公共的处于同一位置的点。(描述的可能有些不清晰,题目链接

然后手玩,然后就玩出来了。

using namespace Geo2D;
Point get(Line L1,Line L2){return L1.P+L1.Turn*((L2.Turn^(L1.P-L2.P))/(L1.Turn^L2.Turn));}
Point A[4],B[4];
voi solve()
{
    A[0].read();A[1].read();A[2].read();A[3].read();
    B[0].read();B[1].read();B[2].read();B[3].read();
    get(
        Segment(get(Segment(A[0],A[3]).Turn(),Segment(B[0],B[3]).Turn()),
                get(Segment(A[1],A[2]).Turn(),Segment(B[1],B[2]).Turn())).Turn(),
        Segment(get(Segment(A[2],A[3]).Turn(),Segment(B[2],B[3]).Turn()),
                get(Segment(A[1],A[0]).Turn(),Segment(B[1],B[0]).Turn())).Turn()
    ).println();
}

一交上去就 WA 了,很快啊!

啊原来这题要求误差 \(10^{-6}\) 范围啊,那我输出保留小数点后 \(6\) 位又有啥问题捏?

突然发现似乎有点不对劲。

把输出改成 \(7\) 位,过了

蛤原来我的手写快写输出,是末位向下取整的啊!


还有一道签到题 T12 不为做,破防了捏。

摆摆摆!


开 T5 瞄了眼。

推了波并没有什么用的柿子。

\[f(n,d)\overset{\operatorname{def}}=\sum_{k=1}^nH(kd) \]

\[ans(n)=\sum_{d=1}^n\mu(d)f^2(\lfloor\frac nd\rfloor,d) \]

\[f(n,d)=\begin{cases} \sum_{k|d}M(k)f(\lfloor\frac nk\rfloor,k)&(d>1)\\ \sum_{i=1}^nH(i)&(d=1) \end{cases}\]

其中 \(M=\mu*\frac1H\)

然后就弃坑了。


看到 cmll02 变成了罚时怪,过去帮忙写 T7。

然后误认为除了原根外,以任何非零因子做底数的离散对数对 \({\rm Z}_p\) 下非零因子都有定义。

于是成功罚了 \(5\) 发罚时。

然后 cmll02 自己过了。


cmll02 突然出现在我的身后!

cmll02:yk 你为啥不切 T12,都过了 500+ 人了!

我:真心不会。qwq

太逊了,被暴 D 了一通捏。

p.s. sjy 后来随手切了这题。


离比赛结束还有 1.5h。

我彻底摆烂,开始进行一个电脑的搬。

然后搬到了现在这个位置。


这场我们是 rank10!

Time Problem ACer(Luogu ID)
12:17 F rwalxfhg
12:45 I myee
12:50 H Rainbow_qwq
13:12 K zhoukangyang
13:13 A SegmentTree
14:19 B SegmentTree
14:32 G rwalxfhg
14:58 J rwalxfhg
15:44 D zhoukangyang
15:53 L Rainbow_qwq

Day 7

上午模拟赛是原题场,又是 12:00 结束!

依旧没得恰饭。


尝试看 H。

手玩了一下,决定对 SG 打个表。

结果发现 L 神已经火速切掉了。


看 D。

手玩一波,发现很 Easy 啊!

罚时!罚时!罚时!罚时!AC!

隔着 \(e+l+r+b\) 是迷惑的呢?

int main()
{
	uint t;scanf("%u",&t);
	while(t--)
	{
		uint e,l,r,b;scanf("%u%u%u%u",&e,&l,&r,&b);
		{
			uint E=e,L=l,R=r,B=b;
			if(L||R)B=0;else if(B)B=1;
			printf("%u ",E+B+std::max(L,R));
		}
		{
			uint E=e,L=l,R=r,B=b;
			uint ans=L+R+std::min(E+1,B)+E;
			printf("%u\n",ans);
		}
	}
	return 0;
}

看 C。

一眼换根,打了一半突然发现自己 naive 了。

可以看做是核心向四周连点,且四周的点分别连 \(0,1,1,2\) 个点。可能计重,要除二。

也就是

\[\frac12\sum_p\sum_{(p,a)\in E}\sum_{(p,b)\in E}\sum_{(p,c)\in E}\sum_{(p,d)\in E}[a,b,c,d\text{不同}]\binom{\deg a-1}2\binom{\deg b-1}1\binom{\deg c-1}1\binom{\deg d-1}0 \]

暴力枚举每个 \(p\)

\[\sum_{(p,a)\in E}\sum_{(p,b)\in E}\sum_{(p,c)\in E}\sum_{(p,d)\in E}[a,b,c,d\text{不同}]\binom{\deg a-1}2\binom{\deg b-1}1\binom{\deg c-1}1\binom{\deg d-1}0 \\=(\deg p-3)\sum_{(p,a)\in E}\sum_{(p,b)\in E}\sum_{(p,c)\in E}[a,b,c\text{不同}]\binom{\deg a-1}2\binom{\deg b-1}1\binom{\deg c-1}1 \\=(\deg p-3)\sum_{(p,a)\in E}\sum_{(p,b)\in E}\sum_{(p,c)\in E}[a\neq b\land a\neq c\land b\neq c]\binom{\deg a-1}2\binom{\deg b-1}1\binom{\deg c-1}1 \]

然后容斥,

\[[a\neq b\land a\neq c\land b\neq c]=1-[a=b]-[a=c]-[b=c]+2[a=b=c] \]

于是

\[\sum_{(p,a)\in E}\sum_{(p,b)\in E}\sum_{(p,c)\in E}[a\neq b\land a\neq c\land b\neq c]\binom{\deg a-1}2\binom{\deg b-1}1\binom{\deg c-1}1 \\=\Bigg(\sum_{(p,a)\in E}\binom{\deg a-1}2\Bigg)\Bigg(\sum_{(p,a)\in E}\binom{\deg a-1}1\Bigg)^2\\-2\Bigg(\sum_{(p,a)\in E}\binom{\deg a-1}2\binom{\deg a-1}1\Bigg)\Bigg(\sum_{(p,a)\in E}\binom{\deg a-1}1\Bigg)\\-\Bigg(\sum_{(p,a)\in E}\binom{\deg a-1}2\Bigg)\Bigg(\sum_{(p,a)\in E}{\binom{\deg a-1}1}^2\Bigg)\\ \\+2\Bigg(\sum_{(p,a)\in E}\binom{\deg a-1}2{\binom{\deg a-1}1}^2\Bigg) \]

然后就完了。

如果实现得优秀可以做到 \(O(n)\)


成为了自动签到机,还要继续努力!

我是签到题人!

之后全程不在场。

不出意外的话我 Day 8 还会来打,Day 9/10 因为有文化课就不来了。

不过就算我们全体高二不来,单 zak 一个就足以杀到榜上很前面了吧。

zak 一个人打一百个!


好,结果出来了,阿克了,并且拿了 Rank 1。

Time Problem ACer(Luogu ID)
12:15 H SegmentTree
12:24 I zhoukangyang
12:37 D myee
12:38 J zhoukangyang
12:56 G SegmentTree
12:58 C myee
13:04 F zhoukangyang
14:15 B Rainbow_qwq
14:37 E Forever_Pursuit
15:53 K zhoukangyang
16:00 A SegmentTree

Day 8

不出意外这回是我最后一场多校了。

剩下两场因为文化课所以没得去。


然后上午模拟赛爆零了,调巨久,没调出来……

我在 12:30 左右开题,一眼秒了签到题 A。

就奇偶分开排序呗。


然后手玩了 H。

没一会就把树形 dp 调出来了。


接着看 G。

想了一会。

首先,最优解各边边长均小于 \(n\)

然后,最优解每条边其 \(|i-j|<\sqrt n\)\(|P_i-P_j|<\sqrt n\)

于是乎直接暴力把 \(O(n\sqrt n)\) 条边找出来,进行 Kruskal 即可。

T 了一发。加了个常数优化就过了。

赛后交被卡常了。


MC:我开 T5!

我:好!我开 T2!

这个线段树维护信息有些难写啊……要同时干两颗线段树,还要同时维护四类状况。

写了一半发现撞上了 L 神。


MC:yk 你过来帮我调调 T5 呗!

我:好。

看了代码,似乎是维护每个边上次、下次出现可行边的位置,从而判断。

随手造了组数据:

1
4 1
2 3 2 5
2 2 2
2 4

然后就叉掉了他的代码。

此时 sjy 已然过了 T5。


回去补 XJOI 爆零场了。

发现赛时二元 GF 柿子列错了……。qwq

然而 T 了,还是过不去。


后来回来看时发现只剩一道防 AK 的大模拟 F 了。

最后赛时好像确实无人过……

防 AK 用大模拟还是差不多得了捏。

听说 fyy 说他要做抖 M,来写这题了。


过了 \(12\) 题,位列 Rank 11!

Time Problem ACer(Luogu ID)
12:07 D 猫猬兽
12:15 M zhoukangyang(First Blood)
12:32 A myee
12:46 K 猫猬兽
12:59 H myee
13:32 G myee
14:03 L zhoukangyang
14:24 B SegmentTree
14:25 C zhoukangyang
14:30 I Rainbow_qwq
14:52 E Rainbow_qwq
15:42 J zhoukangyang

End?

要去上文化课了,我之后几天的不出意外是不会写游记了。

但是神仙们可能还要打,毕竟他们 NOI 前 7 天到苏州……

因此这还没完。

下面挂一下历年多校排名查看页面:

https://acm.hdu.edu.cn/multi_rank/entry/ranklist/index.php

别忘了,我们是 team1093 学军中学二队

posted @ 2022-07-19 18:27  myee  阅读(876)  评论(0编辑  收藏  举报