csp

【CSP模拟赛】仔细的检查(树的重心&树hash)

假装没事ソ 提交于 2019-12-01 04:55:57
题目描述 nodgd家里种了一棵树,有一天nodgd比较无聊,就把这棵树画在了一张纸上。另一天nodgd更无聊,就又画了一张。 这时nodgd发现,两次画的顺序是不一样的,这就导致了原本的某一个节点u0在第一幅图中编号为u1,在第二副图中编号为u2。 于是,nodgd决定检查一下他画出的两棵树到底是不是一样的。nodgd已经给每棵树的节点都从1到n进行了编号,即每棵树有n个节点。 如果存在一个1到n的排列p1,p2…pn,对于第一幅图中的任意一条边(i,j),在第二幅图中都能找到一条边(pi,pj),则认为这两幅图中的树是一样的。 输入格式 第一行一个整数n,表示节点的总数。 接下来n−1行,每行两个整数,表示第一幅图中的每一条边。 接下来n−1行,每行两个整数,表示第二幅图中的每一条边。 输出格式 如果两幅图的树是一样的,第一行输出”YES”,接下来1行输出一个1到n的排列p1,p2,……,pn,两个数之间用空格间隔。当多个排列都满足题意时,你可以随便输出一个。 如果两幅图的树是不一样的,只输出一行”NO”。 注意输出的时候不要加引号。 输入样例 3 1 2 2 3 1 3 3 2 输出样例 YES 1 3 2 提示 【样例解释1】 肉眼可见,1-2-3和1-3-2显然是一样的两棵树。不过这可能不是唯一的符合题意的排列。 数据范围:n<=100000 分析 正解好像是什么括号序列

CSP模拟赛游记

|▌冷眼眸甩不掉的悲伤 提交于 2019-11-30 22:25:09
时间:2019.10.5 考试时间: 100分钟(连正式考试时间的一半还没有到) 题目:由于某些原因不能公开。 由于第一次接触NOIinux系统所以连怎么建文件夹,调字体,如何编译都不知道,考试的前半小时全在摸索这些。 等大概会用了就只剩下70min了。感觉要爆零。 我当时很着急T1:我用了个数学O(1)方法做了,但样例太水了,怕错(我当时哪有时间对拍)就写了一个70分O(nlogn)暴力兜底,果然那数学方法错了。 一看表,woc,只有40min了,赶紧看T2:算式还要用字符串读入在分拆,先把正好复合条件不用修改的特判掉,然后挨个枚举就行了。 我飞快的写完了,代码100行QAQ,结果他一直说我缺个括号,我一直不知道为什么缺,考试结束一直再调,但还是CE了。 T3:二分+深搜,你们知道我的时间全花在T2上了,没时间做了T3我要是把调T2的时间用来写个裸搜也能拿60分啊,呜呜呜。 T4:二叉树递推,我要是在考场上疯狂打表也可以拿20分。 正式考试时间做:70+100+60+20=250pts 做70min: 70+0+0+0=70pts 下次模拟赛仍然是100min争取上150pts 来源: https://www.cnblogs.com/tarjin/p/11643044.html

[CSP校内集训]hotel

有些话、适合烂在心里 提交于 2019-11-30 20:50:39
题意 有n个房间分别有 \(a_i\) 个人 \((a_i\leq 7)\) ,通过移动人的操作使得一个房间只能有 \(0,4,7\) 个人中的一种,花费1单位代价将一个人移动一格,无解输出-1 样例输入 7 1 0 7 0 0 0 3 样例输出 6 思路 DP直接搞,开始想的是用 \(dp_{i,j}\) 记录前 \(i\) 个房间都合法时多出来了 \(j\) 个人,但这样做 \(j\) 可能会越来越大 于是用 \(dp_{i,j}\) 表示从第 \(i\) 个房间向 \(i+1\) 移动了 \(j\) 个人后,使得第 \(i\) 个房间符合条件的最小代价 第i个房间进来的人可以通过上一层得到,枚举上一层和这一层转移即可,由于可能出现负数(即 \(i+1\) 向 \(i\) 移动),下标需要加上一个数(这里加的是7) Code #include<bits/stdc++.h> #define N 100005 #define Min(x,y) ((x)<(y)?(x):(y)) using namespace std; typedef long long ll; const ll inf = 10000000000000000; int n,a[N]; ll f[N][15]; template <class T> void read(T &x) { char c;int sign

CSP 小明种苹果(续)201909-2

