
BZOJ刷题录
BZOJ我刷得题得题解...
Tgotp
蒟蒻OIer
blog:tgotp.science
展开
-
1095: [ZJOI2007]Hide 捉迷藏
思路看得题解: 考虑将整个树dfs下来,得到一个括号序列,对于两个点,他们之间的距离就是他们之间的括号数量去掉中间匹配的括号的数量 那么考虑线段树维护,用s表示左括号数量,s2表示右括号数量,ri liri liri \ li分别表示区间黑点左括号最多的数量/右括号最多的数量, rm lmrm lm rm \ lm 分别表示区间到右端点/左端点括号最多的...原创 2018-04-19 23:06:16 · 326 阅读 · 0 评论 -
3489: A simple rmq problem
写了两个版本: 一个树套树 一个kdt树套树版本并不能在bz ac。 因为内存占用达到了可耻的700mb,即便加了优化依旧在600mb左右 考虑实际上就是要在给定的[l,r][l,r][l,r]区间求出最大的数 使得 nxt[pos]<R pre[pos]<Lnxt[pos]<R pre[pos]&...原创 2018-04-22 20:02:06 · 242 阅读 · 0 评论 -
3932: [CQOI2015]任务查询系统
主席树裸题, 对于权值建立主席树。 然后直接跑R的版本,先跑左子树再跑右子树 如果k=0k=0k = 0直接返回即可 还有把一个任务分成两个操作 另外就是如果跑到根还没结束,就说明当前的点只能选kkk个,特判即可 c++代码如下:#include<bits/stdc++.h>#define rep(i,x,y) for(register int i = x ; i...原创 2018-04-22 23:01:48 · 466 阅读 · 0 评论 -
4873: [Shoi2017]寿司餐厅
注意审清题意… 看错题导致浪费了一上午的时间发现其实就是个最大闭合子权图的水题 [l,r][l,r][l,r]肯定要向[l+1,r][l+1,r][l+1,r] [l,r−1][l,r−1][l,r-1]连边 sss向每一个值大于000的区间连边,所有值小于000的区间向ttt连边 把每一种寿司单独做一个点,选每一个点的时候再连过来即可c++代码如下:#include<b...原创 2018-04-23 11:28:37 · 341 阅读 · 0 评论 -
5293: [Bjoi2018]求和
省选题竟然考模板题… 直接预处理 然后每次询问求lca即可 注意得卡一波常… c++代码如下:#include<bits/stdc++.h>#define rep(i,x,y) for(register int i = x ; i <= y ; ++ i)#define repd(i,x,y) for(register int i = x ; i >= y ...原创 2018-04-23 12:28:01 · 498 阅读 · 0 评论 -
4818: [Sdoi2017]序列计数
考虑至少含一个质数的方案等于所有方案 −−-不含质数方案 然后考虑如何求,看到1e91e91e9很容易想到矩阵快速幂, 然后转移也就出来了,对于不含质数的方案跑一边线性筛即可 c++代码如下:#include<bits/stdc++.h>#define rep(i,x,y) for(register int i = x ; i <= y ; ++ i)#define...原创 2018-04-23 14:56:42 · 208 阅读 · 0 评论 -
4827: [Hnoi2017]礼物
首先知道旋转的一般套路就是开两倍。 然后此时发现可以把 ∑ni=1(ai−bi)2∑i=1n(ai−bi)2\sum_{i=1}^{n}(a_i-b_i)^2化作∑ni=1a2i+∑ni=1b2i−2∗∑ni=1ai∗bi∑i=1nai2+∑i=1nbi2−2∗∑i=1nai∗bi\sum_{i=1}^{n}a_i^2 + \sum_{i=1}^{n}b_i^2 - 2*\sum_{i=1}^...原创 2018-04-23 21:16:50 · 182 阅读 · 0 评论 -
1034: [ZJOI2008]泡泡堂BNB
知道原本可以不用写的这么麻烦 懒得想了 容易想到优先匹配 胜利 的, 然后 再去 匹配平局 然后就是二分一下然后并查集搞搞就行了 对于 最小 得分 就是对手最大得分, 反过来对对手处理一遍即可 c++ 代码如下:#include<bits/stdc++.h>#define rep(i,x,y) for(register int i = x ; i <= y; ...原创 2018-04-23 23:27:14 · 214 阅读 · 0 评论 -
4198: [Noi2015]荷马史诗
huffman编码 c++代码如下:#include<bits/stdc++.h>#define rep(i,x,y) for(register int i = x;i <= y; ++ i)#define repd(i,x,y) for(register int i = x; i >= y; -- i)typedef long long ll;using n...原创 2018-04-18 08:50:41 · 438 阅读 · 0 评论 -
2879: [Noi2012]美食节
实际上这题是SCOI2008修车的强化版. 这题只用注意一个 地方: spfa一定要入出队优化…不然稳t… C++代码如下:#include<bits/stdc++.h>#define rep(i,x,y) for(register int i = x; i <= y; ++ i )#define repd(i,x,y) for(register int i = x;...原创 2018-04-18 14:09:29 · 293 阅读 · 0 评论 -
3140: [Hnoi2013]消毒
匈牙利匹配 观察题目发现肯定每次某一维选1,然后另两维就可以覆盖完, 所以暴力枚举某一维,然后考虑另两维如何最小。 显然是个匈牙利匹配的裸题。 注意这道题一定要加贪心优化,不然稳t。c++代码如下:#include<bits/stdc++.h>#define rep(i,x,y) for(register int i = x; i <= y; ++i)usin...原创 2018-04-18 20:04:20 · 239 阅读 · 0 评论 -
1017: [JSOI2008]魔兽地图DotR
耗费了我一上午的时间来肝这个题 考虑令f[i][j][k]f[i][j][k]f[i][j][k]表示第i个点花费了k的价值能提供j个道具用来合成的最大价值。。。 然后发现dpdpdp式子很容易推出来,但是发现这个复杂度嘛,不敢恭维O(100∗n∗m∗m)O(100∗n∗m∗m)O(100*n*m*m) 左思右想也优化不了,然后去看了题解,,,发现真的是这个玄学的复杂度… 但是需要加优化,...原创 2018-04-19 12:24:22 · 346 阅读 · 0 评论 -
1018: [SHOI2008]堵塞的交通traffic
考虑如果是一条直线能用线段树非常容易的维护, 但是现在是一个矩形… 考虑在直线能否联通的情况下实际是维护左右端点连通性 扩展到矩形,思考可以得到,现在维护6个变量能达到相同效果 用lululu代表左上,ldldld代表左下,rururu代表右上,rdrdrd代表右下 那么现在就是维护 lu−ld lu−ru ...原创 2018-04-19 18:31:01 · 244 阅读 · 0 评论 -
3676: [Apio2014]回文串
卡着时限过的… 时间大概是垫底一般的存在把… 容易想到马拉车处理回文串(不过这题大佬都是回文自动机啥的。。。 然后考虑相同的串一定是sa上h数组连续的一段,那么二分左右端点即可. 然后扫一遍就求出了答案 c++代码如下:#include<bits/stdc++.h>#define rep(i,x,y) for(register int i = x; i <...原创 2018-04-12 17:39:57 · 204 阅读 · 0 评论 -
2938: [Poi2000]病毒
考虑如果已经有了一个无限长的串,那么现在就是判断这个串能不能合法。 对于所有串建立ac自动机,那么显然如果一个点是病毒,其以后的点都是病毒, 并且如果一个点的fail是病毒,那么这个点也应该是病毒。 在ac自动机上跑,如果能一直不经过所有标记过的点(即为环)那么一定存在这个串。c++代码如下:#include<bits/stdc++.h>#define rep(i,x,...原创 2018-04-15 17:19:18 · 262 阅读 · 0 评论 -
2434: [Noi2011]阿狸的打字机
首先容易根据给出的字符串建出trie树对于查询(x,y),相当于对于y的每一个位置求出他的后缀是否包含x串那么容易想到建立出ac自动机。那么就是对于y串的每个位置,其能否通过fail到达x所在节点。发现其实fail指针会构成一棵树,那么相当于统计在x节点下有多少点属于y串。发现如果直接枚举是O(n2)O(n2)O(n^2),那么考虑dfs trie树,记录每个位置是否是y串,...原创 2018-04-15 23:07:07 · 169 阅读 · 0 评论 -
3992: [SDOI2015]序列统计
容易列出dp方程f[i][j]f[i][j]f[i][j]表示第i个位置乘积为jjj的方案数。 那么推出转移 f[i+1][j∗p%m]+=f[i][j]f[i+1][j∗p%m]+=f[i][j]f[i+1][j*p\%m] += f[i][j] 此时复杂度O(n∗m2)O(n∗m2)O(n*m^2) 显然不能接受 想到对于nnn特别大的情况一般都会用快速幂。 那么可以列出一个m*m的矩...原创 2018-04-16 10:53:04 · 221 阅读 · 0 评论 -
2946: [Poi2000]公共串
一开始理解错了子串的含义,尴尬… 理解了题意. 其实就是个后缀自动机裸题,把第一个串建后缀自动机,然后把所有串放在上面跑即可… c++代码如下:#include<bits/stdc++.h>#define rep(i,x,y) for(register int i = x ; i <= y; ++ i )#define repd(i,x,y) for(registe...原创 2018-04-16 20:23:23 · 262 阅读 · 0 评论 -
2127: happiness
观察数据范围很好想到用网络流来做 令选文科为ai,选理科为bi,同时选文科得到价值ki,同时选理科得到价值pi 容易建图 然后发现这样点数以及边数过多会导致tle.. 考虑优化… 发现ki实际上是在si,sj均被割掉的情况下才会产生价值. pi同理,那么思考发现: 在i,j间连边(pi+ki)/2,ai + ki/2,bi+pi/2,aj+ki/2,bj+ki/2也可以达到相同效...原创 2018-04-03 10:44:18 · 227 阅读 · 0 评论 -
4293: [PA2015]Siano
去成都考试的题目的原题? 思路是一眼内容,就是代码不好写. 直接考虑用线段树维护一下区间草的信息即可… c++代码如下:/*code by Tgotp*/#include<iostream>#include<cctype>#include<cstdio>#include<string>#include<cstring&g...原创 2018-04-03 14:33:31 · 324 阅读 · 0 评论 -
4945: [Noi2017]游戏
观察d的数据范围为8 然后考虑暴力枚举x的取值… 一开始我暴力令x = ‘a’ ,’b’,’c’则为3^n 但是发现其实因为最后每个位置只用一个取值,那么只要保证x能取’A’ ‘B’ ‘C’即可。 也就是x = ‘a’ ,’b’, 复杂度2^n 接下来容易发现是个2-sat问题… 建边以后跑tarjan, 然后根据belong 的大小来确定是选的第一个数还是第二个..c++代码...原创 2018-04-03 18:39:38 · 270 阅读 · 0 评论 -
5210: 最大连通子块和
暂时拿了榜一… . 观察这道题,很容易想到一个dp方程… 令f[i]表示i的子树与i相连最大联通块点权和 。。。 那么只要保证子树f[j] > 0那么一定可以加入f[i]当中。。。 那么现在就得到了所有的f值… 考虑答案实际就是在 i 的子树中所有节点的f值得max 然后就想到用树剖维护… 发现对于更新. 如果该点得值变大.那么对于该点以上所有f大于0得点都可以增加这个值。...原创 2018-04-04 09:34:34 · 963 阅读 · 0 评论 -
2754: [SCOI2012]喵星球上的点名
洛谷会t一个点… 想法很简单.. 就是说按照后缀数组一般处理得方法,把所有串接在一起,然后暴力看哪些串有连在一起。c++代码如下:#include<bits/stdc++.h>#define rep(i,x,y) for(register int i = x ;i <= y;++ i)#define repd(i,x,y) for(register int i =...原创 2018-04-04 11:21:00 · 299 阅读 · 0 评论 -
2956: 模积和
以为是个大水题。。。 结果写了两小时 我数学真差.jpg 容易发现式子可以化成 然后拆开可以得到(四个)五个式子,分别计算即可… (懒得写公式了,自己推一下吧 然后你就能发现死活过不去… 原因是啥呢…给的这个模数竟然不是个质数。 那么考虑用exgcd来求解逆元就行了 c++代码如下:#include<bits/stdc++.h>#define rep(i,x...原创 2018-04-04 13:11:36 · 247 阅读 · 0 评论 -
4448: [Scoi2015]情报传递
主席树维护树链剖分… 一开始直接套了个贪心的线段树… 发现t的没边了….这就很尴尬呀.. 观察后发现可以把一个询问转换为寻求区间有多少小于i-c-1的数. 发现这个性质就很好,一个主席树可以很轻松的解决,那么套上就好啦. c++代码如下:#include<bits/stdc++.h>#define rep(i,x,y) for(register int i = x; i...原创 2018-04-04 17:16:42 · 247 阅读 · 0 评论 -
2843: 极地旅行社
明天省选复习一下板子。 lct板子题…操作都是基本要求… 不过一遍ac还是超出了我的预料QWQ c++代码如下:#include<bits/stdc++.h>#define rep(i,x,y) for(register int i = x; i <= y; ++ i)#define repd(i,x,y) for(register int i = x; i >...原创 2018-04-05 15:20:32 · 292 阅读 · 0 评论 -
4817: [Sdoi2017]树点涂色
lct套线段树 c++代码如下:#include<bits/stdc++.h>#define rep(i,x,y) for(register int i = x; i <= y; ++ i)#define repd(i,x,y) for(register int i = x; i >= y; -- i)typedef long long ll;using ...原创 2018-04-05 17:09:07 · 165 阅读 · 0 评论 -
1941: [Sdoi2010]Hide and Seek
突然发现 SCOI之前我tm刷的基本都是SDOI 的题… kd-tree板子题… c++代码如下:#include<bits/stdc++.h>#define rep(i,x,y) for(register int i = x ; i <= y; ++ i)#define repd(i,x,y) for(register int i = x ; i >= y; ...原创 2018-04-05 21:14:04 · 405 阅读 · 0 评论 -
3143: [Hnoi2013]游走
数组开小引发的惨案… 这题算边的期望转化为算点的期望. 令p[i][j]表示i点到j点的概率 e[i]表示到第i个点的期望 d[i]表示到第i条边的期望 有d[i]=e[u[i]]∗1out[u[i]]+e[v[i]]∗1out[v[i]]d[i]=e[u[i]]∗1out[u[i]]+e[v[i]]∗1out[v[i]]d[i] = e[u[i]]*\frac{1}{out[u[i]]...原创 2018-04-10 13:23:15 · 212 阅读 · 0 评论 -
5248: [2018多省省队联测]一双木棋
容易写出暴力. c++代码如下:#include<bits/stdc++.h>#define rep(i,x,y) for(register int i = x; i <= y; ++ i)#define repd(i,x,y) for(register int i = x; i >= y; -- i)using namespace std;typedef l...原创 2018-04-10 17:56:23 · 309 阅读 · 0 评论 -
5251: [2018多省省队联测]劈配
简单观察即可发现是个网络流。 然后建边很好弄。 考虑第一个询问实际上就只用枚举一下当前放第几志愿能跑出流量。 第二个询问实际上就是重新建图跑流量。 发现直接不是很好求出答案, 那么发现可以在跑第i个人之前,处理一下哪些点还可以放人,然后更新答案即可 c++代码如下:#include<bits/stdc++.h>#define rep(i,x,y) for(regist...原创 2018-04-11 07:51:19 · 259 阅读 · 0 评论 -
1152: [CTSC2006]歌唱王国Singleland
这两题很类似,看看上面题解即可 c++代码如下:#include<bits/stdc++.h>#define rep(i,x,y) for(register int i = x ;i <= y;++ i)#define repd(i,x,y) for(register int i = x ; i >= y;-- i)using namespace std;...原创 2018-03-29 16:26:34 · 615 阅读 · 0 评论 -
2395: [Balkan 2011]Timeismoney
推荐一篇炒鸡强的blog 好就这样…不想写其他的,看这个就ojbk了 c++代码如下:#include<bits/stdc++.h>#define rep(i,x,y) for(register int i = x; i <= y; ++ i)#define repd(i,x,y) for(register int i = x; i >= y; -- i)us...原创 2018-03-27 20:01:54 · 211 阅读 · 0 评论 -
1072: [SCOI2007]排列perm
随便暴力就能ac?c++代码如下:#include<bits/stdc++.h>#define rep(i,x,y) for(register int i = x; i <= y; ++ i)using namespace std;typedef long long ll;template<typename T>inline void read(T&a...原创 2018-03-27 20:49:07 · 161 阅读 · 0 评论 -
4444: [Scoi2015]国旗计划
破环为链… 然后求出每个边最优情况下右边的边。 然后倍增贪心即可… c++代码如下:#include<bits/stdc++.h>#define lowbit(x) (x & -x)#define rep(i,x,y) for(register int i = x ; i <= y ; ++ i)#define repd(i,x,y) for(regist...原创 2018-03-27 15:10:14 · 186 阅读 · 0 评论 -
2882: 工艺
显然看到题第一反应sam /sa瞎搞搞。。。 然后看到数据范围,发现值域过大… 其实也无所谓…套个map,多个log搞定。。。 当然其实可以用 最小表示法 (O(n)). (我不会orz) c++代码如下:#include<bits/stdc++.h>#define rep(i,x,y) for(register int i = x ; i <= y; ++ i)...原创 2018-03-27 18:44:11 · 246 阅读 · 0 评论 -
2705: [SDOI2012]Longge的问题
考虑把式子化成然后就可以枚举n的因子,然后求出其欧拉函数值即可.c++代码如下:#include<bits/stdc++.h>#define rep(i,x,y) for(register int i = x ; i <= y ;++ i)#define repd(i,x,y) for(register int i = x ; i >= y ;-- i)typedef...原创 2018-03-12 08:36:27 · 274 阅读 · 0 评论 -
2286: [Sdoi2011]消耗战
考虑到删除某个点的最小值就是根到该节点的边的最小值。然后可以先dfs一遍求出该值,然后考虑对于两个点,删除的价值就是min(dis[x]+dis[y],dis[lca])所以可以用虚树处理,然后在虚树上dp即可...c++代码如下:#include<bits/stdc++.h>#define rep(i,x,y) for(register int i = x; i <= y; ...原创 2018-03-12 09:42:14 · 237 阅读 · 0 评论 -
4025: 二分图
考虑二分图的判定就是看图内是否有奇环...因为存在一条公共边的两个偶环还是会构成一个偶环,那么用lct维护以时间为权值的最大生成树,这样可以保证如果有奇环,一定是和树上的边构成的...然后注意一下细节就好了...(↑这傻逼调了一天)c++代码如下:#include<bits/stdc++.h>#define rep(i,x,y) for(register int i = x ; i ...原创 2018-03-12 16:35:29 · 231 阅读 · 0 评论 -
4503: 两个串
将s2串倒过来,把?看成0,很容易把式子化成f[i] = ∑(s1[i] - s2[len2+i-j]))^2*s2[len2+i-j]然后展开得到俩个卷积与一个常数,然后上fft即可c++代码如下:#include<bits/stdc++.h>#define rep(i,x,y) for(register int i = x ; i <= y;++ i)typedef lo...原创 2018-03-15 16:35:38 · 222 阅读 · 0 评论