虽然某些题难度爆炸,但我还是吧题面发一下吧。。。。。

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

相关文件: 题目目录

题目背景

众所周知,小葱同学擅长计算,尤其擅长计算组合数,但这个题和组合数没什么关系。

题目描述

小葱同学在学习了组合数的计算之后,开始了研究数据结构的道路。通过十五分钟的刻苦学习,小葱同学初步掌握了队列、栈和堆这三种数据结构。小葱同学发现这三种数据结构都支持两种操作:

  1. 将某个数插入该数据结构。
  2. 从该数据结构中按照数据结构的原理取出一个数。

小葱同学为了检验自己对这三种数据结构的理解,设计了一个类似的黑箱模型。该模型也支持两种操作,向黑箱中输入一个数或者从黑箱中输出一个数。现在小葱对该黑箱做了若干次操作,并给出每次输入和输出的数,问这个黑箱实现的是否可能是队列、栈、大根堆或者小根堆。

虽然小葱同学对这四种数据结构了如指掌,但他还是决定告诉你它们的分别是什么:

  • 如果黑箱是队列:黑箱初始为空,输入时数将被放入黑箱,输出时当前黑箱内最早被放入的数将被输出并移出黑箱。

  • 如果黑箱是:黑箱初始为空,输入时数将被放入黑箱,输出时当前黑箱内最晚被放入的数将被输出并移出黑箱。

  • 如果黑箱是大根堆:黑箱初始为空,输入时数将被放入黑箱,输出时当前黑箱内值最大的数将被输出并移出黑箱。特别地,如值最大的数有多个,则仅将其中一个移出黑箱。

  • 如果黑箱是小根堆:黑箱初始为空,输入时数将被放入黑箱,输出时当前黑箱内值最小的数将被输出并移出黑箱。特别地,如值最小的数有多个,则仅将其中一个移出黑箱。

输入格式

从标准输入读入数据。

第一行一个整数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 清华校赛总结相关推荐

  1. [置顶]2010年东北大学ACM程序设计竞赛冬季校赛题解

    8题只做出4题比较easy的题,而且做得挺麻烦,看来还要多练练. AC的题如下 NEUOJ  1112 I Love Apple Description So many people love app ...

  2. 2017校赛 问题 F: 懒人得多动脑

    题目描述 小D的家A和学校B都恰好在以点F为焦点的双曲线上,而小D每日所需的生活水源在一条平行该双曲线准线的直线上,设它的值为v.大家都知道,每天都是要喝水的,但是小D有点懒,他希望自己能在去上学或者 ...

  3. 关于安徽赛区推广校赛的实施办法

    关于安徽赛区 推广校赛的实施办法 全国组委会:   安徽赛区作为第一个省级赛区自2010年举办至今,受到安徽省教育厅和安徽各高校高度认可,是安徽省教育厅重点支持的大学生学科和技能竞赛A类赛事.但安徽赛 ...

  4. 第18届浙江大学校赛 Mergeable Stack

    The 18th Zhejiang University Programming Contest Sponsored by TuSimple 第18届浙江大学校赛的c题 解析:起先是用stack写的模 ...

  5. 21-5-22校赛J 下围棋

    21-5-22校赛J 下围棋 给出一个节点个数为n的树,其根节点为1,两个人轮流操作,每一次操作可以选择一个非根节点,删除这个节点及其子树,当一个人无法进行操作的时候,他就输掉了.问后手是必胜还是必败 ...

  6. 21-5-22校赛G 自行车调度

    21-5-22校赛G 自行车调度 n个点,m条边的无向带正权图(编号1到n).每个点初始有a[i](0<=a[i]<=1e5,1<=i<=n)辆自行车,自行车管理员可以花费一个 ...

  7. 2018 java蓝桥杯校赛题目

    1.[问题描述] 100 可以表示为带分数的形式:100 = 3 + 69258 / 714 还可以表示为:100 = 82 + 3546 / 197 注意特征:带分数中,数字1~9分别出现且只出现一 ...

  8. 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 ...

  9. 三农电子商务创业创新大赛作品_全国大学生电子商务“创新、创意及创业”挑战赛五邑大学校赛...

    大赛简介 第十届全国大学生电子商务"创新.创意及创业"挑战赛(简称"三创赛")是由全国电子商务创新产教联盟主办,由"三创赛"竞赛组织委员会统 ...

最新文章

  1. git 你get了吗(git命令日常使用)
  2. AngularJS directive入门例子
  3. MapXtreme 2005学习(3):向图层中添加线段
  4. Razor视图引擎浅析
  5. 1102 Invert a Binary Tree(甲级)
  6. python--继承
  7. 网络I/O模型--04非阻塞模式(解除accept()、 read()方法阻塞)的基础上加入多线程技术...
  8. 学生信息管理系统问题集锦(一)
  9. [20] 鼓状物(Drum)图形的生成算法
  10. 更改API级别的Android Studio
  11. 杭电计算机2010年笔试真题详解
  12. 开源中国开源世界高峰论坛
  13. JAVA:实现解析纯真IP数据库
  14. compass的安装及使用,以及常见命令行指令与注意事项、Compass核心模块
  15. CST Studio Suite 2020 安装教程
  16. 这个季节有离别——观《Sad Movie》有感
  17. 在Ubuntu上安装Tensorflow Serving
  18. 电脑硬盘双击打不开,提示格式化怎么办?
  19. python比较火的培训机构
  20. OSG_64位动态链接库+静态链接库的使用

热门文章

  1. 前段ui需要些html代码吗,UI设计师为什么要了解前端代码?
  2. 游戏蜂窝研究--全局的异常捕获器
  3. 由工厂设计模式实现的Java多功能计算器(包括数值运算和图形运算以及字符串运算)
  4. 轻松集齐五福,还有花花,原来你要扫的福字都在这里!
  5. 元气骑士 自建服务器,30分钟简易复刻《元气骑士》地图生成系统
  6. 【计算机毕业设计】智慧社区管理系统
  7. Zabbix 4.4升级到5.0
  8. [svc]linux常用手头命令-md版-2017年11月12日 12:31:56
  9. 产品迭代测试流程(一)
  10. 幕布使用教程原自B站