摘要:
某两点之间的路径上所有边权的异或值即dis1^dis2……^disn. 由于x^y^y=x,所以dfs预处理出每一点到根节点的异或值,对于每次询问,直接输出 disu^disv. include include include include using namespace std; int rea 阅读全文
摘要:
反向BFS预处理,求出所有符合题意的点,再正向BFS,(注意对于边权恒为一的点,BFS,比SPFA高效) 输入时n与m分清 include include include include include include using namespace std; const int MAXN=1000 阅读全文
摘要:
题目略带一点贪心的思想,先跑三遍最短路(边权为一,BFS比SPFA高效) 一起跑总比分开跑高效,枚举两人在何点汇合,输出最小值。 include include include include include include using namespace std; const int MAXN=4 阅读全文
摘要:
枚举 等差数列(ZJOI2004) 给定 n(1m[i],fa[i]=find(i 1),else fa[i]=i; 我认为此题与清北学堂2017的题相像,原题可使用暴力枚举,此题必用并查集优化,思想很好。 "treasure" 仓库扩张(USACO Contest DEC05) 在 FJ 的农场里 阅读全文
摘要:
首先此一眼就能看出来是一个非常基础的 最长不下降子序列(LIS) ,其朴素的 N^2做法很简单,但如何将其优化成为N logN? 我们不妨换一个思路,维护一个f数组,f[x]表示长度为x的LIS的最大的最后一个数字是f[x]。(为什么是最大的?可以应用 贪心 的思想,发现对于相同的x,f[x]越大其 阅读全文
摘要:
一道水题然而坑点很多。 include include include include using namespace std; int read(){ int rv=0,fh=1; char c=getchar(); while(c'9'){ if(c==' ') fh= 1; c=getchar 阅读全文
摘要:
题目中的表述很明显是一道二分答案+最短路的题目,二分收取的费用x判断能否到达奥格瑞玛。检验函数用SPFA跑最短路,注意,费用高于x的点不能使用。 include include include include include include using namespace std; const in 阅读全文
摘要:
可以发现只有当两个序列中都没有重复元素时(1~n的排列)此种优化才是高效的,不然可能很不稳定。 求a[] 与b[]中的LCS 通过记录lis[i]表示a[i]在b[]中的位置,将LCS问题转化为最长上升子序列问题,转化方法如下: for(int i=1;i include include inclu 阅读全文
摘要:
这是一道典型的二分答案问题(最大值最小,最小值最大)关键是对于细节的处理。 二分的框架: cpp //l=max{num[i]},r=sum{num[i]} while(l 1; if(chk(m)){ r=m 1; }else l=m+1; } cout include include inclu 阅读全文
摘要:
一道二分答案加前缀和 题目中已经暗示的很明显了 “尽可能靠近” “ 最小值” 本题的主要坑点在于 long long 的使用 abs函数不支持long long !!! include include include include include using namespace std; cons 阅读全文
摘要:
DP 题目问的是最大空暇时间,那么就定义dp[i]为第i分钟的最大空暇时间,显然满足最优子结构,我们发现dp[i]仅与其后的值有关,那么从后往前推,如果第i分钟没有任务,dp[i]=dp[i+1],如果有任务,就遍历所有任务 dp[i]=max{dp[i+task[j]]} 即本问题可以看成分组背包 阅读全文
摘要:
这道题是一道splay裸题,然而身为蒟蒻的我并不会,所以这道题我维护的是一个大根堆与一个小根堆结合起来的类似沙漏的结构。 本题难点在于询问的不是最大最小值,而是第K小值,所以我们想到了维护这样两个堆,上面是一个大小限定为K 1的大根堆,下面是一个小根堆,每次插入/查询操作时,保持前K 1大的始终在大 阅读全文
摘要:
所谓带权并查集 本题所求的不止是两个编号之间是否有关系,还要求两个编号之间有什么关系,这就要求我们维护多个数组,fa[]数组维护两个编号之间的连通性,dis[]维护编号为i的战舰到fa[i]之间的距离,num[]维护编号为i的战舰所在的那一列有多少战舰。 find函数 每次find的时候都更新num 阅读全文
摘要:
并查集 这是一道比较特殊的并查集,开一个三倍的数组, 1~n保存同类,n~n×2保存猎物,n 2~n 3保存天敌; include include include include using namespace std; const int MAXN=300005; int read(){ int 阅读全文
摘要:
首先这是一道线段树裸题,但是线段树长度不确定,那么我们可以在建树的时候,将每一个节点初始化为 INF,每次往队尾加一个元素即一次单节点更新,注意本题的数据范围,其实并不用开 long long,具体请看注释。 cpp include include include include define ls 阅读全文
摘要:
求有向图的权值为一的最小环 并查集做法 维护一个dis[],表示i号元素到fa[i]的距离。 对于输入的每两个点u,v,询问这两个点的fa[]是否相同,如果相同就成环,维护最小值,mi=min(mi,dis[u]+dis[v]+1)。如果不相同,merge(u,v)。目测是最简单的做法。 但是只适用 阅读全文
摘要:
这道题第一眼以为是一道字符串的题,但细想一下是一道求欧拉路的图论题。 把每一对对应关系看成一条边,本题即求这张图上是否存在一个欧拉回路或欧拉路,并要求字典序最小的方案,那么我们在dfs的时候就要从该点所连的最小的点开始遍历,并将所得的结果存在一个数组中,最后逆序输出。 阅读全文
摘要:
我们发现每次询问都是对于任意两点的,所以这是一道多源最短路径的题,多源最短路径,我们首先想到floyd,因为询问的时间是不降的,所以对于每次询问,我们将还没有进行松弛操作的的点k操作。 include include include include include include using nam 阅读全文
摘要:
图论的做法是topsort 一看见有序我们就想到了DAG图,于是用topsort做,对于每一个加入队列的顶点,都用它的时间去更新它所指向的点的时间,本质上仍是DP的思想,dp[i]=max{dp[j]}+ti[i] (j i). 阅读全文
摘要:
线段树 函数名要写上。。。 LL 在运算的时候要防溢出。 include include include include define lson l,m,rt'9'){ if(c==' ') fh= 1; c=getchar(); } while(c ='0'&&c 1)); // sum[rt 1 阅读全文