bzoj
文章平均质量分 55
Ren_Ivan
衡中oier,fight for furture
展开
-
bzoj 4501 旅行
01分数规划+最大权闭合子图 倒拓扑序处理每个节点 f[x]=∑f[v]n+1f[x]=\frac{\sum{f[v]}}{n}+1 二分答案 val 只需要判断是否存在 ∑f[v]+1−val>0\sum{f[v]+1-val}>0即可 点权下放给边,限制{x,y}即为若边x存在,则边y存在 建图,跑网络流即可#include<cstdio>#include<cstring>#in原创 2017-09-26 19:52:56 · 441 阅读 · 0 评论 -
bzoj 3195 奇怪的道路 状压dp
看范围,状压没毛病 但是如果随便连的话给开1<<16,乘上n,m就爆了 所以规定转移时只向回连边 于是想状态数组:f[i][j]表示到i这里i前K位的状态为j(表示奇偶) 发现有条数限制,但是n,m,2^K都比较小,加一维, f[i][j][k]表示前i位,用j条路,i前的K位状态为j 转移的话,因为1<=|u - v|<=K, 所以转移时必须要保证转移前一位能连到的最远距离是偶数原创 2017-07-28 18:02:43 · 423 阅读 · 0 评论 -
bzoj1059 [ZJOI2007]矩阵游戏
二分图匹配。发现:无论怎么交换,同一行的还是同一行,同一列的还是同一列的。所以直接建图,跑匈牙利就好了#include#include#include#include#include#define N 205using namespace std;int pp[N],n,T,g[N][N],cnt;bool bo[N];bool find(int x){ fo原创 2017-08-20 19:36:38 · 342 阅读 · 0 评论 -
bzoj 2820 莫比乌斯反演
搞了一整个晚自习,题解详见 hzwer Orz 目前感觉没有思路….还是要多切题#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<cmath>using namespace std;const int N=10000000;long long ans,f[N+5];int原创 2017-08-12 07:25:11 · 318 阅读 · 0 评论 -
bzoj 2005 能量采集 莫比乌斯反演
我们要求的是∑ni=1∑mj=1(2×gcd(i,j)−1)\sum_{i=1}^{n}\sum_{j=1}^{m}{(2\times gcd(i,j)-1)} 化简得2×∑ni=1∑mj=1gcd(i,j)−n×m2\times\sum_{i=1}^{n}\sum_{j=1}^{m}{gcd(i,j)}-n\times m 所以我们现在只需要求出∑ni=1∑mj=1gcd(i,j)\sum_{原创 2017-08-13 15:15:04 · 342 阅读 · 0 评论 -
bzoj 2653 middle 二分答案 主席树判定
判断中位数是否可行需要将当前的解作为分界,大于其的置为1,小于为-1,然后b-c必选,ab,cd可不选,这个用线段树判定就好但不能每次跑,所以套主席树,按权值排序,构建主席树,更新时将上一个节点改为-1,能保证以上结论#include#include#include#include#include#define N 20005using namespace std;int l原创 2017-08-05 11:46:20 · 276 阅读 · 0 评论 -
bzoj 2186 [Sdoi2008]沙拉公主的困惑 欧拉函数
n>=m,所以就变成了求ϕ(m!)∗n!/m!\phi(m!)*n!/m! 而ϕ(m!)=m!∗(p−1)/p......\phi(m!)=m!*(p-1)/p......p为m!的素因子,即为m内的所有素数,问题就转化为了求n!∗(p−1)/p......n!*(p-1)/p...... 只需要预处理出素数,阶乘,逆元即可#include<cstdio>#include<cstring>#原创 2017-08-13 07:21:50 · 240 阅读 · 0 评论 -
bzoj 3551 kruskal重构树dfs序上的主席树
强制在线kruskal重构树,每两点间的最大边权即为其lca的点权。倍增找,dfs序对应区间搞主席树#include#include#include#include#include#define N 100005#define M 500005using namespace std; int l[2*N],r[2*N],cnt,num_cnt,val[2*N],num原创 2017-08-05 08:36:12 · 273 阅读 · 0 评论 -
bzoj 2822 [AHOI2012]树屋阶梯 卡特兰数
因为规定n层的阶梯只能用n块木板 那么就需要考虑,多出来的一块木板往哪里放 考虑往直角处放置新的木板 不管怎样,只有多的木板一直扩展到斜边表面,才会是合法的新状态,发现,这样之后,整个n层阶梯就被分成了i层和n-1-i层的阶梯,即 f(n)=∑i=0n−1f(i)×f(n−1−i)f(n)=\sum_{i=0}^{n-1}{f(i)\times f(n-1-i)} 就是卡特兰数!!!,需要原创 2017-08-12 20:38:49 · 375 阅读 · 0 评论 -
bzoj 1485 [HNOI2009]有趣的数列 卡特兰数
把排好序的序列看成一对对括号,要把他们往原数列里塞,所以就是括号序合法方案数 即为卡特兰数 f(n)=Cn2nn+1f(n)=\frac{C_{2n}^n}{n+1} 求的时候为避免除法,可以O(n)计算每个素数出现次数,最后乘起来,打完之后发现其实根本不用快速幂……#include<cstdio>#include<cstring>#include<iostream>#include<a原创 2017-08-12 20:31:08 · 300 阅读 · 0 评论 -
bzoj 4173 打表???
没有任何思路,打表发现ans=phi(n)*phi(m)*n*m %%% popoqqq Orz 然而并没有看懂……#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<cmath>#define mod 998244353llusing namespace std;long原创 2017-08-12 17:11:10 · 346 阅读 · 0 评论 -
bzoj [Noi2002]Savage 扩展欧几里得
枚举m,n^2判断对于野人i,j,(H[i]+x*S[i])%m==(H[j]+x*S[j])%m,且x化简得:(S[i]-S[j])*x+y*m=C[j]-C[i],扩欧解x最小值,判断#include#include#include#include#include#define N 18using namespace std;int H[N],S[N],O[N],n,原创 2017-08-12 16:22:02 · 433 阅读 · 0 评论 -
bzoj 3505 [Cqoi2014]数三角形 组合
ans=所有的三点排列-共行的-共列的-斜着一条线的斜着的枚举每个点和原点的gcd,反过来也可以,还能左右,上下挪#include#include#include#include#includelong long ans,line,row,tot,n,m;int gcd(int x,int y){return y==0?x:gcd(y,x%y);}int main(){ s原创 2017-08-12 15:14:20 · 274 阅读 · 0 评论 -
bzoj 2510 弱题 矩阵乘
看题就像矩阵乘但是1000的数据无从下手打表发现每一行的数都是一样的,只不过是错位的,好像叫什么循环矩阵于是都可以转化为一行的,O(n3)->O(n2)*logk#include#include#include#include#includeusing namespace std;int n,m,k,yy[1005][1005];double ma[1005],A[100原创 2017-07-27 20:02:11 · 298 阅读 · 0 评论 -
拯救莫莉斯 状压dp
题目大意:每个点有费用,要求选出花费最少的一些点,使得全部点都满足:他被选或与他相邻的任意点被选。没看清数据范围233333和翻格子游戏一样,考虑上中下三行,可行才能转移f[i][j][k]表示到第i行i-1行状态为j,i行状态为k,且i行以前的所有行均满足条件f[i][j][k]------>f[i+1][k][l] j|k|l|(k>1) 覆盖所有棋子#include#原创 2017-08-07 06:12:51 · 479 阅读 · 0 评论 -
bzoj 1592 dp
就是dp啊f[i][j]表示到第i位,最后一位高度是j的最小花费转移::f[i][j]=minn(f[i-1][k])+abs(a[i]-num[j]);(k#include#include#include#include#include#includeusing namespace std;int f[2005][2005],n,a[2005],b[2005],nu原创 2017-08-07 06:28:45 · 422 阅读 · 0 评论 -
bzoj 4556 字符串
后缀数组,暴力硬跑 贼快#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<cmath>#define MAXN 100005using namespace std;int buc[MAXN],wa[MAXN],wb[MAXN];int r[MAXN],sa[MAXN],ran原创 2017-09-26 17:48:08 · 313 阅读 · 0 评论 -
[SCOI2005]栅栏 二分+dfs
这个题真的是太nb了,各种骚二分答案,肯定要减最小的mid个,从大往小搜每一个木板,从大往小枚举所用的木材当当前木材比最短的木板还短,就扔到垃圾堆里,并记录waste,当 waste+sum>tot 时,return#include#include#include#include#include#define N 2005using namespace std;int n原创 2017-09-17 15:21:36 · 372 阅读 · 0 评论 -
bzoj 3126 单调队列优化dp
能转移的最左是其左边完整区间的最右左端点,最右是能覆盖它的最左左端点-1#pragma GCC optimize ("O3")#include#include#include#include#include#define N 200005using namespace std;int l[N],r[N],n,m,f[N],q[N];int read(){ int a=0;c原创 2017-09-24 07:48:54 · 383 阅读 · 0 评论 -
bzoj 1901 主席树+树状数组
修改+查询第k小值单纯主席树修改会打乱所有,所以再套一个树状数组维护前缀和使得修改,查询都是log对了,bzoj上不需要读入组数,蜜汁re。。#include#include#include#include#includeusing namespace std;int n,m,sz,T,num_tot,num_cnt,num_l,num_r;int sum[8000005原创 2017-08-03 09:51:23 · 256 阅读 · 0 评论 -
8.27 题解
先%一发达哥 T1,其实不难,就是一个简单的dp+矩阵快速幂加个原根优化,其实是模意义之前没做过题,有点懵,一开始思路也光想数学了,就gg了…… 模意义下所有运算都和正常运算一样,只是除变成了乘逆元!! 定义状态数组f[i][j]表示第i步转移后模数为j的概率,矩阵乘优化,可得80分,正解是把每个数转化为p原根的i次方,别的都一样,会发现这样出来的是循环矩阵,复杂度降为O(logm*mod^2原创 2017-08-29 16:51:52 · 431 阅读 · 0 评论 -
[Usaco2005 dec]Layout 排队布局 差分约束
填坑… 差分约束一般是搞一个不等式组,求xn-x1的最大最小值什么的,求最大值就转化成xa<=xb+w这样的,然后建图跑最短路(这才是最终约束的),举个例子 x1<=x0+2x2<=x0+7x3<=x0+8x2<=x1+3x3<=x2+2 \begin{matrix} x1<=x0+2 \\ x2<=x0+7 \\ x3<=x0+8原创 2017-08-23 15:34:01 · 524 阅读 · 0 评论 -
bzoj2326 [HNOI2011]数学作业
矩阵乘,按位搞 两个矩阵,分别为 ans00i00100\begin{matrix} ans & i & 1 \\ 0 & 0 & 0 \\ 0 & 0 & 0 \\ \end{matrix} 10k11011001\begin{matrix} 10^k &0 & 0 \\ 1 & 1 & 0 \原创 2017-08-26 12:07:25 · 273 阅读 · 0 评论 -
bzoj 4565 状压区间dp
我还以为我状压很好。。。。。。 噗!!! 果然我区间很差。。。 f[i][j][s]表示i~j段,合并后的状态为s所得的最大收益 枚举i,j,k,s. f[i][j][s<<1]=max(f[i][j][s<<1],f[i][k−1][s]+f[k][j][0]) f[i][j][s<<1|1]=max(f[i][j][s<<1|1],f[i][k−1][s]+f[k][j][1])原创 2017-08-15 17:32:51 · 416 阅读 · 0 评论 -
bzoj3631[JLOI2014 松鼠的新家 倍增lca+差分
裸的树上差分+倍增lca每次从起点到终点左闭右开,这就有一个小技巧,要找到右端点向左端点走的第一步,然后差分就好了#include#include#include#include#include#define N 300005using namespace std;int fa[N][20],dep[N],f[N],g[N],n,l[N];int e=1,head[N];原创 2017-08-22 16:37:45 · 348 阅读 · 0 评论 -
bzoj 3239 poj 2417 BSGS
BSGS算法,预处理出ϕ(c)−−−−√\sqrt{\phi(c)}内的a的幂,每次再一块一块的往上找,转移时将b乘上逆元,哈希表里O(1)查询即可#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<cmath>#include<map>#define LL long longlo原创 2017-08-14 10:42:52 · 287 阅读 · 0 评论 -
bzoj 2242 [SDOI2011]计算器 快速幂+扩展欧几里得+BSGS
1:快速幂 2:exgcd 3:exbsgs,题里说是素数,但我打的普通bsgs就wa,exbsgs就A了......(map就是慢).....#include#include#include#include#include#include#define LL long longusing namespace std;map pp;map bo;LL a,b,c;原创 2017-08-15 06:30:22 · 503 阅读 · 0 评论 -
poj 3243 扩展BSGS
每次把gcd(a,c)提到前面,知道a,c互质,然后就是普通BSGS了#include#include#include#include#include#define LL long longusing namespace std;struct hashtable{ static const int N=577399; int tot,hash[N+10],key[N+5原创 2017-08-14 21:18:29 · 447 阅读 · 0 评论 -
[POI2007]洪水pow bfs
发现:只在所有自己的城市建水泵一定是最优解。所以对自己的城市按高度排序,该城市不用建的前提是从他出发经过一条高度都小于等于他的路径能到达一个已经修建水泵的sort+bfs......#include#include#include#include#include#define N 1005using namespace std;int dx[4]={-1,1,0,0},d原创 2017-08-21 15:59:17 · 332 阅读 · 0 评论 -
bzoj 1426 收集邮票
f[i]:当前已拥有i种邮票,还需要买的邮票数的期望值。g[i]:当前已拥有i种邮票,还需要的钱的期望值。每张邮票初始都是1元钱,每买一张邮票,还没购买的邮票每张都涨价1元。 f[i]=1+(n-i)/n*f[i+1]+i/n*f[i]--->>f[i]=f[i+1]+n/(n-i)g[i]=1+(n-i)/n*(g[i+1]+f[i+1])+i/n*(g[i]原创 2017-07-27 12:22:25 · 287 阅读 · 0 评论 -
bzoj 4129 Haruna’s Breakfast 树上莫队
按照dfs序分块,莫队乱搞再套个权值分块#include#include#include#include#include#define N 100005using namespace std; int e=1,head[N];struct edge{ int u,v,next;}ed[2*N];void add(int u,int v){ ed[e].原创 2017-07-27 12:15:13 · 245 阅读 · 0 评论 -
bzoj 2730 HNOI2012 矿场搭建 tarjan
tarjan求割点,每个点双如果不连割点,内部应建两个,连着一个割点,应建一个,连着多个,不用建#include#include#include#include#include#define N 1500using namespace std;int n,m,cnt,num,tot,ans1,cosmos,bo[N];long long ans2;int dfn[N],l原创 2017-08-10 21:47:57 · 327 阅读 · 0 评论 -
bzoj 3759 Hungergame 博弈论+线性基
和nim游戏类似易证必败状态为:当前打开的箱子中石子异或和为0,没打开的箱子中不存在一个子集满足异或和为0因为先手无论是取石子还是开箱子,后手都可以通过取石子来使状态变回原状态所以只需判定是否有子集异或和等于零即可#include#include#include#include#includeusing namespace std;int T,n,a[25];bo原创 2017-07-30 20:35:46 · 387 阅读 · 0 评论 -
bzoj 2002 弹飞绵羊 分块
正解lct,然而本蒟蒻并不会....分块思路很清晰,处理出每个点弹出所在块所需要的步数及出去后的第一个位置#include#include#include#include#define N 200005using namespace std;int n,m,nn,k[N],nxt[N],ned[N],be[N],tot;int opt,aa,bb,ans;void work(i原创 2017-07-09 21:46:39 · 254 阅读 · 0 评论 -
bzoj 4008 亚瑟王 期望概率dp
对于这种看起来就比较傻逼麻烦的题,最关键的就是想怎么巧妙的设置状态数组,使转移尽可能的简洁。一开始我想的是f[i][j]表示到第j轮第i张牌还没有被选的概率,后来发现转移起来特别坑爹,还会有重的或漏的情况。于是改变想法:f[i][j]表示考虑到前i张牌,还剩j轮的概率转移也就简单了,下一张牌有两种可能,选或不选:f[i+1][j]=f[i][j]*(1-p[i+1])^j f[原创 2017-07-09 17:28:19 · 365 阅读 · 0 评论 -
bzoj 1076 奖励关 状压+期望dp
因为每次选择都是有后效性的,直接dp肯定不行,所以需要逆推。f[i][j]表示从第i次开始,初始状态为j的期望收益#include#include#includeusing namespace std;int bit[18],K,n,aa,ned[18],a[18];double f[105][1<<17];int main(){ bit[0]=1; for(int i=原创 2017-07-09 19:47:39 · 314 阅读 · 0 评论 -
bzoj 1409 Password 矩阵快速幂+欧拉函数
可以发现,该数组的mi就是斐波那契数列所以要矩阵快速幂搞出第n位但是斐波那契数列上涨的很快,这就需要欧拉定理了p^phi(q)%q=1(gcd(p,q)==1)p是素数,所以可以用然后需要5000个数的phi,q筛出sqrt(2^31)范围内的素数,然后直接找单个数的欧拉函数就好了最后再套个快速幂就A了#include#include#include#in原创 2017-07-30 14:30:20 · 374 阅读 · 0 评论 -
bzoj 1189 紧急疏散 网络流
二分答案,网络流判断将每个门拆点,每个人连向每个门的dis~当前解然后跑最大流,如果等于人数,即为可行解#include#include#include#include#include#include#define pa pair#define N 405#define inf 0x7fffffffusing namespace std;int n,m,p,per=原创 2017-07-29 21:20:52 · 587 阅读 · 0 评论 -
bzoj 3319 黑白树
暴力大法好!!!!!纯暴力修改+查询。此题数据卡所有正解,就是不卡暴力(经测试,在每点1s下,几乎所有正解都T了)暴力压正解。。。原创 2017-07-15 14:32:43 · 386 阅读 · 0 评论 -
bzoj 2724 蒲公英 分块
分块,预处理出每两个块范围内的众数,然后在暴力枚举块外的进行比较那么怎么知道每一个数出现的次数呢?离散后,对于每一个数,维护一个动态数组就好了#include#include#include#include#include#include#include#define N 40005using namespace std;int a[N],be[N],n,m,nn,cnt原创 2017-07-15 12:50:12 · 268 阅读 · 0 评论