自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(40)
  • 收藏
  • 关注

原创 集训心得

这次集训,我的收获如下。算法:自己想出了动态开点线段树、口胡出了空间复杂度O(n)O(n)O(n)的动态开点权值线段树代替主席树。学习了后缀数组,字典树。学习了插头dp与数位dp学习了A*

2020-07-25 14:24:22 112 2

原创 qzezoj 1662 棋盘覆盖

题面传送门间隔染色然后跑二分图即可。不得不说xht37xht37xht37的数据一点没改可还行复杂度O(nm)O(n\sqrt m)O(nm​)代码实现:#include<cstdio>#include<cstring>#include<queue>#define min(a,b) ((a)<(b)?(a):(b))using namespace std;int n,m,k,x,y,z,now[10039],d[10039],a[139][139

2020-07-15 21:56:38 77

原创 qzezoj 1667 Sorting It All Out

题面传送门这个对于每个边跑拓扑序即可,如果有环那么不可行,如果两个字母拓扑序相同也不可行。代码实现:#include<cstdio>#include<cstring>#include<queue>#include<algorithm>using namespace std;int n,m,k,x,y,z,in[139],flag,out[139],flags[139],sh,now,cur,pus,tot,topo[139];struct y

2020-07-15 21:54:13 84

原创 qzezoj 1665 虫洞路线

题面传送门直接建分层图跑spfaspfaspfa即可。注意一些细节即可。代码实现:#include<cstdio>#include<cstring>#include<queue>#define abs(x) ((x)>(0)?(x):-(x))#define max(a,b) ((a)>(b)?(a):(b))using namespace std;int n,m,k,x,y,z,d[100039],w[100039],t[100039],

2020-07-15 21:52:15 150

原创 luogu P2756 飞行员配对方案问题

题面传送门直接跑二分图最大匹配即可。关于输出方案看哪条边没有权值就输出两个端点即可。代码实现:#include<cstring>#include<cstdio>#include<queue>#define min(a,b) ((a)<(b)?(a):(b))using namespace std;int n,m,k,x,y,z,nows,cur,now[1039],d[1039],st,t,ans;struct yyy{int to,w,z;}t

2020-07-15 21:50:21 113

原创 luogu P5030 长脖子鹿放置

题面传送门显然对列数奇偶性染色然后建边跑二分图即可。注意无法放置点可能重复。代码实现:#include<cstdio>#include<cstring>#include<queue>#define min(a,b) ((a)<(b)?(a):(b))using namespace std;int n,m,h,x,y,z,st,t,a[239][239],flag[239][239],now[100039],nows,cur,d[100039],an

2020-07-15 21:48:41 98

原创 lugou P3355 骑士共存问题

题面传送门显然是二分图建模板子题。观察可得,可以黑白染色建图。那么从黑格向白格建边跑二分图最小点覆盖即可,注意要用全部点减去最小点覆盖。代码实现:#include<cstdio>#include<cstring>#include<queue>#define min(a,b) ((a)<(b)?(a):(b))using namespace std;int n,m,k,x,y,z,st,t,a[239][239],flag[239][239],no

2020-07-15 21:46:48 125

原创 luogu P1119 灾后重建

题面传送门数据这么小,一看就可以floydfloydfloydfloydfloydfloyd外层循环就是允许点转移,那么题目中依次给出允许点转移顺序,那么直接可以做了。代码实现:#include<cstdio>#include<cstring>#include<algorithm>#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)?(a):(b))using namespac

2020-07-15 21:44:21 84

原创 luogu P6062 [USACO05JAN]Muddy Fields G

题面传送门一道二分图建模的好题。题目中要求最少覆盖,很容易想到最小点覆盖,也想到了二分图。把横竖模板铺出来,可以贪心,一定是延展到最长最优。那么把图建出来后跑最小点覆盖即可,可以得出最小点覆盖等于最大匹配数。代码实现:#include<cstdio>#include<cstring>#include<queue>#define min(a,b) ((a)<(b)?(a):(b))using namespace std;int n,m,k,x,y

2020-07-15 21:42:27 150

原创 luogu P3386 【模板】二分图最大匹配