懵懂的女人 提交于 2019-11-30 18:16:47
输入: 4 4 74 -7 -12 -5 5 73 -8 -6 59 -4 5 76 -5 -10 60 -2 5 80 -6 -15 59 0 输出: 222 1 0 输入: 5 4 10 0 9 0 4 10 -2 7 0 2 10 0 4 10 -3 5 0 4 10 -1 8 0 输出: 39 4 2 注意: 1.发生苹果掉落和疏果是两种不同的操作 发生苹果掉落(5 3) 疏果(5 -3) 2.一棵树可能出现多次苹果掉落的情况 比如:3 5 2 1(对于一棵树来说 有3个操作,原来有5个苹果,第一次掉落后还剩2个,第二次掉落后还剩1个) 3.当发生苹果掉落的苹果树的棵树大于等于3时才可能形成连续的三个苹果树 发生苹果掉落的苹果树的序号我是用栈存的,感觉稍微麻烦了点,有时间试试数组 #include <cstdio> #include <algorithm> #include <iostream> #include <stack> #include <cstring> #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; typedef long long LL; const int mod = 1e9+7; int dir[4][2] = {0,1,0,-1,1,0,-1,0}; stack<int>q;

CSP 小明种苹果 201909-1

余生颓废 提交于 2019-11-30 17:54:12
输入: 3 3 73 -8 -6 -4 76 -5 -10 -8 80 -6 -15 0 输出: 167 2 23 输入: 2 2 10 -3 -1 15 -4 0 输出: 17 1 4 注意: 1.一棵树的疏果个数可能全为零 2.当不同树的疏果个数相同时,输出满足条件的最小编号 1 #include <cstdio> 2 #include <algorithm> 3 #include <iostream> 4 #include <vector> 5 #include <cstring> 6 #define mem(a,b) memset(a,b,sizeof(a)) 7 8 using namespace std; 9 typedef long long LL; 10 const int mod = 1e9+7; 11 int dir[4][2] = {0,1,0,-1,1,0,-1,0}; 12 int main() 13 { 14 LL n,m; 15 LL T = 0,maxn = 0,K = 0,P = -1;//T的初始值为-1,因为每棵树的疏果个数可能全为0,这时候保证输出序号最小 16 cin >> n >> m; 17 for(int i = 1; i <=n; i++) { 18 LL q; 19 maxn = 0; 20 cin >> q; 21 LL tt;

CSP考纲及高精度计算

江枫思渺然 提交于 2019-11-30 15:00:54
转载请注明出处,部分内容引自 SBSOI 大佬 转载请注明出处,部分内容引自 liusu201601 大佬 首先来一张图,很直观(截止到2012年数据) 下面是收集的一些,我改了一下 加粗表示特别重要,必须掌握 其他表示最好掌握,可能性不是很大,但是某些可以提高程序效率 高精度    a.加法    b.减法   c.乘法(应该只会有 高精乘单精 )   d.高精度除单精 (后面c,d考的可能性较小,应该只考a,b) 排序 算法   a.选择排序   b.插入排序   c.hash排序   d.归并排序(单纯的排序可能用不到,有快排就行了,但是归并排序的思想很重要)   e.堆排序    f.快排 字符串匹配算法    a.蛮力法   b.KMP 数论   a.欧几里德算法(用辗转相除法求最大公约数)   b.扩展欧几里德算法 ax+by=c 的正整数   c.素数 O(sqrt(n))   d.筛法求素数    e.快速乘方(位运算+同余+ 高精 ) 树论   a.二叉搜索树    b.优先队列(C++中priority_queue,相当于手动维护的小(大)根堆的 数据结构 优化)   c.线段树 (RMQ问题建议使用st算法)   d.平衡树一种(建议学习SBT) 图论    a.拓扑排序   b.割顶,割边(桥) {O(n)}   c.强连通分支 O(n)   d

【csp模拟赛6】相遇--LCA

时光怂恿深爱的人放手 提交于 2019-11-30 08:18:09
对 于 3 0 % 的 数 据 : 暴 力 枚 举 判 断 对 于 6 0 % 的 数 据 : 还 是 暴 力 枚 举 , 把 两 条 路 径 都 走 一 遍 计 一 下 数 就 行 , 出 现 一 个 点 被 访 问 两 次 即 可 判 定 重 合 对 于 1 0 0 % 的 数 据 : 找 出 每 条 路 径 中 距 离 根 最 近 的 点 ( l c a ) , 判 断 这 个 点 是 否 在 另 一 条 路 径 上 即 可    注意数组大小 代码: 烟火再美,总抵不过你的一往情深 #include<iostream> #include<algorithm> #include<cstdlib> #include<cstdio> #include<cstring> #define MAXN 1000100 using namespace std; int n,m,c; int head[MAXN<<1],dep[MAXN],f[MAXN][20],cnt,T; int x1,x2,y1,y2; struct node {int nxt,to; }e[MAXN<<1]; int read() { int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while

【csp模拟赛4】旅行计划 (travelling.cpp)--欧拉回路

