给你一个森林,让你把它连接成一颗树,使得直径最小. 就求出每颗树的重心以后,全都往直径最大的那个的重心上连,一般情况是最大/2+次大/2+1,次大/2+第三大/2+2 中取较大者. 还有些特殊情况要特判处理一下. #include<cstdio> #include<algorithm> using namespace std; int v[200010],first[100010],next[200010],e; void AddEdge(int U,int V){ v[++e]=…
题意:给你一张有向图,每条边有个限制范围,只有权值在限制范围内的人能走这条边,问你权值不超过K的人中,有多少人能从S到T. K很大,因此我们只处理边的范围的上下界这O(m)个权值能否到达,以防万一,还处理了这些权值+1.-1的可达性.然后去重.离散化出来的这些区间中,两个端点都可达的话,其内部的点也必然可达.当然端点本身也是可达的. #include<cstdio> #include<cstring> #include<algorithm> #include<se…
二维下,如果把杨辉三角按照题目里要求的那样摆放,容易发现,第i行第j列的数(从0开始标号)是C(i+j,i)*C(j,j). 高维下也有类似规律,比如三维下,最后一层的数其实是C(i+j+k,i)*C(j+k,j)*C(k,k). 题目提示你了,坐标组合相同的位置,其值一定相同. 于是dfs最后一层的序号组合,统计答案即可.我只加了一个可行性剪枝,应该还能加一个的. #include<cstdio> #include<set> using namespace std; typede…
就按照题意建出有向图来(n个点,2n-2条边),然后从按随便一个rating排序,从最后一个开始dfs,用vis数组防止重复访问,因为每次之前的肯定能访问之后的(及之后的能访问的),所以不会有重复.就行了. #include<cstdio> #include<algorithm> using namespace std; #define N 100010 int a[N],b[N],A[N],n,B[N],sum; bool cmp(const int &a,const i…
题意: n个点,m条边,m <= n <= 100000,边的长度都为1. 点从 0 ~ n-1 编号.开始时图是不连通的,并且没有环. 通过加入一些边后,可以使图连通.要求加入的边不能多余(即生成的图是一棵树). 问连通后的图,任意两点之间的距离的最大值,最小可以是多少? 既然刚开始图不连通也无环,那么就是一些树(特殊情况是点). 于是题目就变成了,如何把很多棵树连起来,使最后生成的树直径最小. 可以想到,如果把两棵直径为 a 和 b 的树加一条边连成一棵,那么直径最小的新树直径为 (a+1…
目录:1.潜伏者 [map] 2.Hankson的趣味题[数论]3.mayan游戏[dfs] 题目: 1. 潜伏者(spy.pas/c/cpp)[问题描述]R 国和S 国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动.历经艰险后,潜伏于S 国的R 国间谍小C 终于摸清了S 国军用密码的编码规则:1. S 国军方内部欲发送的原信息经过加密后在网络上发送,原信息的内容与加密后所的内容均由大写字母‘A’—‘Z’构成(无空格等其他字母).2. S 国对于每个字母规定了对应的“密字”.加密的过程就…
Kattis - glitchbot [DFS] 题意 有一个机器人 刚开始在(0, 0),然后给出一个目标点,并且会给出一系列指令,但是其中会有一个指令是错误的.我们需要找出那个指令,并且改成正确的. 思路 因为数据范围比较小,我们可以把每条指令都改一下 暴力搜索一下,能不能走到目标点,如果改了,可以 那么 这就是答案 直接输出 break 掉就可以了 AC代码 #include <iostream> #include <cstdio> #include <algorith…
度度熊的01世界 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1117    Accepted Submission(s): 400 Problem Description 度度熊是一个喜欢计算机的孩子,在计算机的世界中,所有事物实际上都只由0和1组成. 现在给你一个n*m的图像,你需要分辨他究竟是0,还是1,或者两者均不是. 图像0…
题目描述 在峰会期间,武装部队得处于高度戒备.警察将监视每一条大街,军队将保卫建筑物,领空将布满了F-2003飞机.此外,巡洋船只和舰队将被派去保护海岸线.不幸的是因为种种原因,国防海军部仅有很少的几位军官能指挥大型海战.因此,他们考虑培养一些新的海军指挥官,他们选择了“海战”游戏来帮助学习. 在这个著名的游戏中,在一个方形的盘上放置了固定数量和形状的船只,每只船却不能碰到其它的船.在这个题中,我们仅考虑船是方形的,所有的船只都是由图形组成的方形.编写程序求出该棋盘上放置的船只的总数. 输入输出…
1441:[例题2]生日蛋搞 [题目描述] 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体.设从下往上数第i(1≤i≤M)层蛋糕是半径为Ri, 高度为Hi的圆柱.当i<M时,要求Ri>Ri+1且Hi>Hi+1.由于要在蛋糕上抹奶油,为尽可能节约经费,我们希望蛋糕外表面(最下一层的下底面除外)的面积Q最小. 令Q=Sπ,请编程对给出的N和M,找出蛋糕的制作方案(适当的Ri和Hi的值),使S最小. (除Q外,以上所有数据皆为正整数) [输…
1212:LETTERS [题目描述] 给出一个roe×colroe×col的大写字母矩阵,一开始的位置为左上角,你可以向上下左右四个方向移动,并且不能移向曾经经过的字母.问最多可以经过几个字母. [输入] 第一行,输入字母矩阵行数RR和列数SS,1≤R,S≤201≤R,S≤20. 接着输出RR行SS列字母矩阵. [输出] 最多能走过的不同字母的个数. [输入样例] 3 6 HFDFFB AJHGDH DGAGEH [输出样例] 6 错误原因: 把控制4个方向的数组dx,dy里的值赋值时,把0,…
题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和 终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫 中移动有上下左右四种方式,每次只能移动一个方格.数据保证起点上没有障碍. 输入样例 输出样例 [数据规模] 1≤N,M≤5 题目描述 输入输出格式 输入格式: [输入] 第一行N.M和T,N为行,M为列,T为障碍总数.第二行起点坐标SX,SY,终点 坐标FX,FY.接下来T行,每行为障碍点的坐标. 输出格式:…
[题目大意] 农夫约翰有N(1≤N≤1000)头奶牛,每一头奶牛都有一个确定的独一无二的正整数产奶率.约翰想要让这些奶牛按产奶率从高到低排序,约翰已经比较了M(1≤M≤10000)对奶牛的产奶率,但他发现,他还需要再做一张关于另外C对奶牛的产奶率比较,才能推断出所有奶牛的产奶率排序.请帮他确定C的最小值. [思路] 对于M对关系,从产奶率高的往产奶率低的连一条有向边.对于每个节点i,它能抵达的节点的总数即是能比较得出的比它小的奶牛总数. 由于原本总共有N*(N-1)/2对关系,ans=N*(N-…
[题目大意] 给出一棵树,求三个节点使得它们两两之间的距离相等,问共有多少种可能性? [思路] 显然,这三个节点是关于一个中心点对称地辐射出去的. 枚举中心点,往它的各个子树跑Dfs.tmp[i]表示当前子树深度为i的节点个数,p1[i]表示之前的子树中(不包括当前的子树),深度为i的节点的个数,p2[i]表示到当前子树之前,选取两个不同子树的节点的方案数. 对于当前这一棵子树的深度i,显然有ans+=tmp[i]*p2[i].然后更新下次要用的p1[].p2[],p2[i]+=p1[i]*tm…
[题目大意] 给出一张地图,一旦往一个方向前进就必须一直向前,直到一下情况发生:(1)碰到了block,则停在block前,该block消失:(2)冲出了场地外:(3)到达了终点.改变方向十次以上或者冲出场外都判输,问至少几步能到达终点,无法到达输出-1. [思路] DFS,往四个方向搜索,每次不断向前直到出现如上三种情形,并根据三种情形操作,有点类似于模拟.回溯的时候犯的小错误记在代码的注释里面了. #include<iostream> #include<cstdio> #inc…
题目链接 https://www.patest.cn/contests/gplt/L3-001 思路 DP[I][J] I 表示第几个物品 J 表示多少钱 dp[i][j] 为 bool 值 表示 当前状态是否能满足 对于一个物品 有两个选择 一个是选 当 arr[i] < j 的时候 dp[i - 1][j - arr[i]] == 1 就可以选 一个是不选 就是 更新为 dp[i - 1][j] 的答案 然后最后找 满足条件的最小序列 在刚开始选的时候 将数组 按 从大到小 排列 然后最后找…
http://codeforces.com/contest/839/problem/C [AC] #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<cmath> using namespace std; ; struct edge { int to; int nxt; }e[maxn];…
http://codeforces.com/contest/812/problem/B [题意] 有一个n*m的棋盘,每个小格子有0或1两种状态,现在要把所有的1都变成0,问最少的步数是多少?初始位置在左下角,只有把下面一层的1都变成0后才可以到上一层,只有在每层的最右边和最左边可以向上走(up),否则只能左右移动(left or right).只要经过1,就可以把1变成0,只要把最后一个1,就可以立即停止操作. [Accepted] #include <iostream> #include…
Sequence Decoding 题目描述 The amino acids in proteins are classified into two types of elements, hydrophobic (nonpolar) and hydrophilic (polar). Hydrophobic and hydrophilic are denoted by H and P respectively. A protein is represented by a sequence of H…
题意:给你一张2-SAT,问你加至少几句a V b(不能用非运算)这样的语句,使得其无法全为真. 如果最开始没有左右两项都含非运算的析取表达式,则无解,因为显然你可以对每一项的不含非的那项规定为真,使得整个2-SAT成立. 由于规定了你添加的语句不能含有非运算,故添加的边一定从 非某 指向 某. 如果一开始就存在某个a,它和非a互相可达,则答案为0. 如果一开始某个非a能到达a,则答案为1:如果一开始存在某个非j,a能到达非j,并且存在某个i,i能到达非a,则答案也为1,显然可以添一条从非某指向…
题意:河里有n块石头,一只青蛙要从左岸跳到右岸,你可以再在任意一个位置放一块石头,使得在最优方案下,青蛙单步跳的距离的最大值最小化,输出该位置. 将原图视作完全图,二分答案mid,然后在图中只保留小于等于mid的边,分别用dfs处理左岸能到哪些石头,右岸能到哪些石头.然后二重循环枚举两侧这些点对,如果存在一对点,它们的距离不超过2*mid,那么mid可行,将石头放在它们的中点即可.否则不可行. 要注意,左岸和右岸也需要当成点,不过距离计算时会稍微麻烦一点,需要讨论一下. #include<cst…
给你10个箱子,有长宽高,每个箱子你可以决定哪个面朝上摆.把它们摞在一起,边必须平行,上面的不能突出来,问你最多摆几个箱子. 3^10枚举箱子用哪个面.然后按长为第一关键字,宽为第二关键字,从大到小排序. 如果前面的宽大于等于后面的宽,就连接一条边. 形成一张DAG,拓扑排序后跑最长路即可. #include<cstdio> #include<cstring> #include<queue> #include<algorithm> using namespa…
给你一张有向图,问你将任意一条边变成双向后,所能得到的最大强连通分量的大小. 缩点之后,预处理can(i,j)表示i能到j. 之后枚举每一条边(u,v),再枚举其他所有点t,如果can(u,t) && can(t,v),则t能和u.v共在一个强连通分量,尝试更新答案. #include<cstdio> #include<algorithm> #include<vector> #include<cstring> using namespace…
网格里放了一些石块,一个炸弹能炸开其所在的行和列.问炸光石块至少要几个炸弹. 枚举不炸开的行数,则可以得出还要炸开几列. 为了不让复杂度爆炸,需要两个优化. 先是递推预处理出f(i)表示i的二进制位中1的个数,f(i)=f(i-2^k)+1,k是可以推算出来的. 还要DFS枚举不炸开的行数,防止重复访问.(类似容斥的时候的写法) #include<cstdio> #include<algorithm> using namespace std; int n,m,f[1<<…
[题目链接:NYOJ-82] #include<iostream> #include<cstring> using namespace std; struct node{ int x1; int y1; int num; }arry[]; ; char Map[MAXN][MAXN]; int ac; ]; ]; void check(); void dfs(int x,int y){ if(Map[x][y] != 'X'){ switch(Map[x][y]){ case 'a…
[题目链接:NYOJ-325] 一道以我名字命名的题目,难道要我生日的时候再A? 思路:依旧深搜,但这个问题应该有一个专有名词吧,看别的博客说是 “容量为 sum/2 的背包问题”,不懂... // abs() 对应头文件 stdlib.h 返回int参数 // fabs() 对应头文件 math.h 返回double参数 #include<cstdio> #include<cstring> #include<stdlib.h> ],sum,m,n; void dfs(…
Lake Counting Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 34735   Accepted: 17246 Description Due to recent rains, water has pooled in various places in Farmer John's field, which is represented by a rectangle of N x M (1 <= N <= 10…
题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805364711604224 题意: 给定一个数n,要求从1~n中找出k个数,使得这些数的p次方之和等于n 思路: 因为n为400,所以dfs加剪枝[本来还在想dp来着] 他要求输出的方案是数字之和最大的,如果之和相等要输出字典序较大的. 所以还需维护一个数字之和. 一个剪枝的方法是从大到小进行dfs,后面被选的数一定比前面被选的要小,这里不限制的话显然会出现重复.…
题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805346063728640 题意: 给定一棵二叉搜索树的先序遍历结果,问这棵树是不是一棵红黑树. 思路: 首先需要明确二叉搜索树和红黑树的性质. 二叉搜索树的每个节点,左子树上的值都比这个节点的值小,右子树上的值都比这个节点的值大. 因此对于一棵二叉搜索树,如果给定了先序遍历结果,就可以唯一确定这棵树了. 红黑树的性质: 1.每个节点是红色或是黑色 2.根节点是黑…
2200: [Usaco2011 Jan]道路和航线 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1384  Solved: 508[Submit][Status][Discuss] Description Farmer John正在一个新的销售区域对他的牛奶销售方案进行调查.他想把牛奶送到T个城镇 (1 <= T <= 25,000),编号为1T.这些城镇之间通过R条道路 (1 <= R <= 50,000,编号为1到R) 和P…