2021 年广东省重点中学信息学冬令营 (GDKOI 2021)
提高组 第一试
2021 年 1 月 29 日
注意事项
提交文件: cut.cpp
输入文件: cut.in
输出文件: cut.out
时间空间限制: 1s, 512MB
有一个无向图 G = (V, E),将 V 分成两个集合 S, T 使得 S ∩ T = ∅ 且 S ∪ T = V ,定义割为:
Cut(S, T) = {e = (x, y) ∈ E|x ∈ S, y ∈ T} 求 S, T 使得 |Cut(S, T)| ≥ 12 |E|。如有多种解,任意输出一种即可。
输入格式
第一行两个整数 n, m,表示 G 的点数以及边数。
接下来 m 行,每行两个数 x, y,表示一条边。
输出格式
输出一行,共 n 个数字 0 或 1,1 表示第 i 个点在集合 S 中,否则在集合 T 中。
保证一定有解,输出任意一组解即可。
样例数据
cut.in cut.out
4 6
1 2
1 3
1 4
2 3
2 4
3 4
0 0 1 1
数据范围
保证没有自环,注意重边需要重复计算。
对于 30% 的数据,n ≤ 20。
对于另外 20% 的数据,G 是二分图。
对于 100% 的数据,n ≤ 105
, m ≤ 2 × 105。第 2 页 共 6 页
GDKOI 2021 TG Day1
提交文件: busy.cpp
输入文件: busy.in
输出文件: busy.out
时间空间限制: 1s, 512MB
出题人很忙,他不是在赶 ddl,就是在赶 ddl 的路上。
然而出题人很贪玩,他喜欢忙里抽空,在夜之城伸张正义。
某一天他来到了夜之城的一个神秘的街区。这个街区可以看做由网格中若干个边长为 1 的正方形 (block)
组成。
这个街区的形状很有特点,街区下端的边界是一条长为 n 的公路,被在网格图上能被分成 n 段。第 i 段
上方有 ai 个 blocks。如下图所示。
图 1: 街区
出题人在街区中解决大大小小的犯罪团伙的时候,想到了这样一个无厘头的问题:
假如出题人在夜之城找到了某种区域性武器。他可以把武器布置在下端的公路上。这种武器的攻击范围
是一个矩形,矩形的下边界必须与公路贴合。上边界必须与街区的某一个上边界贴合。他想知道,如果把所
有可能的攻击范围按面积从小到大排序,第 L 大到第 R 大的面积是多少。
出题人很善良,不想让选手看很长的题面,于是给出了一个简洁的题面:
给出长为 n 的序列 a1, a2, · · · , an,记
f(l, r) = (r l + 1) · min
l≤i≤r ai
若将所有的 f(l, r)(1 ≤ l ≤ r ≤ n) 从小到大排序,求排名为 L 到 R 的所有的 f 值。
输入格式
第一行一个正整数 n,表示序列 a 的长度。
第二行 n 个整数,表示 a1, · · · , an。
第三行两个整数 L, R,表示询问的排名区间。
输出格式
一行,共 R L + 1 个整数,第 i 个数表示排名在 L + i 1 的 f 值。
第 3 页 共 6 页
GDKOI 2021 TG Day1
样例数据
busy.in busy.out
8
1 5 10 4 7 8 1 2
4 10
2 2 2 3 3 3 4
数据范围
对于 20% 的数据,n ≤ 500;
对于 40% 的数据,n ≤ 10000;
另外存在 20% 的数据,保证 L = R;
对于 100%,n ≤ 3 × 105
, ai ≤ 109, 1 ≤ L ≤ R ≤ n(n+1)
2
, R L + 1 ≤ 3 × 105。 第 4 页 共 6 页
GDKOI 2021 TG Day1
提交文件: palindrome.cpp
输入文件: palindrome.in
输出文件: palindrome.out
时间空间限制: 3.5s, 512MB
定义回文串为满足如下性质的字符串 t = t1t2 · · ·tn: ti = tn i+1 1 ≤ i ≤ n
给定一个字符串 s,以及 q 个询问。
每次询问给定两个整数 li
, ri,你能回答 s[li
, ri] 的最长回文子串的长度是多少吗?
输入格式
第一行一个字符串 s。
第二行一个整数 q,表示询问个数。
接下来 q 行,每行两个整数 li
, ri,表示询问 s[li
, ri] 的最长回文子串的长度。
输出格式
对于每个询问,输出一个整数表示 s[li
, ri] 的最长回文子串的长度。
样例数据
palindrome.in palindrome.out
aaacbdccccadaadabbdbadcbcbbadcadb
6
5 22
1 18
15 33
1 33
8 12
15 27
663633
数据范围
对于 10% 的数据, 保证 n ≤ 300, q ≤ 300。
对于 30% 的数据, 保证 n ≤ 5000, q ≤ 5000。
对于 70% 的数据, 保证 n ≤ 5 × 104
, q ≤ 5 × 104。
对于 100% 的数据, 保证 n ≤ 5 × 105
, q ≤ 5 × 105。 第 5 页 共 6 页
GDKOI 2021 TG Day1
提交文件: night.cpp
输入文件: night.in
输出文件: night.out
时间空间限制: 1s, 512MB
您在玩东方永夜抄。
历经重重磨难,您终于来到了辉夜姬面前,回答出了五个难题。
“想要通关,你还需要解决这第六道题哦”,等待您的却是这样的回答:
“我有一棵有根二叉树,但我已经遗忘了它本来的样子。
“我只知道它有 n 个叶子,每个叶子的美观度为 1,每个非叶节点均有两个儿子。
“我还记得 k 个信息,对于每个非叶节点,如果其左儿子的叶子节点个数为 si,则其美观度为 vi。
“如果 k 条信息均不满足,那么其美观度为 A。
“二叉树的美观度为所有节点美观度的乘积,现在请你告诉我所有可能的二叉树的美观度之和。”
是时候面对这最终的挑战了。
答案可能很大,您只需要回答答案对 109 + 7 取模之后的结果。
输入格式
第一行三个整数,表示 n, k, A。
接下来 k 行,每行两个整数,表示 si 和 vi。
输出格式
输出一行,一个整数,表示答案对 109 + 7 取模 之后的结果。
样例数据
night.in night.out
5 1 1
2 2
25
6 2 1
2 3
4 5
268
数据范围
本题采用子任务捆绑评测。
对于所有数据,满足 1 ≤ n ≤ 106, 0 ≤ k ≤ 10, 1 ≤ si < n, 0 ≤ vi
, A < 109 + 7,同时保证 ∀i = j, si = sj。
Subtask 1(20 pts):n ≤ 103
Subtask 2(10 pts):k = 0
Subtask 3(40 pts):n ≤ 5 × 104
Subtask 4(30 pts):无特殊限制
#include
#include
#include
using namespace std;
struct jgt
{
int x,y,nxt;
} e[200010];
int head[100010],ans[100010];
int main()
{
freopen("cut.in","r",stdin);
freopen("cut.out","w",stdout);
int n,m,sum0,sum1,i,j;
scanf("%d%d",&n,&m);
memset(ans,0,sizeof(ans));
for(i=1; i<=m; i++)
scanf("%d%d",&e[i].x,&e[i].y),e[i].nxt=head[e[i].x],head[e[i].x]=i;
for(i=2; i<=n; ans[i]=(sum0>sum1),i++)
for(sum0=sum1=0,j=head[i]; j; j=e[j].nxt)
sum0+=(ans[e[j].y]==0),sum1+=(ans[e[j].y]==1);
for(i=1; i<=n; i++)
printf("%d ",ans[i]);
fclose(stdin);
fclose(stdout);
return 0;
}