删除回忆录丶 提交于 2019-11-30 04:29:46
【题目描述】 小 Z 打算趁着暑假,开启他的旅行计划。但与其他同学不同的是,小 Z 旅 行时并不关心到达了哪个网红景点打了哪些卡。小 Z 更关注沿路的风光,而且 小 Z 觉得,尽管多次到达同一个地方,但如果来时的路不一样,也是别有一番 风味。 小 Z 事先准备了一份地图,地图上给出了 N 个小 Z 心仪的城市,依次编号 1…N,以及 M 条连接两个城市的路,编号 1…M。小 Z 打算把 M 条路都走一遍且 仅一遍,但他发现这样的路线可能是不存在的。于是他打算,当他走到一个城 市后发现从这个城市出发的道路他都已经走过了,他便会坐飞机到另一个城市, 然后继续他的旅行。 现在小 Z 想知道,在最好的路线计划下,他至少要坐多少趟飞机。 【输入格式】 第一行为测试数据组数 T(1≤T≤10)。 每组测试数据的第一行为城市数 N 及道路数 M。 接下来 M 行,每行两个整数 x 和 y,表示一条连接城市 x 和城市 y 的双向 道路。 【输出格式】 对于每组测试数据,输出第一行包含一个整数 K,表示小 Z 至少要坐多少 趟飞机。 接下来 K+1 行,第 i 行输出小 Z 的第 i 段行程。若第 i 段行程经过 x 条道 路,则先输出 x,然后输出 x 个整数,分别表示路线经过的道路的编号。若是 正向通过第 i 条道路,则输出 i,否则输出-i。 若有多组方案,输出任意一组。 【样例输入】 1

【csp模拟赛4】基站建设 (station.cpp)

别来无恙 提交于 2019-11-30 04:29:43
【题目描述】 小 Z 的爸爸是一位通信工程师,他所在的通信公司最近接到了一个新的通 信工程建设任务,他们需要在 C 城建设一批新的基站。 C 城的城市规划做得非常好,整个城市被规整地划分为 8 行 8 列共 64 个街 区,现在已知新基站需要建设在哪些街区,用字符“#”表示,而不需要建设基 站的街区用“.”表示。 爸爸告诉小 Z 说,建设基站最耗时的是基站两两之间互相通信的调试,每 建设一个新的基站,需要确保其与其他已经建好的基站之间能互相通信,若两 个基站的坐标分别为(x1,y1)和(x2,y2),则调试所需时间大概为 max(|x1- x2|,|y1-y2|),而一个基站的总调试时间为与其他已经建好的基站的调试时间 中的最大值。现在爸爸想考考小 Z,看小 Z 能否计算出如何设计建设基站的顺 序,使得总的调试时间尽量少? 【输入格式】 输入一个 8 行 8 列的矩阵,全部由“#”和“.”组成。 【输出格式】 输出一个整数,表示花费的最少时间。 【样例输入一】 ........ ........ ...#.... .#...... .......# ........ ........ ........ 【样例输出一】 8 容易想到,应该“先中间后两边”。更严格地说,现在要把连续的一段格子中的鹅卵 石摆放完成,那么把目标位置处于最左边或者最右边的鹅卵石最后放,一定不会更差。

【csp模拟赛2】 爆搜 方格加数

旧街凉风 提交于 2019-11-29 22:07:55
【题目描述】 xyz1048576正在玩一个关于矩阵的游戏。 一个 n*m的矩阵,矩阵中每个数都是[1,12]内的整数。你可以执行下列两个操作 任意多次 : (1)指定一行,将该行所有数字+1。 (2) 指定一列,将该列所有数字 +1。 (3) 如果执行完上述操作之后,矩阵中某个数变成了 3,6,9,12其中的某一个,我们认为这个数是稳的。 给定初始矩阵,求出任意执行操作之后稳数的最多个数。 【输入 格式 】 第一行包含两个正整数 n,m。 接下来 n行, 每行 m个数,描述这个矩阵。 【输出 格式 】 一个整数,表示答案。 【输入 样例 1 】 3 3 1 2 3 3 2 4 1 2 1 【输出 样例 1 】 7 【输入样例 2】 5 5 2 4 6 8 10 1 2 3 4 5 3 4 5 6 7 7 8 9 10 11 5 10 12 3 7 【输出样例 2】 20 【数据 规模及约定 】 对于10%的数据,n,m≤2。 对于20%的数据,n,m≤5。 对于 100%的数据,n,m≤10。 思路:   dfs,爆搜 ,先只考虑每一行,因为对于一行或者一列,加三次和加六次相对关系不变,我们可以对于每一行或列,枚举加0次,加一次,加两次的情况,DFS行后,循环处理列的情况, 每一列取和3取模相同的最大集合,统计答案。 代码: #include"iostream" #include