题面传送门对于左部点建超级原,右部点建超级汇,边权为111跑dicnicdicnicdicnic即可,这样超级原控制了每个点只能走一次。代码实现:#include<cstdio>#include<cstring>#include<queue>#define min(a,b) ((a)<(b)?(a):(b))using namespace std;int n,m,k,x,y,z,now[10039],d[10039],nows,cur,st,t,an

2020-07-14 21:54:44 89

原创 luogu P2740 [USACO4.2]草地排水Drainage Ditches

题面传送门直接上dicnicdicnicdicnic板子即可,注意加几个剪枝,跑得飞快。代码实现:#include<cstdio>#include<cstring>#include<queue>#define min(a,b) ((a)<(b)?(a):(b))using namespace std;int n,m,k,x,y,z,d[1039],now[1039],st,t,nows,cur;long long ans;struct yyy{i

2020-07-14 21:52:39 105

原创 luogu P1099 树网的核

题面传送门先两遍dfsdfsdfs跑出树的直径。因为所有树的直径都是相类似的,所以只要跑一条直径就好了。然后在这条直径上尺取。最后对于直径上每个点的子树不经过直径上的边求距离取最大值即可,这一步很难想,因为如果不取最大值那么就会漏掉答案因为无论如何都是要有这条边的权值的。完美O(n)O(n)O(n)代码实现:#include<cstdio>#include<cstring>#define max(a,b) ((a)>(b)?(a):(b))#define m

2020-07-14 21:50:55 63

原创 qzezoj 1645 闇の連鎖

题面传送门对于一个点,考虑如果把它和它的子树断开来。断主要边肯定是断和父节点连着的边。断次要边统计子树内有几条次要边连向外面。如果只有一条,那么就断这一天,ans++ans++ans++如果没有,那么随便断,加上次要边边数即可。统计子树内边数可以用树上差分时间复杂度O(nlogn)O(nlogn)O(nlogn)代码实现:#include<cstdio>#include<cstring>using namespace std;int n,m,k,x,y,z,f

2020-07-13 22:01:36 92

原创 luogu P3320 [SDOI2015]寻宝游戏

