qzezoj
fxt275307894a
这个作者很懒,什么都没留下…
展开
-
qzezoj 1755 球赛
这道题O(n2)O(n^2)O(n2)的dp是很好想的。设fif_ifi表示到iii时的队伍小于等于rankirank_iranki最大的不用移动的个数,那么显然状态转移方程是fi=maxj=1j≤i&rankj≤rankif_i=\max\limits_{j=1}^{j\leq i\&rank_j\leq rank_i}fi=j=1maxj≤i&rankj≤ranki 就是从小于等于一定不用乱序的转移。然后发现这个东西是个二维偏序,第一维本来有序,那么第二维用树原创 2020-10-05 16:32:49 · 171 阅读 · 0 评论 -
qzezoj 1754 梦境
用脚找一下规律就会发现可以构成最后一项为全部异或和的循环节。那么前缀异或就好了。代码实现:#include<cstdio>using namespace std;int n,m,k,z;long long a[1000039],q[1000039],ans,x,y;int main(){ register int i; scanf("%d",&k); for(i=1;i<=k;i++) scanf("%lld",&a[i]),a[k+1原创 2020-10-05 14:54:53 · 143 阅读 · 1 评论 -
qzezoj 1752 Vjestica
看到数据范围一眼状压。然后就是怎么转移的问题了。设fif_ifi为使用状态为iii时所用的节点数。然后你会发现这个用O(2nnk)O(2^nn^k)O(2nnk)的转移不了。那么就可以枚举子集转移。dpdpdp方程为dpi=min{dpj+dpi⨁j−lcp(i)}dp_i=min\{dp_j+dp_{i⨁j}-lcp(i)\}dpi=min{dpj+dpi⨁j−lcp(i)}复杂度O(3n)O(3^n)O(3n)代码实现:#include<cstdio>#includ原创 2020-10-05 14:52:47 · 190 阅读 · 0 评论 -
qzezoj 1750 国王饮水记
当然这道题可以跑最小生成树。但是那样时间复杂度是O(nmα(n))O(nmα(n))O(nmα(n)),可以被卡掉。这里有一个跑不满O(nm)O(nm)O(nm)的就是每次拿到一条边,就搜索是否联通。不连通就加上去联通就找到最大的那条边,看看能不能替换,能换就换。代码实现:#include<cstdio>#include<cstring>#define max(a,b) ((a)>(b)?(a):(b))using namespace std;int n,原创 2020-10-05 14:40:59 · 74 阅读 · 0 评论 -
qzezoj 1687 Best Cow Fences
题面传送门我们可以二分这个值。然后验证时将所有数字减去这个值,看看有没有长度大于mmm权值之和大于000的子段就好了。代码实现:#include<cstdio>#include<cstring>#include<algorithm>#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)?(a):(b))using namespace std;int n,m,k,x,y,z,l,原创 2020-08-01 20:25:43 · 90 阅读 · 0 评论 -
luogu P2862 [USACO06JAN]Corral the Cows G
题面传送门这东西有一个更优的复杂度。显然可以二分,二分以后对每一维尺取后算是O(nwlogw)O(nwlogw)O(nwlogw)的,可以过去。但是我们发现在第二维尺取时的这一维www很没有必要,换句话说,很没效率。所以就可以用一棵权值线段树代替掉,对每一个点向后midmidmid个贡献权值。查询时查询最大值即可。代码实现:#include<cstdio>#include<cstring>#include<algorithm>#define max(a,原创 2020-08-18 15:58:18 · 138 阅读 · 0 评论 -
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 · 89 阅读 · 0 评论 -
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 · 98 阅读 · 0 评论 -
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 · 166 阅读 · 0 评论 -
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 · 146 阅读 · 0 评论 -
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 · 95 阅读 · 0 评论 -
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 · 163 阅读 · 0 评论 -
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 · 72 阅读 · 0 评论 -
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 · 105 阅读 · 0 评论 -
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 · 101 阅读 · 0 评论 -
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 · 128 阅读 · 0 评论 -
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 · 130 阅读 · 0 评论 -
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 · 98 阅读 · 0 评论 -
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 · 133 阅读 · 0 评论 -
luogu P2886 [USACO07NOV]Cow Relays G
题面传送门其实nnn可以开到1e181e181e18显然可以倍增floydfloydfloyd直接把矩阵乘法的乘改成加单位矩阵也改一下变成ai,j=mink=1nbi,k+ck,ja_{i,j}=\min\limits_{k=1}^{n}{b_{i,k}+c_{k,j}}ai,j=k=1minnbi,k+ck,j即可。然后就是矩阵快速幂板子。时间复杂度O(m3logn)O(m^3logn)O(m3logn)注意离散代码实现:#include<cstdio>#inclu原创 2020-07-07 22:00:08 · 135 阅读 · 0 评论 -
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 · 135 阅读 · 0 评论 -
luogu P4281 [AHOI2008]紧急集合 / 聚会
题面传送门其实这道弱省省选还蛮简单的。稍微思考一下我们就可以得出一个结论:集合点肯定在三个点中某两个点的lcalcalca上。因为无论这个点朝哪个方向移都是靠近一个点远离两个点肯定不会更优。所以我们可以先跑出三个点的lcalcalca然后再分别算答案输出。但是这样要跑666遍lcalcalca,在qzezojqzezojqzezoj上过不去淦。考虑优化。然后我们又思考一下就可以优化一下结论:与其他两个不一样的lcalcalca为最优点。因为其他两个点肯定高于原来最高的一个点,而这个点更靠近下原创 2020-06-24 20:17:44 · 186 阅读 · 0 评论 -
qzezoj 1588 队列重构(加强版)90分做法
题面传送门707070分做法参考这篇博客考虑在707070分做法上优化。707070分是一个一个找的。我们可以用树状数组维护序列aia_iai为iii之前有几个位置被占了。则当i<ji<ji<j时,ai≤aja_i\leq a_jai≤aj,这满足二分的性质,所以我们可以二分找位置。时间复杂度O(nlog2n)O(nlog^2n)O(nlog2n)代码实现:#...原创 2020-04-10 20:13:19 · 130 阅读 · 1 评论 -
qzezoj 1506 [ZJOI2009]Function
题面传送门首先一段告诉我们这nnn条线任意三线不共点,任意两线不平行。所以这个图像可以反过来。那么第一层一定是222段,一个焦点。第二层那一个焦点可以延伸出222个焦点,所以有四段。以此类推。而又因为它可以反过来,所以应该考虑两种情况。代码实现:#include<cstdio>#define min(a,b) ((a)>(b)?(b):(a))using na...原创 2020-03-28 15:53:38 · 86 阅读 · 0 评论 -
qzezoj [中山市选2009]谁能赢呢?
题面传送门简单博弈论,直接判奇偶就行了代码实现:#include<cstdio>using namespace std;int n;int main(){ scanf("%d",&n); while(n){ if(n&1) printf("Bob\n"); else printf("Alice\n"); ...原创 2020-03-28 15:48:33 · 107 阅读 · 0 评论 -
qzezoj 1592 三角形计数
题面传送门题目告诉我们,没有三点共线,所以我们可以容斥。两条线,x,yx,yx,y相等,即平行。那么我们可以用总可能数-222条直线平行-333条直线平行。用hashhashhash来判断平行线。代码实现:#include<cstdio>#include<cstring>#include<cmath>#define mod 600017usin...原创 2020-04-09 13:08:47 · 97 阅读 · 0 评论 -
qzezoj 1591 序列询问
题面传送门看数据范围,对于 100%100\%100%的数据 1≤n≤105,1≤Ai ≤109,1≤m≤1051 \leq n \leq 10^5, 1 \leq A_i \leq 10^9, 1 \leq m \leq10^51≤n≤105,1≤Ai ≤109,1≤m≤105 ,可能是O(nlogn)O(nlogn)O(nlogn)或O(nn)O(n\sqrt n)O(nn),再看开了两...原创 2020-04-08 15:36:47 · 123 阅读 · 0 评论 -
qzezoj 1590 买玩具
题面传送门我们可以尝试贪心。这个问题满足二分性质,即如果iii天能买到,i+1i+1i+1天一定能买到,所以我们可以二分。预处理一个maxnaimaxna_imaxnai表示美元在前iii天的最低汇率。英镑同样。把美元和英镑买的玩具分开,分别排序。在验证是用双指针就可以做到O(m)O(m)O(m)验证。时间复杂度O(mlog2n)O(mlog^2n)O(mlog2n)代码实现:#...原创 2020-04-07 13:54:50 · 133 阅读 · 0 评论 -
qzezoj 1589 好元素
题面传送门考虑用哈希折半搜索来解决。观察以下原式am+an+ap=ai,m,n,p<ia_m+a_n+a_p=a_i,m,n,p<iam+an+ap=ai,m,n,p<i考虑移项得到am+an=ai−ap,m,n,p<ia_m+a_n=a_i-a_p,m,n,p<iam+an=ai−ap,m,n,p<i,那么两边就可以分别枚举了。代码实现:...原创 2020-04-06 17:15:35 · 122 阅读 · 0 评论 -
qzezoj 1585 队列重构
题面传送门对于这道题,正着枚举是很难枚举的,但我们可以反着来。俗话说得好,正难则反。考虑最小的一个数hih_ihi,则所有数都是大于等于它的,所以它的排位应该是在viv_ivi。考虑第二小的数hjh_jhj,则除了hih_ihi没有其他数小于它,所以我们可以直接找到除了viv_ivi外的第iii位,它的答案就是在那里。以此类推。所以我们可以将所有二元组按hih_ihi排序。...原创 2020-04-03 12:42:40 · 141 阅读 · 0 评论 -
qzezoj 1584 数字序列
题面传送门考虑把两个操作合并,会发现把每444个分为一组,会剩下第333个。则我们可以很容易地推出递推式:fx=4×fx+14−1f_{x}=4\times f_{\frac{x+1}{4}}-1fx=4×f4x+1−1则我们就可以很容易地找到最后剩下的位置了。那么根据位置求数字就很简单了。代码实现:#include<cstdio>#include<cmath...原创 2020-04-03 09:30:43 · 127 阅读 · 0 评论 -
qzezoj 1582 DFS or BFS?
题面传送门直接暴力BFSBFSBFS,判断当前点和下一个单位时间有没有石头,并且当时间>22>22>22时就跳出。为什么是222222呢?考虑极端情况,一块石头在1,x1,x1,x的位置,如果这块石头掉到底部要888单位时间,然后如果现在再开始走,走到终点要141414个单位时间。代码实现:#include<cstdio>#include<cstri...原创 2020-03-31 17:48:47 · 93 阅读 · 0 评论 -
qzezoj 1580 巧克力
题面传送门对于这道题,明显可以dpdpdp,将一张表预处理出来。我们可以设fi,j,x,y,kf_{i,j,x,y,k}fi,j,x,y,k表示左下角为i,ji,ji,j右下角为x,yx,yx,y,切大小为kkk的,转移时横竖各枚举切分点与kkk的分配转移,时间复杂度O(305×502)=O(1)O(30^5\times 50^2)=O(1)O(305×502)=O(1)不过我们发现,实际...原创 2020-03-28 13:57:29 · 139 阅读 · 0 评论 -
qzezoj 1544 查找正方形
题面传送门这道题到现在为止还只有我一个人做出来,还是蛮高兴的QWQQWQQWQ算了不说了,再说909090分的zjzjzj会把我用唾沫星子淹死我的想法111:暴力枚举:枚举四个点,求这四个点之间的欧几里得距离,看是否相等,相等即构成一个正方形。大概303030分。想法222:构造:枚举三个点,构造出第四个点,看是否存在,用mapmapmap约50分,用hashhashhash约606060...原创 2020-03-27 16:04:17 · 156 阅读 · 0 评论 -
qzezoj 1545 疫病救援
题面传送门话说这不是一张真正的图啊,只是一根链表后面挂着一个可有可无的环儿。一眼扫去,这道题如果没有环,那么就是记忆化搜索或topotopotopo,但有环,就不好办。根据亡羊补牢原则,我们把这个环拆了不就好了。接下来就可以缩点。即把一个环变成一个权值为这个环的权值之和的点。我们可以把那些绕在环上的链拆了,然后对环跑dfs求出权值和。然后就是正常topotopotopo了代码实现:...原创 2020-03-26 13:32:25 · 92 阅读 · 0 评论 -
qzezoj 1547 疫病控制
题面传送门话说这道题题面和题目一点儿不沾边啊QAQQAQQAQ,而且还有错别字:大米有327683276832768棵(颗)……扯了半天,题目要求解一个方程组:ax1+bx2+cx3+dx4=0ax1+bx2+cx3+dx4=0ax1+bx2+cx3+dx4=0,0<=x1,x2,x3,x4<=m0<=x1,x2,x3,x4<=m0<=x1,x2,x3,x4<...原创 2020-03-26 12:32:17 · 133 阅读 · 0 评论 -
qzezoj 1578 锁妖塔
题面传送门按照题目要求递推即可代码实现:#include<cstdio>#define min(a,b) ((a)<(b)?(a):(b))using namespace std;int n,f[10039],a[10039];int main(){ register int i,j; scanf("%d",&n); for(i=1;...原创 2020-03-26 11:36:30 · 163 阅读 · 0 评论 -
qzezoj 1543 最快路线
题面传送门看到这道题,想到spfaspfaspfa。但这道题好像故意的,偏偏又路牌被拆的道路(在衢州的话负责那一段路的交警就该下台了),所以我们不能只以did_idi为timetimetime的唯一标准。想象一下:如果下一条路是没有路牌的,而这时过来一条路,timetimetime比did_idi大,但如果下一条路可以走得通怎么办?而且还走得比did_idi快。这时候就进退两难,如果...原创 2020-03-24 11:51:59 · 113 阅读 · 0 评论 -
qzezoj 1574 Chewbacca
题面传送门这道题似乎是板子,就是裸的LCALCALCA,然后我就打了个暴力LCALCALCA过掉了。思路:先把两个点提到同一层,然后一起向上提,直到提到同一个节点停止,计算答案。因为是满二叉树,所以时间复杂度O(klogmn)O(klog^mn)O(klogmn)代码实现:#include<cstdio>#define abs(x) ((x)>0?(x):-(x))...原创 2020-03-21 20:14:20 · 194 阅读 · 0 评论 -
qzezoj 1540 糖果峡谷
题面传送门三十分…于是我只能重新想思路。然后就只得了353535分。考试结束后老师叫我们自己去网上找题解,然而我发现,居然没有任何一篇luoguluoguluogu题解是正解。于是我准备发一篇题解来kkk掉luoguluoguluogu所有题解。正解:我们先把这个峡谷想象成一个时间轴,每个时间我们最多能带c个糖果。贪心思路:将右端点从小到大排序,验证这个区间在前面的情况下能不能完成,若...原创 2020-03-20 18:20:09 · 284 阅读 · 0 评论