day0到诸城一中,宿舍没插头,我**,于是10::00睡觉……
day1是myk大爷的题,不会,敲了3个暴力……下午带本充电,晚上发现各大机房都满了……只好抢了基础2的小盆友的机房…… 日照爷带了无线网卡,耶!于是现在就在颓……
Day1 模拟题
为了大家能愉快得度过(你看,本弱弱得连“得”都用错了)夏令营的第一天,普及组 难度的模拟赛新鲜出炉了。大家 AK 完记得预习一下课件(未完成版)。
所有题目的所有输入的整数都可用 int(C/C++)或 longint(Pascal)表示。
T1.签到题(checkin.c/cpp/pas)
给定 n 个数,求出这 n 个数的一个非空子集,使得这个子集中的数的和能整除 n,无解 输出-1. 输入格式(checking.in): 第一行为数据组数 T 接下来 T 组数据,每组数据第一行为一个正整数 n,第二行为 n 个用空格分开的数。 输出格式(checking.out) : 对于每一组数据,如果无解输出一行一个整数-1;否则第一行输出一个正整数 m,表示 子集的大小,然后在第二行输出 m 个数,分别是这个子集中的数。如果有多种方案,输出 任意一种。 样例输入: 1 1 1 样例输出: 1 1 数据规模: 对于 30%的数据 n<=20 对于 50%的数据 n<=100 对于 70%的数据 n<=1000 对于 100%的数据 n<=100000,T<=10
T2.签到题 2(checkin2.c/cpp/pas)
有 n 只颓废狗在一起,颓废狗 myk 提议玩一个游戏。每只狗有 m 张牌,这 n 只狗一共 有 n*m 张牌,这 n*m 张牌上面都分别写有一个整数,代表牌的大小。这些牌上的数字互不 重复,且都小于等于 n*m,大于等于 1。 游戏规则: 给定 1-n 的一个排列 P,第 i 只狗要随机抽出自己所拥有的一张牌跟第 P[i]只狗随机抽出 的牌比大小,牌大者获胜。
请给出一个分配方案,使得这 n 只狗获胜的概率都>0.5。无解输出-1。 输入格式(checking2.in) : 第一行 T,代表数据组数,每组数据第一行为两个整数 n,m,第二行为 1…n 的一个排列 P 输出格式(checking2.out): 每组数据输出 n 行,每行按从小到大的顺序输出 m 个数,第 i 行第 j 个数代表第 i 只狗 的第 j 张牌的大小 样例输入: 1 3 3 2 3 1 样例输出: 1 5 9 3 4 8 2 6 7 数据规模: 对于 30%的数据 n*m<=10 对于 60%的数据 n*m<=1000 对于 100%的数据 n<=1000,m<=1000,T<=10
T3.签到题 3(checkin3.c/cpp/pas)
给定一棵有根树(根节点为 1),每个点都带有权值,对于点 u,其权值设为 a[u],其父 亲为 fa[i]。现有两个函数 f1,f2,定义如下: 如果 u=1,f1[u]=a[u],f2[u]=1 否则 如果 f1[fa[u]]+1<a[u] f1[u]=a[u],f2[u]=1; 如果 f1[fa[u]]+1>a[u] f1[u]=f1[fa[u]]+1,f2[u]=f2[fa[u]] 如果 f1[fa[u]]+1=a[u] f1[u]=f1[fa[u]]+1,f2[u]=f2[fa[u]]+1
现在有两种操作: 0 u val 表示将 a[u]改成 val 1 u 表示查询 f1[u]和 f2[u]
输入格式(checking3.in) : 第一行为 n。第二行为 n 个正整数,第 i 个数代表第 i 个点初始时的权值 a[i]。接下来 n-1 行, 每行两个整数 u,v,代表 u 与 v 连有一条边。接下来一行为一个正整数 Q。下面 Q 行,每一 行格式为 0 u val 或 1 u。 输出格式(checking3.out): 对于每种格式为 1 u 的询问,输出一行两个数,分别为 f1[u],f2[u] 对于 40%的数据 n<=1000,Q<=1000 对于另外 40%的数据 保证这棵树为一条链 对于 100%的数据 n<=200000,Q<=200000 样例输入: 3 1 2 3 1 2 2 3 1 1 3 样例输出: 3 3 提示:请选手注意 Windows 下的栈空间大小
题解:
T1:
维护前缀和(一共n个),然后都mod n,要么是全都不一样(那么就有0了),要么有两个一样的,作差为0,比如s[i]-s[j] mod n ==0 那么 [i+1,j] 就是一个解
T2:
奇怪的构造……
T3:
f1[u]=dep[u]+max{a[v]-dep[v]| v==u||v是u的祖先}
f2[u]=\sum_{v}^{[v==u||v是u的祖先 && a[u]-dep[v]==f1[u] ]}//式子应该化错了
链剖线段树……