THUPC 清华校赛总结
虽然某些题难度爆炸,但我还是吧题面发一下吧。。。。。
THUPC两人300分祭。。。。。。
作为一个离北京上百公里的人,不可能长途跋涉,便只参加了网络赛。。。。。。
难度顺序(大概):M(签到题)--D--B(然俄只A了MDB三题)--C--J--L--K--I--其他
A 不用找的树
时间限制: 10.0 秒
空间限制: 512 MB
相关文件: 题目目录
题目描述
给出一棵 n 个节点的树,结点标号从 1 到 n。
定义树上两点 a,b 间的距离 d(a,b) 是最小的非负整数 k,满足存在结点序列 v0,v1,…,vk,满足 v0=a,vk=b,且对于 0≤i≤k−1 有 vi 和 vi+1 之间在树上有一条边相连。
有 m 个询问,每个询问包含参数 p0,d0,p1,d1,求:
输入格式
从标准输入读入数据。
第一行一个整数 n,表示树的节点数目。
接下来一行 n−1 个整数 f2,f3,…,fn,依次表示 i 和 fi(1≤fi≤i−1) 之间有一条边。
接下来一行一个整数 m,表示询问数目。
接下来 m 行依次描述所有询问:每行四个整数 p0,d0,p1,d1 (1≤p0,p1≤n,0≤d0,d1≤n−1)描述一组询问。
保证 1≤n≤105,1≤m≤105。
输出格式
输出到标准输出。
共 m 行,依次回答各组询问:每行输出一行一个整数表示这组询问的答案。
样例输入
7
1 1 2 3 5 2
5
5 1 5 0
2 0 5 0
2 2 4 5
7 2 2 4
3 2 5 4
样例输出
2
3
69
57
70
表示看不懂。。。。。。,直接上TJ吧。。。。。。
简要题意
• 树上的一个邻域定义为到点 x 距离不超过 y 条边的点集,x 称为
邻域的中心,y 称为邻域的半径。
• 给一棵 n 个点的树,m 次询问,每次给出两个邻域,问两个邻域
中各取一个点,两两点对间的距离之和 。
• n,m ≤ 100000
特殊限制下的算法
• 情况1:如果两个邻域不相交,则存在一个点c,使得两个邻域间任意
路径经过c,只需统计两个邻域的点数以及到c的距离和。
• 情况2:只有一次询问。
• d(a,b)=d(a,root)+d(b,root)-2d(lca(a,b),root)
• 转化为求两两点间lca的深度和。将第一个邻域中 的每个点到根的路径
上边权加上1,求第二个邻域中的每个点到根的路径的边权和。时间复
杂度O(n)。
• 情况3:所有询问中,两个邻域的中心是固定的两个点x,y,但半径可
能不同。
• 枚举第一个邻域的半径,类似情况2处理,处理出所有可能的询问的答
案,时间复杂度O()。
解法简述
• 树分块,要求每个块有两个端点,两个块只在端点处相邻,块数和块大小均
为O()
。此时块之间的相邻关系构成一棵树,每条边对应一个块。
• 原树的一个邻域可以拆成每个块中的邻域,且除了中心所在的块,其余块的
邻域以块的端点为中心。
• 每次询问时,在块构成的树上进行树形dp统计不同块中的邻域之间的距离和,
类似于情况1。每次询问需要O()
时间。
• 同个块内两个以端点为中心的邻域间的距离和,每次询问在每个块中产生
O(1)个询问,可以最后离线计算,类似于情况3。每个块需要O(n)时间。
• 同个块内的两个邻域,至少一个邻域的中心不在端点上的情况,每次询问至
多出现2次,类似于情况2处理。每次询问需要O()时间。
时间复杂度O()
各大佬们自己写代码吧。。。。。。
恕本蒟蒻太弱了。。。。。
B 组合数据结构问题
少见的板子题
时间限制: 1.0 秒
空间限制: 512 MB
相关文件: 题目目录
题目背景
众所周知,小葱同学擅长计算,尤其擅长计算组合数,但这个题和组合数没什么关系。
题目描述
小葱同学在学习了组合数的计算之后,开始了研究数据结构的道路。通过十五分钟的刻苦学习,小葱同学初步掌握了队列、栈和堆这三种数据结构。小葱同学发现这三种数据结构都支持两种操作:
- 将某个数插入该数据结构。
- 从该数据结构中按照数据结构的原理取出一个数。
小葱同学为了检验自己对这三种数据结构的理解,设计了一个类似的黑箱模型。该模型也支持两种操作,向黑箱中输入一个数或者从黑箱中输出一个数。现在小葱对该黑箱做了若干次操作,并给出每次输入和输出的数,问这个黑箱实现的是否可能是队列、栈、大根堆或者小根堆。
虽然小葱同学对这四种数据结构了如指掌,但他还是决定告诉你它们的分别是什么:
如果黑箱是队列:黑箱初始为空,输入时数将被放入黑箱,输出时当前黑箱内最早被放入的数将被输出并移出黑箱。
如果黑箱是栈:黑箱初始为空,输入时数将被放入黑箱,输出时当前黑箱内最晚被放入的数将被输出并移出黑箱。
如果黑箱是大根堆:黑箱初始为空,输入时数将被放入黑箱,输出时当前黑箱内值最大的数将被输出并移出黑箱。特别地,如值最大的数有多个,则仅将其中一个移出黑箱。
如果黑箱是小根堆:黑箱初始为空,输入时数将被放入黑箱,输出时当前黑箱内值最小的数将被输出并移出黑箱。特别地,如值最小的数有多个,则仅将其中一个移出黑箱。
输入格式
从标准输入读入数据。
第一行一个整数N代表操作的个数。
接下来N行每行两个整数opt,v。如果opt=1,代表这次操作小葱同学向黑箱中插入了v这个数;如果opt=2,代表小葱这次操作从黑箱中取出了v这个数。
保证 0≤N≤105,−231≤v<231,opt∈{1,2}。
注意输入的数据仅保证在格式和范围上完全正确,不保证任何其他条件。
输出格式
输出到标准输出。
共四行,每行可能是Yes
或者No
,分别依次代表该黑箱是否可能是队列、栈、大根堆或者小根堆。
样例1输入
6
1 1
1 2
1 3
2 1
2 2
2 3
样例1输出
Yes
No
No
Yes
解法很简单,就是在插入的时候用各种数据结构的方式插入,2操作的时候就判断某个数据结构是否会删除这个数,如果会的话就将其删除,否则就不管他了(因为有一个输出条件不满足,小葱就肯定模拟的不是这个数据结构了)
但要注意坑:其中某些数据类似于这样(我没见过,下面的数据纯属自编)
1 1
2 1
2 1
2 1
2 1
2 1
这个时候输出的比输入的多,所以没有任意一个数据结构可以做到这样。。。。。
所以特判一下,输出四个No就行了
上代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <queue>
#include <stack>
using namespace std;
int topx,f1,f2,f3,f4,t1,t2,t3,t4;
priority_queue<int> big;
priority_queue<int,vector<int>,greater<int> > small;
queue<int>qq;
stack<int>s;
int main()
{int q;scanf("%d",&q);for(int i=1;i<=q;i++){int a,b;scanf("%d%d",&a,&b);if(a==1){qq.push(b);s.push(b);big.push(b);small.push(b);}else{int a1,a2,a3,a4;if(qq.size()==0) t1=1;else t1=0;if(s.size()==0) t2=1;else t2=0;if(big.size()==0) t3=1;else t3=0;if(small.size()==0) t4=1;else t4=0;if(t1==0) a1=qq.front();if(t2==0) a2=s.top();if(t3==0) a3=big.top();if(t4==0) a4=small.top();if(t1==0) qq.pop();if(t2==0) s.pop();if(t3==0) big.pop();if(t4==0) small.pop();if(a1!=b && t1==0 || t1==1) f1=1;if(a2!=b && t2==0 || t2==1) f2=1;if(a3!=b && t3==0 || t3==1) f3=1;if(a4!=b && t4==0 || t4==1) f4=1;}}if(f1==1) printf("No\n");else printf("Yes\n");if(f2==1) printf("No\n");else printf("Yes\n");if(f3==1) printf("No\n");else printf("Yes\n");if(f4==1) printf("No\n");else printf("Yes\n");return 0;
}
(这个代码是队友打的)
C 过河卒二
时间限制: 1.0 秒
空间限制: 512 MB
相关文件: 题目目录
题目背景
首先我们回忆一下经典难题过河卒问题:
棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向上、或者向右。同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点,因此称之为“马拦过河卒”。
棋盘用坐标表示,A点(1,1)、B点(N,M),同样马的位置坐标是需要给出的。
现在要求你计算出卒从A点能够到达B点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。
请注意,上述背景内容与本题无关!
题目描述
Kiana喜欢玩象棋,尤其是喜欢用象棋玩过河卒的游戏。在传统的过河卒问题中,Kiana需要控制一个卒从起点走到终点,在路中避开一个对方的马的攻击,然后假装不会算并询问你从起点到终点的路径总数。
在今天的过河卒二游戏中,Kiana还是控制一个卒在一个N×M的棋盘上移动,初始时卒位于左下方坐标为(1,1)位置,但为了增加难度,Kiana对游戏规则做出了一些修改。传统的过河卒每步只能向上或向右移动1格,Kiana规定自己的过河卒二还可以在一步中向右上方移动1格,即如果当前卒位于坐标(x,y)处,则下一步可以走到(x+1,y)、(x,y+1)或(x+1,y+1)中的任意一格里面去,同时Kiana认为,如果两种移动方案在某一步时卒移动的方向(右、上或右上)不同,则两种方案就是不同的,例如从(1,1)先走到(1,2)再走到(2,2)、从(1,1)先走到(2,1)再走到(2,2)和从(1,1)直接走到(2,2)是三种不同的移动方案。
其次,过河卒二的终点不再是一个特定的位置,Kiana规定卒可以从棋盘的上方或右方走出棋盘,此时就视为游戏成功。注意在走出棋盘时仍然有方向选择的不同,例如若过河卒位于(1,M)处,则下一步它可以向右或者向右上用两种方式走出棋盘,若过河卒位于(N,M)处,则下一步它可以向上、向右或者向右上用三种方式走出棋盘,以不同的方式走出棋盘仍然被算作是不同的移动方案。
此外,对方马的攻击范围不再是有规律的几个位置,而是Kiana规定好的K个特定坐标,并要求过河卒在移动的过程中不能走到这K个坐标的任何一个上,在除这些坐标以外的位置上过河卒都可以按规则自由移动。
现在Kiana想知道,过河卒二有多少种不同的移动方案可以走出棋盘,这个答案可能非常大,她只想知道方案数对59393取模后的结果。由于她不会算,所以希望由你来告诉她。
输入格式
从标准输入读入数据。
第一行包含三个整数N、M和K,分别表示棋盘的坐标范围与对方马的攻击格子数(即Kiana规定的不能经过的坐标数)。
接下来K行,第i行包含两个正整数Xi和Yi,表示对方马的第i个攻击坐标为(Xi,Yi)。
对于所有数据,保证1≤N≤109,1≤M≤105,0≤K≤20,1≤Xi≤N,1≤Yi≤M,(1,1)一定不会被对方马攻击,且被攻击的格子中不存在两个坐标相同的格子。
输出格式
输出到标准输出。
输出一行一个整数,表示过河卒走出棋盘的方案数对59393取模后的结果。
样例1输入
3 3 1
2 2
样例1输出
24
样例1解释
用↑表示过河卒向上移动了一格,用→表示过河卒向右移动了一格,用↗表示过河卒向右上移动了一格,由此可以简化样例解释的表述。
24种移动方案如下:(↑↑↑)、(↑↑↗)、(↑↑→↑)、(↑↑→↗)、(↑↑→→↑)、(↑↑→→↗)、(↑↑→→→)、(↑↗↑)、(↑↗↗)、(↑↗→↑)、(↑↗→↗)、(↑↗→→)、(→→→)、(→→↗)、(→→↑→)、(→→↑↗)、(→→↑↑→)、(→→↑↑↗)、(→→↑↑↑)、(→↗→)、(→↗↗)、(→↗↑→)、(→↗↑↗)、(→↗↑↑)。
本想着用递推O()就可以解决了的,然俄一看数据范围就放弃了
然俄题解就更看不懂了!!!!
题目简述
• 给定一个二元组集合S,定义二维数列 f:
• 给定 n,m, 求
没有障碍的情况
• 求得f 的OGF 为 且只需要乘上1/(1-x) 或 1/(1-y)
就能得到某一行或某一列的前缀和的 OGF。展开之后,显然可以
在 O(m)的时间内求出某个 或 f 某一列或某一行的前缀和。
• 注意到模数是质数,使用 Lucas 定理求二项式系数的值。
有障碍的情况
• 考虑容斥。设 为第一次走到的障碍为第 i个障碍的方案数。先
求出经过i 的总方案数,再枚举位于i 的最下方的障碍 j 减去那
些方案 ,就可得到
。实现上可以通过建出 DAG 后拓扑排序
递推求解。
• 总时间复杂度为O()
D 鸽鸽的分割
时间限制: 1.0 秒
空间限制: 512 MB
相关文件: 题目目录
题目描述
牛牛有一块蛋糕,他想把蛋糕分给小朋友们。蛋糕一开始是圆形的,牛牛会在圆周上选择 n 个不重合的点,将这几个点两两用线段连接。这些线段将会把蛋糕分成若干块。
现在,牛牛想知道,蛋糕最多会被分成多少块,请你告诉他答案。
输入格式
从标准输入读入数据。
输入包含至多20行,每行一个整数 n,含义见【题目描述】。保证 0≤n≤64。
输出格式
输出到标准输出。
依次回答牛牛的每个问题,对于每个问题,输出一行,包含一个整数表示答案。
样例1输入
2
3
4
样例1输出
2
4
8
解 : 找规律得, 当有x个点的时候,分成的块数为1 + x * (x - 1) / 2 + x * (x - 1) * (x - 2) * (x - 3) / 24
#include <cstdio>
int main()
{int x;while(scanf("%d",&x)!=EOF)printf("%d\n",1+x*(x-1)/2+x*(x-1)*(x-2)*(x-3)/24);return 0;}
(中间的题实在难受,根本看不懂。。。。。。)
把涉及到的知识点发一下吧。。。。。
E,三次函数,容斥原理
F,k维空间。。。。。。好吧,实在看不懂
G,博弈论,给出几个炒鸡复杂的公式,解方程,二项式反演Lucas定理,莫比乌斯变换
H,模拟
I,凸包,树状数组(或线段树),二分法
J,???
K, 位运算,基尔霍夫矩阵,最大生成树,FWT,IFWT,前后缀和
L,并查集,哈希,+一堆公式
M。。。。。
M 历史行程
题面。。。。。。。
出题人作文满分。。。。。。
题面:给定一个年份,求该年母亲节的日期
如果不想提高自己的语文水平就不用看题了。。。。。。
时间限制: 1.0 秒
空间限制: 512 MB
相关文件: 题目目录
题目背景
人生是怎么样的呢?我们是怎样活着的呢?
无论是谁,都是从黑暗中降生,最后再回归于黑暗。几年,几十年,短暂而漫长的时光。形形色色的人,形形色色的事,如过眼云烟,转瞬即逝。过眼繁花终有尽时,有些东西还能弥留于你的记忆之中,但更多的,早已无可寻觅。
但是,有个人,你不会忘记。
在你降生于黑暗之中时,那个人就一直陪在你身边。当你突破那黑暗,第一次见到世界的光明的时候,那个人也在你身边。
第一次的啼哭,第一次的说话,第一次的走路,第一次的奔跑。
每一次的成长,是你自己的一次飞跃。而对那个人来说,则是最纯真的喜悦和感动。
在你不知道的时候,在你不知道的地方,那个人倾尽自己的一切,为你创造最好的一切,保护你的一切,为你指引走向未来的桥梁。
那个人每天都在期盼着,期盼着你能早点长大,变得拥有保护你自己的力量。
那个人每天都在担心着,担心着你与那个人分别那天,终究还是会来到。
你终究会一直成长,你终究会拥有自立自强的能力。那个人,也不能再像以前一样,保护你。
有一天,你将走向更宽阔的未来,你会拥有和以前完全不一样的一切。而那个人,已经不再能够保护你了。
而你和那个人之间能够拥有的时间,也就越来越短了。
五年,十年,二十年,你一天一天长大。
五年,十年,二十年,那个人一天天老去。
那个人已经不能保护你了,那么现在,该你,去保护那个人了。
也许那个人不能永远在你身边,也许那个人终将离你而去。
但你永远不会忘记那个人,因为那个人,始终在你身边。
今天,是那个人的节日。
题目描述
母亲节是一个为感谢母亲而庆祝的节日,而在世界各地的母亲节的日期有所不同。母亲们在这一天里通常会收到孩子们送的礼物;而在许多人心目中,康乃馨被视作最适于献给母亲的鲜花之一。
1913 年,美国国会确定将每年 5 月的第二个星期日作为法定的母亲节,这也是现代母亲节的起源。
给定一个年份,请你输出这一年的母亲节的日期。方便起见,你只需要输出它是这年 5 月的第几天即可。
输入格式
从标准输入读入数据。
一行一个整数 y,表示年份。
保证 1913≤y≤2019。
输出格式
输出到标准输出。
一行一个整数,表示这年的母亲节是 5 月的第几天。(请注意不要输出多余的前导零)
样例1输入
2019
样例1输出
12
样例1解释
2019 年的母亲节是 5 月 12 日。
签到题,不用解释吧。。。。。
#include <cstdio>
#include <iostream>
using namespace std;
int n;
int ans()
{int fday=3;if(n==2019)return 12;for(int i=2019;i>=n+1;i--){if(i%4==0)fday-=2;elsefday--;if(fday==0)fday=7;if(fday==-1)fday=6;}return 7-fday+1+7;
}
int main()
{scanf("%d",&n);printf("%d",ans());
}
THUPC 清华校赛总结相关推荐
- [置顶]2010年东北大学ACM程序设计竞赛冬季校赛题解
8题只做出4题比较easy的题,而且做得挺麻烦,看来还要多练练. AC的题如下 NEUOJ 1112 I Love Apple Description So many people love app ...
- 2017校赛 问题 F: 懒人得多动脑
题目描述 小D的家A和学校B都恰好在以点F为焦点的双曲线上,而小D每日所需的生活水源在一条平行该双曲线准线的直线上,设它的值为v.大家都知道,每天都是要喝水的,但是小D有点懒,他希望自己能在去上学或者 ...
- 关于安徽赛区推广校赛的实施办法
关于安徽赛区 推广校赛的实施办法 全国组委会: 安徽赛区作为第一个省级赛区自2010年举办至今,受到安徽省教育厅和安徽各高校高度认可,是安徽省教育厅重点支持的大学生学科和技能竞赛A类赛事.但安徽赛 ...
- 第18届浙江大学校赛 Mergeable Stack
The 18th Zhejiang University Programming Contest Sponsored by TuSimple 第18届浙江大学校赛的c题 解析:起先是用stack写的模 ...
- 21-5-22校赛J 下围棋
21-5-22校赛J 下围棋 给出一个节点个数为n的树,其根节点为1,两个人轮流操作,每一次操作可以选择一个非根节点,删除这个节点及其子树,当一个人无法进行操作的时候,他就输掉了.问后手是必胜还是必败 ...
- 21-5-22校赛G 自行车调度
21-5-22校赛G 自行车调度 n个点,m条边的无向带正权图(编号1到n).每个点初始有a[i](0<=a[i]<=1e5,1<=i<=n)辆自行车,自行车管理员可以花费一个 ...
- 2018 java蓝桥杯校赛题目
1.[问题描述] 100 可以表示为带分数的形式:100 = 3 + 69258 / 714 还可以表示为:100 = 82 + 3546 / 197 注意特征:带分数中,数字1~9分别出现且只出现一 ...
- BZOJ 3093: [Fdu校赛2012] A Famous Game
3093: [Fdu校赛2012] A Famous Game Time Limit: 1 Sec Memory Limit: 128 MB Submit: 248 Solved: 133 [Su ...
- 三农电子商务创业创新大赛作品_全国大学生电子商务“创新、创意及创业”挑战赛五邑大学校赛...
大赛简介 第十届全国大学生电子商务"创新.创意及创业"挑战赛(简称"三创赛")是由全国电子商务创新产教联盟主办,由"三创赛"竞赛组织委员会统 ...
最新文章
- git 你get了吗(git命令日常使用)
- AngularJS directive入门例子
- MapXtreme 2005学习(3):向图层中添加线段
- Razor视图引擎浅析
- 1102 Invert a Binary Tree(甲级)
- python--继承
- 网络I/O模型--04非阻塞模式(解除accept()、 read()方法阻塞)的基础上加入多线程技术...
- 学生信息管理系统问题集锦(一)
- [20] 鼓状物(Drum)图形的生成算法
- 更改API级别的Android Studio
- 杭电计算机2010年笔试真题详解
- 开源中国开源世界高峰论坛
- JAVA:实现解析纯真IP数据库
- compass的安装及使用,以及常见命令行指令与注意事项、Compass核心模块
- CST Studio Suite 2020 安装教程
- 这个季节有离别——观《Sad Movie》有感
- 在Ubuntu上安装Tensorflow Serving
- 电脑硬盘双击打不开,提示格式化怎么办?
- python比较火的培训机构
- OSG_64位动态链接库+静态链接库的使用