
【OJ】BZOJ
文章平均质量分 74
cz_xuyixuan
这个作者很懒,什么都没留下…
展开
-
【BZOJ1488】【HNOI2009】图的同构
【题目链接】点击打开链接【思路要点】考虑Burnside引理或Polya定理,求解总共\(N!\)种点置换中边的染色方案等价类的个数总和,再将答案除以N!。考虑一个点集的置换\(P_{i}\),若将一个置换看做一张由\(N\)个点、\(N\)条边的无向图,那么显然,该图由若干个环组成。记其中每一个环长为\(A_{i}\),\(A\)可以看做一个\(N\)原创 2018-01-11 19:56:47 · 742 阅读 · 0 评论 -
【BZOJ1478】Sgu282 Isomorphism
【题目链接】点击打开链接【思路要点】考虑Burnside引理或Polya定理,求解总共\(N!\)种点置换中边的染色方案等价类的个数总和,再将答案除以N!。考虑一个点集的置换\(P_{i}\),若将一个置换看做一张由\(N\)个点、\(N\)条边的无向图,那么显然,该图由若干个环组成。记其中每一个环长为\(A_{i}\),\(A\)可以看做一个\(N原创 2018-01-11 20:14:38 · 473 阅读 · 1 评论 -
【BZOJ1000】A+B Problem
【题目链接】点击打开链接【思路要点】仔细读题,注意空间限制。【代码】#includeusing namespace std;#define MAXN 5000int main() { int a, b; scanf("%d%d", &a, &b); printf("%d\n", a + b); return 0;原创 2018-01-12 09:02:17 · 470 阅读 · 1 评论 -
【BZOJ1189】【HNOI2007】紧急疏散evacuate
【题目链接】点击打开链接【思路要点】问题中存在一种类似于流量限制的人流限制,考虑用网络流解决本题。枚举答案,对于每个时刻的每个位置分别建立一个点,简单建图后运行最大流,观察是否满流即可。常见的网络流\(Dinic\)算法中建立了反向边,因此可以在\(Ans=x\)的残量网络上加点后直接继续运行\(Ans=x+1\)的结果。最终图中的点数与边数均为\(原创 2018-01-12 09:54:57 · 469 阅读 · 0 评论 -
【BZOJ1001】【BeiJing2006】狼抓兔子
【题目链接】点击打开链接【思路要点】直接运行\(Dinic\)算法即可,注意内存限制。本题使用\(std::vector\)离奇\(Runtime Error\),令笔者不解。本题也可以将最大流问题对偶为最小割,使用最短路算法求解,复杂度为\(O(N*MLogN*M)\)。【代码】#includeusing namesp原创 2018-01-12 10:10:18 · 373 阅读 · 0 评论 -
【BZOJ3144】【HNOI2013】切糕
【题目链接】点击打开链接【思路要点】若距离限制\(D≥N\),显然我们可以通过取每一条纵轴上的最小值求解,但我们也可以将每一条纵轴上的的权值首尾相连,形成一条有向链,将链首与链尾分别于源点和汇点用容量无穷的边相连,用最小割求解。现在考虑距离限制\(D\),若将相邻纵轴上距离恰好为\(D\)的点从较后者向较前者连一条容量无穷的边,在最小割问题中就表示不原创 2018-01-12 10:55:44 · 396 阅读 · 0 评论 -
【BZOJ1002】【FJOI2007】轮状病毒
【题目链接】点击打开链接【思路要点】输入与输出仅包含一个数,考虑找规律。使用欧几里得算法配合\(Matrix-Tree\)定理求解取模一个大质数下问题的答案,并打表。结果如下\(F(1)=1,F(2)=8,F(3)=16,F(4)=45,F(5)=121,F(6)=320,F(7)=841,F(8)=2205\)。发现规律,\(F(i)=3*F(i-原创 2018-01-12 11:10:27 · 349 阅读 · 0 评论 -
【BZOJ1003】【ZJOI2006】物流运输
【题目链接】点击打开链接【思路要点】显然,两次变换线路之间所走的路一定是所能走的最短路。记\(Cost_{i,j}\)表示第\(i\)天至第\(j\)天均能走的路中最短路的长度。那么可以设计简单DP,用\(F_{i}\)表示第一天到底\(i\)天的最小花费,那么显然有转移方程:$$F_{i}=min_{j=0}^{i-1}\{Cost_{j-1,i}原创 2018-01-12 11:32:29 · 450 阅读 · 0 评论 -
【BZOJ3064】【TYVJ1518】CPU监控
【题目链接】点击打开链接【思路要点】题目中提到的操作均为区间操作,考虑使用线段树。若不存在A询问,剩余部分属于线段树的基本操作。考虑将题目先简化一下:若不存在C操作,如何用线段树解决本题?首先,对于区间最大值询问,我们维护区间最大值\(Max\)和区间加标记\(tagadd\),分别表示对应区间的最大值和未下传的区间加标记值,其下传方式显然。其次,对于区原创 2018-01-22 11:35:06 · 766 阅读 · 0 评论 -
【BZOJ1004】【HNOI2008】Cards
【题目链接】点击打开链接【思路要点】题意表明,给定的洗牌方式在加上单位置换后(原本存在就不需要再加了)是一个置换群。考虑Burnside引理或Polya定理。注意到题目有颜色的使用次数的限制,因此不便使用Polya定理,考虑使用Burnside引理,求解每一个置换的本质不同的染色方案数的平均数。显然可以设计动态规划在\(O(N*R*G*B)\)的时空原创 2018-01-22 12:47:46 · 324 阅读 · 0 评论 -
【BZOJ3224】【TYVJ1728】普通平衡树
【题目链接】点击打开链接【思路要点】本题包含了平衡树最基本的操作。是任何学习平衡树都应当先做一遍的题。笔者实现了四种平衡树,Splay、Treap、替罪羊树和非旋转式Treap(以及其可持久化)。【代码】Splay/*Splay Tree Version*/#includeusing namespace std;原创 2018-01-14 19:53:39 · 691 阅读 · 0 评论 -
【BZOJ3223】【TYVJ1729】文艺平衡树
【题目链接】点击打开链接【思路要点】使用可以打标记的Splay来实现区间翻转,时间复杂度\(O(MLogN)\)。代码过于陈旧,风格较丑。【代码】#includeusing namespace std;#define MAXN 100005struct Node { int father, child[2], size,原创 2018-01-14 20:09:05 · 367 阅读 · 0 评论 -
【BZOJ1500】【NOI2005】维修数列
【题目链接】点击打开链接【思路要点】使用Splay维护多个标记进行各种区间操作,代码实现较为困难。内存限制64MB,注意内存回收,避免空间超限。【代码】#includeusing namespace std;#define MAXN 500005#define MAXIN 4500005struct Node { i原创 2018-01-15 09:24:18 · 342 阅读 · 0 评论 -
【BZOJ1497】【NOI2006】最大获利
【题目链接】点击打开链接【思路要点】直接解最大权闭合子图问题即可。时间复杂度\(O(Dinic(N+M,N+3*M))\)。【代码】#includeusing namespace std;const int MAXP = 60005;const int INF = 1e9;template void read(T &原创 2018-01-15 09:45:00 · 329 阅读 · 0 评论 -
【BZOJ3196】【TYVJ1730】二逼平衡树
【题目链接】点击打开链接【思路要点】用外层树状数组套内层权值线段树,那么每一个区间对应的权值线段树可以表示为\(O(LogN)\)棵线段树的和(差)。那么在得到的线段树上二分即可在\(O(LogNLogV)\)的时间内解决题目中所给出的询问。注意修改仅涉及单点修改,那么至多会修改\(O(LogN)\)棵线段树,即修改的时间复杂度为\(O(LogNLo原创 2018-01-15 09:56:16 · 341 阅读 · 0 评论 -
【BZOJ3435】【UOJ55】【WC2014】紫荆花之恋
【题目链接】BZOJUOJ【思路要点】考虑点\(i\)和点\(j\)路径上任意一点\(k\),那么$$R_{i}+R_{j}≥Dist(i,j) \Leftrightarrow R_{i}-Dist(i,k)≥Dist(j,k)-R_{j}$$令\(F_{i,k}=R_{i}-Dist(i,k)\),即\(F_{i,k}≥-F_{j,原创 2018-01-13 13:18:33 · 1333 阅读 · 0 评论 -
【BZOJ3438】小M的作物
【题目链接】点击打开链接【思路要点】题目中的一类增益可以归结为“若某些元素的选取状态为0/1,那么额外获得收益”,考虑最大权闭合子图问题。对于一个种子,为了获得最大收益,我们显然一定要将它种下去。如果我们默认“选取”的意义是种在A田中,“不取”的意义是种在B田中,那么其“选取”得到的真正的权值为\(V_{a}-V_{b}\)。考虑增益条件,一个增益条原创 2018-01-15 10:46:58 · 399 阅读 · 0 评论 -
【BZOJ3172】【TJOI2013】单词
【题目链接】点击打开链接【思路要点】对单词集建立AC自动机,将单词用不可见字符连接,作为母串,放入AC自动机即可。时间复杂度\(O(∑|S|)\)(Fail树上差分+DFS),\(O(N*∑|S|)\)(暴力更新答案),均可通过。【代码】#includeusing namespace std;#define MAXN 1200原创 2018-01-15 11:03:22 · 327 阅读 · 0 评论 -
【BZOJ1565】【NOI2009】植物大战僵尸
【题目链接】点击打开链接【思路要点】题目中的限制可以总结为“若选取A,则必须选取B”,考虑最大权闭合子图问题。但是我们从样例中发现原图是可能存在环的,而最大权闭合子图问题要求原图是一个有向无环图。进一步分析发现,环上的元素是必然不能选取的,进而连向不能选的元素的元素同样不能选。进行一次DFS,确定每个元素是否可选,在可选的元素中建图,解最大权闭合子图原创 2018-01-15 09:01:59 · 436 阅读 · 0 评论 -
【BZOJ1458】士兵占领
【题目链接】点击打开链接【思路要点】矩阵可以看做一张二分图,其中行为左侧点,列为右侧点,矩阵中的元素为边。直观地考虑,我们发现本题可以用有上下界的网络流来实现。由源点向行\(i\)连边,下界为\(L_{i}\),上界为\(+\infty\)。由列\(i\)向汇点连边,下界为\(C_{i}\),上界为\(+\infty\)。若\((i,j)\)不是障碍原创 2018-01-15 12:54:01 · 312 阅读 · 1 评论 -
【BZOJ1036】【ZJOI2008】树的统计
【题目链接】点击打开链接【思路要点】树链剖分模板题。时间复杂度\(O(QLog^{2}N)\)。【代码】#includeusing namespace std; #define MAXN 30005#define MAXLOG 20#define INF 1e9vector a[MAXN]; struct Node {原创 2018-01-15 17:13:28 · 247 阅读 · 0 评论 -
【BZOJ4196】【UOJ128】【NOI2015】软件包管理器
【题目链接】点击打开链接【思路要点】树链剖分,子树是DFS序中连续的一段,而路径由至多\(O(LogN)\)段组成,剩余部分用线段树解决即可。时间复杂度\(O(QLog^{2}N)\)。【代码】#includeusing namespace std; #define MAXN 120000struct node { int l原创 2018-01-15 17:24:26 · 375 阅读 · 0 评论 -
【BZOJ1711】【Usaco2007 Open】Dining
【题目链接】点击打开链接【思路要点】观察数据范围以及类似于容量限制的一列条件,考虑用最大流解题。一点对答案的贡献可以看做一个(食物、牛、饮料)的三元组,其中食物、牛、饮料中的每个元素仅能使用一次,且食物-牛和牛-饮料均可以根据给出的关系相互匹配。建立分层图,对中间的元素(牛)进行拆点限流,运行最大流即可。时间复杂度\(O(Dinic(2*N+F+D,原创 2018-01-16 08:48:08 · 315 阅读 · 0 评论 -
【BZOJ2049】【SDOI2008】洞穴勘测
【题目链接】点击打开链接【思路要点】LinkCutTree模板题,支持维护动态森林的联通性,通过询问所在子树的根部来实现。时间复杂度\(O(MLogN)\)。【代码】#includeusing namespace std;#define MAXN 10005struct LinkCutTree { struct Node原创 2018-01-16 08:57:23 · 270 阅读 · 0 评论 -
【BZOJ2127】Happiness
【题目链接】点击打开链接【思路要点】题目中的一类增益可以归结为“若某些元素的选取状态为0/1,那么额外获得收益”,考虑最大权闭合子图问题。对于一个同学,如果我们默认“选取”的意义是选择文科,“不取”的意义是选择理科,那么其“选取”得到的真正的权值为\(V_{文科}-V_{理科}\)。考虑增益条件,一个增益条件可以拆分为两个形如“若某些元素选取,那原创 2018-01-16 10:21:35 · 329 阅读 · 0 评论 -
【BZOJ3262】陌上花开
【题目链接】点击打开链接【思路要点】直观地来想,本题可以先排序一维,然后使用二维数据结构(树套树,KD-Tree)来解决。时间复杂度\(O(NLog^{2}N)\)或\(O(N\sqrt{N})\)。或者也可以用CDQ分治来解决本题,时间复杂度同样为\(O(NLog^{2}N)\)。其中树套树的空间复杂度高达\(O(NLog^{2}N)\),粗糙的实原创 2018-01-16 10:34:49 · 492 阅读 · 0 评论 -
【BZOJ5117】【UOJ164】【清华集训2015】V
【题目链接】BZOJUOJ【思路要点】首先定义一种标记\((a,b)\)表示先给这个区间的数加上\(a\)再和\(b\)取最大值。不难发现题目中的操作均可以表示成\((a,b)\)的形式,分别是\((x,0),(-x,0),(-INF,x)\)。考虑合并标记\((a,b),(c,d)\),那么得到的是\((max(a+c,-INF),max(b+原创 2018-01-24 10:51:36 · 650 阅读 · 0 评论 -
【BZOJ1007】【HNOI2008】水平可见直线
【题目链接】点击打开链接【思路要点】将直线按斜率排序,用单调栈维护半平面交。注意有关实数运算EPS的问题。时间复杂度\(O(NLogN)\)。【代码】#includeusing namespace std;#define MAXN 100005#define EPS 1e-6struct line {double k, b原创 2018-01-24 11:01:18 · 274 阅读 · 0 评论 -
【BZOJ2115】【WC2011】Xor
【题目链接】点击打开链接【思路要点】任取一条1到\(N\)的路径,考虑一个与其相交的环,显然,我们可以半路“绕”一次这个环,使路径的权值Xor上环的权值。这启发我们问题很可能与线性基有关。再考虑一个不与其相交的环,由于图的联通性,我们可以走出路径“绕”一次这个环,再原路返回,多走的路被走了两次,Xor和为0。因此,路径的权值同样Xor上了环的权值。所原创 2018-01-17 10:31:04 · 370 阅读 · 1 评论 -
【BZOJ2597】【WC2007】剪刀石头布
【题目链接】点击打开链接【思路要点】数据范围暗示网络流/线性规划,但直接建图不太可行,需要发掘题目性质。考虑一个原图三个点的子图,它共有3条边,\(2^{3}=8\)种形式,其中能对答案产生1的贡献的有2种。观察剩余6种形式,我们发现,它们都满足三个端点处分别是一入一出、两入、两出。如果我们把出现一次这6种形式之一看做对答案造成1点损失,那么把损失归原创 2018-01-17 10:05:55 · 350 阅读 · 0 评论 -
【BZOJ3027】【CEOI2004】Sweet
【题目链接】点击打开链接【思路要点】我们显然可以得到一个直接的DP做法,记\(F_{i,j}\)表示在前\(i\)个集合中取\(j\)个元素的方案数,则显然有$$ \left\{\begin{aligned}F_{0,0} = 1\\F_{i,j}=\sum_{k=max(0,j-M_{i})}^{j}F_{i-1,k}\end{aligned}\right.$$运用滚动数组,对转移稍加优化,可以原创 2018-01-17 20:15:36 · 497 阅读 · 0 评论 -
【BZOJ2594】【WC2006】水管局长数据加强版
【题目链接】点击打开链接【思路要点】若题目仅包含询问操作,显然我们只需保留一棵图的最小生成树,在树上询问两点间边权的最大值即可。而本题中多了一种删边操作,但没有强制在线,因此,我们可以将操作离线,转化为加边操作。用LinkCutTree维护动态最小生成树即可。时间复杂度\(O((M+Q)LogN)\)。【代码】#include<bits/stdc++.h>using namespac...原创 2018-01-17 20:26:23 · 271 阅读 · 0 评论 -
【BZOJ1758】【WC2010】重建计划
【题目链接】点击打开链接【思路要点】首先,题目要求求解平均值的最大值,考虑分数规划。二分答案\(Mid\),将树上每条边权减去\(Mid\),问题变为树上是否存在边数在\(L\)到\(R\)之间的权值之和非负的路径。考虑点分治。记录\(Dist\)数组,\(Dist_{i}\)表示边数为\(i\)的从分治根节点出发的路径的最大权值。对于每一个分治子树进行BFS,记当前BFS深度为\(i\),在\(原创 2018-01-18 13:57:28 · 450 阅读 · 0 评论 -
【BZOJ4355】Play with Sequence
【题目链接】点击打开链接【思路要点】题目中提到的操作均为区间操作,考虑使用线段树。注意到数列中的数始终非负,因此3号操作可以看做询问最小值以及其出现次数。2号操作并非线段树的一般操作,无法直接支持标记合并。考虑一个被2号操作定位的区间,记区间最小值为\(Min\),严格次小值为\(Mim\),对该区间实行操作数为\(Val\)的2号操作。若\(Min+Val≥0\),显然这个操作可以看做一个区间加原创 2018-01-18 13:19:52 · 747 阅读 · 0 评论 -
【BZOJ4695】最假女选手
【题目链接】点击打开链接【思路要点】题目中提到的操作均为区间操作,考虑使用线段树。2号操作和3号操作并非线段树的一般操作,无法直接支持标记合并。考虑一个被2号操作定位的区间,记区间最小值为\(Min\),严格次小值为\(Nin\),对该区间实行操作数为\(Val\)的2号操作。若\(Min≥Val\),显然这个操作可以直接忽略。若\(MinVal\),我们可以将这个操作看作是对区间中最小值的整体加原创 2018-01-19 11:06:33 · 1689 阅读 · 0 评论 -
【BZOJ3052】【UOJ58】【WC2013】糖果公园
【题目链接】BZOJUOJ【思路要点】维护一个糖果集合,支持加入一个糖果,删除一个糖果,显然,我们可以容易地在\(O(1)\)的时间内实现这些操作。考虑使用莫队算法。对树分块,运行树上带修莫队即可。实际上,这是一道树上带修莫队的模板题,相当于将带修莫队、树上莫队和树分块合为一体。时间复杂度\(O(N^{\frac{5}{3}})\)。【代码】#includeusing namespace std原创 2018-01-19 11:21:15 · 419 阅读 · 0 评论 -
【BZOJ1211】【HNOI2004】树的计数
【题目链接】点击打开链接【思路要点】双倍经验题,本题是【BZOJ1005】【HNOI2008】明明的烦恼的简化版,笔者本题的代码由原题代码重构而得。题解见【BZOJ1005】【HNOI2008】明明的烦恼。【代码】#includeusing namespace std;#define MAXL 4005#define MAX原创 2018-02-05 13:08:41 · 359 阅读 · 0 评论 -
【BZOJ1005】【HNOI2008】明明的烦恼
【题目链接】点击打开链接【双倍经验链接】【BZOJ1211】【HNOI2004】树的计数【思路要点】考虑树的Prufer序列。树的Prufer是一个长度为\(N-2\)的序列,其中每一个元素为一个\(1\)到\(N\)的整数。每一个这样的序列对应了一棵确定的\(N\)个节点的树,并且每一棵\(N\)个节点的树对应了一个这样原创 2018-02-04 19:42:52 · 361 阅读 · 0 评论 -
【BZOJ1008】【HNOI2008】越狱
【题目链接】点击打开链接【思路要点】考虑计算总状态数和不越狱的状态数,相减得到答案。显然,总状态数为\(M^{N}\),不越狱的状态数为\(M*(M-1)^{N-1}\)。快速幂计算即可。【代码】#includeusing namespace std;#define MAXN 5005#define P 100003tem原创 2018-02-05 13:23:01 · 191 阅读 · 0 评论 -
【BZOJ1430】小猴打架
【题目链接】点击打开链接【思路要点】显然,问题是求不同的树的形态乘以\((N-1)!\)。由Prufer序列,显然不同的树的形态有\(N^{N-2}\)种,故答案为\((N-1)!*N^{N-2}\)。时间复杂度\(O(N)\)。【代码】#includeusing namespace std;#define MAXN 5005原创 2018-02-05 13:31:33 · 436 阅读 · 0 评论