Gym103098(2020-2021 Winter Petrozavodsk Camp, UPC contest)

链接

I. Interesting Scoring Systems

J. Joyful Numbers

K. Königsberg Bridges

L. Long Grid Covering

签到题。

A. Adjacent Rooks

\(GF\) 大失败,\(dp\) 大胜利。

填排列一种很经典的 \(dp\) 是从小到大依次插入,这样能比较好处理相邻数之间的关系

所以设 \(f_{i,j,0/1}\) 表示到 \(i\) 有 \(j\) 个连续,\(i\) 和 \(i-1\) 是否相邻。

插入一个数分讨,可能使连续数 \(+1,-1\) 或不变。

B. Beautiful Permutation

打表构造?出题人坚持这是本场最难的题,严谨构造也不怎么看得懂。

直接推柿子可以发现:

\[\sum b \equiv \sum a- \sum i (mod \ \ 2) \\ \frac{n(n-1)}{2} \equiv n(n-1)(mod \ \ 2) \]

所以 \(n \% 4=2/3\) 都无解,然后打表剩下都有解。

\(n \% 4\) 提醒我们可以考虑 4 个分成一组或分成 4 组,钦定前 \(n/4\) 个倒序然后看表,看有没有比较顺的答案。

下面是在 \(n=16,17\) 找出的比较合理的答案

//15 14 13 12 3 11 10 9 8 6 5 4 2 1 0 7 
//16 15 14 13 4 12 11 10 9 7 6 5 3 2 1 0 8
if(n%4==0){
    for(int i=0;i<n/4;i++) a[++tot]=n-1-i;
    a[++tot]=n/4-1;
    for(int i=0;i<n/4;i++) a[++tot]=n-1-i-n/4;
    for(int i=0;i<n/4-1;i++) a[++tot]=n/2-2-i;
    for(int i=0;i<n/4-1;i++) a[++tot]=n/4-2-i;
    a[++tot]=n/2-1;
}
else{
    for(int i=0;i<n/4;i++) a[++tot]=n-1-i;
    a[++tot]=n/4;
    for(int i=0;i<n/4;i++) a[++tot]=n-n/4-1-i;
    for(int i=0;i<n/4-1;i++) a[++tot]=n/2-1-i;
    for(int i=0;i<n/4-1;i++) a[++tot]=n/4-1-i;
    a[++tot]=0; a[++tot]=n/2;
}

C. Cartesian MST

直接展开成 \(n*m\) 的网格,然后还是跑 \(kruskal\) ,每次加一条边相当于合并两行/两列,加的边数就是剩余列数/行数,直到最后缩到一个点。

复杂度 \(O((n+m)log(n+m))\)。

D. Display of Springs

回忆一下李超树的过程:对于每个节点找出中点最大的,然后标记永久化。

所以建树比较次数 \(O(nlogV)\) ,查询比较次数 \(O(logV)\)。

E. Even Intervals

\(5e4\) 可以离线还是 20s,莫队+权值线段树即可。

F. Friendship Circles

考虑要使圆包含 0 而不包含 \(x\) ,那么必须要满足圆心在 0 和 x 中垂线靠 0 这一侧。

所以直接半平面交,在交后的图形内任意一点做圆过 0 保证和其它点不会相交,所以只要看多少线构成这个交即可。

题解比较 nb,考虑圆反演:

首先如果有解那么肯定存在一个圆过两个点符合要求。对于 0 圆反演,那么这个圆就是一条直线,在圆内的靠外,圆外的靠内。

因为是个双射,所以我们可以通过圆反演之后的图形来做:如果有一个点可以,那么就是存在一条直线使得仅有这个点在直线外。

所以只有凸包上的点合法。

G. Game on a Tree

好像挺有意思的,留坑待填。

上一篇:Benelux Algorithm Programming Contest 2020部分题解


下一篇:E - Hello XTCPC from: SDUT 2021 Summer Individual Contest - 1(for 20)