题面传送门题目要求kkk个连接关键点的边权之和的二倍。那么ans=dist(a1,a2)+dist(a2,a3)+...+dist(ak−1,ak)ans=dist(a_1,a_2)+dist(a_2,a_3)+...+dist(a_{k-1},a_k)ans=dist(a1​,a2​)+dist(a2​,a3​)+...+dist(ak−1​,ak​)那么加入或删除一个点时对左右两边拆边建边即可。维护左右两边可以用平衡树维护,这里写了一个非递归式权值线段树维护。时间复杂度O(nlogn)O(nl

2020-07-13 21:58:10 91

原创 SP116 INTERVAL - Intervals

题面传送门感觉就像一道裸题。转化成前缀和然后建边即可。注意前缀和特性:qi>qi−1&&q−qi−1≤1q_i>q_{i-1}\&\&q_-q_{i-1}\leq1qi​>qi−1​&&q−​qi−1​≤1所以按照这个建边就好了。代码实现:#include<cstdio>#include<cstring>#include<queue>#define max(a,b) ((a)>(b)

2020-07-13 21:54:32 83

原创 luogu P4867 Gty的二逼妹子序列

题面传送门空间这么小,只能莫队。在移动时用域值分块O(1)O(1)O(1)修改即可。代码实现:#include<cstdio>#include<cmath>#include<algorithm>using namespace std;int n,m,k,x,y,z,ans[1000039],a[100039],l,r,mid,f[100039],ku[100039],st[100039];struct yyy{int x,y,a,b,num;}fs[100

2020-07-12 22:20:05 115

原创 luogu P3629 [APIO2010]巡逻

题面传送门如果k=1k=1k=1显然非常简单,取树的直径即可。考虑k=2k=2k=2怎么做。第一条显然要取树的直径。而第二条如果围成的环和第一条围成的环有重叠,那么重叠的边要走两次。所以我们可以把这几条重叠的边权值设为−1-1−1,然后再跑一遍树的直径。代码实现:#include<cstdio>#include<cstring>#include<algorithm>#define max(a,b) ((a)>(b)?(a):(b))using n

2020-07-12 22:15:53 109

原创 luogu P6232 [eJOI2019]挂架

题面传送门显然是个结论题。可以发现,对于每个点,两棵子树肯定差值不大于111,而且如果差值为一,那么最晚更新点在左子树,反之在右子树。然后预处理幂递归即可。代码实现:#include<cstdio>#define mod 1000000007using namespace std;int n,m,p[1000039],ans,tot,pus;long long k;inline void dfs(int d,long long x){ if(d==n) {ans=(ans+

2020-07-11 22:59:37 85

原创 luogu P4180 [BJWC2010]严格次小生成树

题面传送门首先把最小生成树跑出来。然后因为要次小,那么枚举未被选的每一条边。加入树中,构成了一个环,然后在这个环上找严格次小值即可。关于严格次小值可以用树上倍增求出。时间复杂度O(nlognα(n)+nslognlogs)O(nlognα(n)+nslognlogs)O(nlognα(n)+nslognlogs),其中sss在这道题中约取163\frac{16}{3}316​还有一个小优化:如果把最大的边拉出来都不能小于当前最小值,那么直接退出,可以快222倍代码实现:#include<

2020-07-11 22:56:50 130

原创 luogu P2370 yyy2015c01 的 U 盘

题面传送门可以发现大小具有单调性,所以可以二分。二分后用010101背包验证可行性即可。代码实现:#include<cstdio>#include<cstring>#include<algorithm>#define max(a,b) ((a)>(b)?(a):(b))using namespace std;int n,m,k,x,y,z,f[1039],l,r,mid,ans;struct yyy{int x,y;}s[1039];inlin

2020-07-10 21:58:47 162

原创 luogu P4408 [NOI2003]逃学的小孩

题面传送门显然最长的一条是树的直径。那么找到树的直径后另一条枚举点然后跑spfaspfaspfa即可。代码实现:#include<cstdio>#include<queue>#include<cstring>#define min(a,b) ((a)<(b)?(a):(b))#define max(a,b) ((a)>(b)?(a):(b))using namespace std;int n,m,k,x,y,z,maxs,start,now

2020-07-10 21:57:29 160

原创 luogu P3730 曼哈顿交易

题面传送门显然可以莫队,而且是板子题。但是考虑怎么在过程中增加和修改,无论怎样写树形结构都会使复杂度飙升到nnlognn\sqrt nlognnn​logn这时可以暴力数据结构:分块,单点修改O(1)O(1)O(1),查询O(n)O(\sqrt n)O(n​)这样复杂度就是妥妥的O(nn)O(n\sqrt n)O(nn​)代码实现:#include<cstdio>#include<cmath>#include<algorithm>using namesp

2020-07-10 21:55:55 121

原创 UVA10308 Roads in the North

题面传送门这道题是树的直径裸题。显然跑两遍dfsdfsdfs找树的直径即可。但是输入很毒瘤。所以要信仰stringstreamstringstreamstringstream啊代码实现:#include<bits/stdc++.h>using namespace std;int n,m,k,x,y,z,ans,tot,pus,flag,maxn,maxs,flags;struct yyy {int to,w,z;};struct ljb { int head,h[10003

2020-07-10 21:52:51 116

原创 qzezoj 1641 黑暗城堡

题面传送门题目中要求最小路径生成树的方案数。先跑一遍spfaspfaspfa把最小路径跑出来,然后对于每个点枚举边,看看有几个点是可以转移,然后乘法原理计数即可。代码实现:#include<cstdio>#include<cstring>#include<queue>#include<algorithm>#define mod 2147483647using namespace std;int n,m,k,x,y,z,d[1039],now

2020-07-10 21:50:47 112

原创 qzezoj 1640 走廊泼水节

题面传送门题目大意:构造一个完全图,使得在最小生成树唯一(题目中给出)的情况下权值总和最小。直接克鲁斯卡尔模拟,在合并两棵树时进行操作。合并两棵树时要连的边的条数是sizx×sizy−1siz_x\times siz_y-1sizx​×sizy​−1,即将合并的这条边一定是两棵树中最大的边,而所有不在最小生成树内的边一定大于这条边,所以合并时ans+(sizx×sizy−1)(w+1)ans+(siz_x\times siz_y-1)(w+1)ans+(sizx​×sizy​−1)(w+1)时间复杂

2020-07-10 21:48:19 86

原创 luogu P2052 [NOI2011]道路修建

题面传送门按照题意模拟即可,把每个点的子树节点数遍历出来,然后与n−fxn-f_xn−fx​取绝对值即可。代码实现:#include<cstdio>#include<cstring>#define abs(x)((x)>0?(x):-(x))using namespace std;int n,m,k,x,y,z;long long f[1000039],ans;struct yyy{int to,w,z;};struct ljb{ int head,h[1

2020-07-08 21:59:33 154

原创 luogu P3008 [USACO11JAN]Roads and Planes G

题面传送门这道题看上去是裸的最短路。但是众所周知,USACOUSACOUSACO经常卡spfaspfaspfa。所以不能用spfaspfaspfa又因为堆优化djdjdj只能跑正权边。所以发现一下题目的特殊性质:事实上,由于最近恐怖主义太嚣张,为了社会和谐,出台 了一些政策保证:如果有一条航线可以从 AiA_iAi​到 BiB_iBi​,那么保证不可能通过一些道路和航线从 BiB_iBi​到 AiA_iAi​所以题目说没有负权环。那我们可以把所有无向边缩成一个强联通分量,然后再强连通分

2020-07-08 21:57:57 108

原创 luogu P2886 [USACO07NOV]Cow Relays G

题面传送门其实nnn可以开到1e181e181e18显然可以倍增floydfloydfloyd直接把矩阵乘法的乘改成加单位矩阵也改一下变成ai,j=min⁡k=1nbi,k+ck,ja_{i,j}=\min\limits_{k=1}^{n}{b_{i,k}+c_{k,j}}ai,j​=k=1minn​bi,k​+ck,j​即可。然后就是矩阵快速幂板子。时间复杂度O(m3logn)O(m^3logn)O(m3logn)注意离散代码实现:#include<cstdio>#inclu

2020-07-07 22:00:08 112

原创 luogu P1948 [USACO08JAN]Telephone Lines S

题面传送门这道题两种解法。第一种直接跑分层图最短路(或者叫二维spfaspfaspfa)即可,时间复杂度O(nm)O(nm)O(nm)。不过如果特殊数据会被卡到O(nm2)O(nm^2)O(nm2)(好像还没有直接跑ISAPISAPISAP快)第二种二分+最短路我们肯定把一条路径中前kkk大的点拿来免费,把第k+1k+1k+1的点拿来支付。易得这种贪心是正确的。那么可以二分第k+1k+1k+1大路径。把图中比midmidmid大的路径设为111,反之设为000,看终点有没有超过kkk复杂度O(m

2020-07-07 21:55:26 114

原创 luogu P2486 [SDOI2011]染色

题面传送门直接树剖即可。用线段树维护两端点。合并时分类讨论一下要不要减即可。注意,最后要把左边的左右端点翻转,可以画个图理解一下。最后两个点在一条重链上时放在哪一边要反过来。代码实现:#include<cstdio>#include<cstring>using namespace std;int n,m,k,sx,a[100039],d[100039],top[100039],siz[100039],id[100039],idea,son[100039],fa[100

2020-07-07 21:48:26 77

原创 luogu P4615 [COCI2017-2018#5] Birokracija

题面传送门稍微看一下就可以得出结论:一个人获得的硬币数就是以这个点为根子树内所有节点的深度和。那么树形dpdpdp就可以直接处理。fx=(∑(u,x)∈Efu+sizu)+1f_x=(\sum\limits_{(u,x)∈E}{f_u}+siz_u)+1fx​=((u,x)∈E∑​fu​+sizu​)+1代码实现:#include<cstdio>#include<cstring>using namespace std;int n,m,k,x,y,siz[200039]

2020-07-05 22:18:29 103

原创 luogu P3035 [USACO11DEC]Umbrellas for Cows S

题面传送门一眼dpdpdp但是题目中说价格没有单调性,所以要先预处理出后缀minminmin然后枚举断点即可。代码实现:#include<cstdio>#include<algorithm>#include<cstring>#define min(a,b) ((a)<(b)?(a):(b))using namespace std;int a[5039],f[5039],b[100039],n,m,k,x,y,ans,tot,pus,minn[10

2020-07-05 22:13:22 92

原创 luogu P3948 数据结构

题面传送门显然,前面查询很少,可以直接差分。后面前缀和即可。代码实现:#include<cstdio>using namespace std;int n,m,k,x,y,z,maxn,minn,mod,fin,ans,tot;char _s;long long a[80039],q[80039];int main(){ register int i,j; scanf("%d%d%d%d%d",&n,&m,&mod,&minn,&max

2020-07-05 22:11:43 87

原创 luogu P2787 语文1(chin1)- 理理思维

题面传送门感觉这道题比YnoiYnoiYnoi还卡常。显然可以直接开262626个线段树暴力做,复杂度O(26nlogn)O(26nlogn)O(26nlogn)但是这样拿不了几分。但我们注意到这是权值树。而且所有的权值树的权值之和等于nnn,而我们开了25n25n25n的空间。所以势必有很大的空间与时间浪费。所以在当前点没有权值时就不必查找,当前点已经有标记就不用深入了。这样完全随机数据复杂度降至26nlogn\sqrt {26}nlogn26​nlogn代码实现:#include<c

2020-07-04 22:20:46 99

原创 CF1371D Grid-00100

题面传送门很好的一道构造题。显然答案就是000或者222因为不存在两行或两列差值大于111的。那么沿着对角线依次左移即可,用一个循环队列实现。代码实现:#include<cstdio>#include<cstring>using namespace std;int n,m,k,x,y,t,f[339][339],a[339];int main(){ register int i,j; scanf("%d",&t); while(t--){ mem

2020-07-04 22:14:43 144

原创 CF1371C A Cookie for You

题面传送门把第一类客人转换一下,就是哪个多吃哪个。第二类客人就是哪个少吃哪个。很容易发现第二类客人最多能满足min(a,b)min(a,b)min(a,b)个,那么剩下的看第一类客人能否满足即可。代码实现:#include<cstdio>#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)?(a):(b))using namespace std;long long n,m,k,x,y,t,ans1,a

2020-07-04 22:12:35 218

原创 CF1371B Magical Calendar

题面传送门又是一道分类讨论的题目。如果r>nr>nr>n,那么其实k=rk=rk=r与k>rk>rk>r的任何值是一样的,所以可以忽略。而k=rk=rk=r又只有一个答案,那么答案就是(n−1)n2+1\frac{(n-1)n}{2}+12(n−1)n​+1反之,答案就是一个普通等差数列(r−1)r2\frac{(r-1)r}{2}2(r−1)r​代码实现:#include<cstdio>using namespace std;long long

2020-07-04 22:10:29 139

原创 CF1371A Magical Sticks

题面传送门显然是可以分类讨论的。如果nnn是奇数,那么我们可以让111与n−1n-1n−1,222与n−2n-2n−2组成一对,剩下nnn一对,这样可以组成n+12\frac{n+1}{2}2n+1​对。如果n是偶数,那么我们可以让111与nnn,222与n−1n-1n−1组成一队。那么可以组成n2\frac{n}{2}2n​代码实现:#include<cstdio>using namespace std;int t,n;int main(){ scanf("%d",&

2020-07-04 22:05:33 124

原创 luogu P1967 货车运输

题面传送门显然不可以最长路。司机肯定喜欢走长的路径,所以先把最大生成树跑出来。然后再最大生成树上跑倍增不就好了?代码实现:#include<cstdio>#include<cstring>#include<algorithm>#define min(a,b) ((a)<(b)?(a):(b))using namespace std;int n,m,k,x,y,ans,flag[10039],f[10039],fa[10039][20],minn[

2020-07-04 21:53:12 80

原创 SP1741 TETRIS3D - Tetris 3D

题面传送门显然可以四分树。就是在线段树上加两个维度即可。注意边界值。代码实现:#include<cstdio>#define max(a,b) ((a)>(b)?(a):(b))using namespace std;int n,m,k,x,y,z,sx,sy,sz,f[16000039],ans,tot,pus;short flag[16000039];inline void push(int now){ flag[now<<2|1]=flag[now&

2020-07-02 13:45:37 95

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除