自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 bzoj 1801 [Ahoi2009]chess 中国象棋 dp

要求就是每行每列个数<=2 设f[i][j][k]f[i][j][k] 表示到第i行,有j列有0个,k列没有的方案数。 然后当前行可以放一个或两个。#include <bits/stdc++.h>using namespace std;#define N 110#define mod 9999973#define ll long longint n,m;int f[N][N][N],

2016-11-30 21:04:37 249

原创 bzoj 1778 [Usaco2010 Hol]Dotp 驱逐猪猡 高斯消元

设f[i]f[i] 表示到i点的期望次数,mp[i][j]mp[i][j] 表示i,j之间的边数,du[i]du[i] 表示点i的度数。 那么f[i]=∑f[j]∗(1−PQ)∗mp[i][j]du[j]+[i==1]f[i]=\sum{f[j]*(1-\frac{P}{Q})*\frac{mp[i][j]}{du[j]}}+[i==1] 高斯消元解出f。设sum=∑f[i]sum=\sum{f

2016-11-30 20:36:39 567

原创 bzoj 1563 [NOI2009]诗人小G 四边形不等式 决策单调dp

正常转移f[i]=max(f[i′]+(L−(sum[i]−sum[i′]+i−i′−1))p)f[i]=max(f[i']+(L-(sum[i]-sum[i']+i-i'-1))^p) 这个东西好像满足四边形不等式。因此决策单调。 设g[i]表示点i的决策区间的左端点。 cal(i,j)表示用i更新j的答案。 维护一个g[i]单调递增的队列,每次把决策区间在当前点之前的队首扔掉。然后用队首

2016-11-30 19:45:45 406

原创 bzoj 1512 [POI2006]Pro-Professor Szu tarjan dp

先tarjan缩点,然后拓扑dp。 似乎有一些细节。。。#include <bits/stdc++.h>using namespace std;#define N 1000010#define inf 36501int n,m,tot,top,cnt,scc,ans;int head[N],nex[N],to[N];int deep[N],low[N],st[N],bel[N];bo

2016-11-29 16:40:05 492

原创 bzoj 1505 [NOI2004]小H的小屋 dp

设g[i][j]g[i][j] 表示下面长度为i的一段放j个的最小花费。 那么g[i][j]=k2∗(i/j+1)2∗(i%j)+k2∗(i/j)2∗(j−i%j)g[i][j]=k2*(i/j+1)^2*(i\%j)+k2*(i/j)^2*(j-i\%j) (使所有尽量相等时花费最小)设f[i][j][k]f[i][j][k] 表示到i,上面有j个矩形,下面有k个矩形的最小花费。 然后转移时

2016-11-29 13:49:40 480

原创 bzoj 1484 [HNOI2009]通往城堡之路 贪心

感觉这题还是挺迷的。。。 并不会证这个玩意为什么是对的。。。固定第一个点的值,其他点的值取a[i]-(i-1)*d(这个点能取的最小值) 然后每次找一个后缀,把这个后缀所有数加一个大于0的值,且保证这是最优的取法下加的尽量大的值。 由于每次把一个数加到最值所以复杂度是O(n2)O(n^2)的。#include <bits/stdc++.h>using namespace std;#defi

2016-11-28 20:34:37 484

原创 bzoj 1481 Navigation Game 决策单调dp

设f[i][j][k(0/1)]f[i][j][k(0/1)] 表示现在在点(i,j),在第i行只走了j一个点,经过的′F′'F'个数奇偶性为k时最少时间。 设l[i][j(0/1)][k(0/1)]l[i][j(0/1)][k(0/1)] 表示在当前行,从i左边的点t出发,经过j个′F′'F',由f[pre][t][k]f[pre][t][k] 更新来的最小时间。 设r[i][j(0/1)][

2016-11-25 20:28:10 232

原创 bzoj 1419 概率dp

设f[i][j]表示剩i张R,j张B的期望最大收益。#include <bits/stdc++.h>using namespace std;int n,m;double f[2][5100];int main(){ //freopen("tt.in","r",stdin); scanf("%d%d",&n,&m); for(int i=0;i<=n;i++)

2016-11-25 10:55:53 251

原创 bzoj 1415 [Noi2005]聪聪和可可 概率dp

先dijkstra跑出两点间最短路。 g[i][j]g[i][j]表示猫在i,老鼠在j时猫下一步走到的位置。 f[i][j]f[i][j] 表示猫在i,老鼠在j时的期望步数。 f[i][j]f[i][j] 按i到j最短路从小到大转移。#include <bits/stdc++.h>using namespace std;#define N 1100int n,m,S,T,tot,cnt;

2016-11-25 10:40:00 289

原创 bzoj 1413 [ZJOI2009]取石子游戏 博弈论 dp

果然浙江出神题呀。。。首先有这么一个结论:对于一段区间的石子,在这段区间左侧放一堆石子(个数可以为0)有且仅有一个石子个数使得到的状态为先手必败态。1.因为如果有一种以上的个数,假设有x,y(x<y)x,y(x<y)两个数是先手必败态,那么可以从y转移到x。因此一定小于等于一种。 2.如果没有石子个数为先手必败态,那么每一个必胜态对应转移到的必败态一定是在右侧选一些石子,由于有无穷多个必胜态因此一

2016-11-25 09:40:50 1700 1

原创 bzoj 1296 [SCOI2009]粉刷匠 dp

设g[i][j][k]表示第i个串前j位刷k次最多的正确格子。 设f[i][j]表示前i个串刷j次最多的正确格子。 第一次没有看见一个格子只能被刷一次。。。#include <bits/stdc++.h>using namespace std;int n,m,K,ans;char s[51];int sum[51][51][2],g[51][51][51],f[51][2600];vo

2016-11-24 18:54:11 265

原创 bzoj 1226 [SDOI2009]学校食堂Dining 状压dp

设f[i][j][k]表示当前最早的没打饭的人为i,i后面的7个人打过的状态为j,上一个打饭的人为i+k的方案数。 不过需要注意上一个打的人和当前人的差最大是8。。。 然后转移时可能是后面的人打饭或当前人打饭。 注意判一下状态非法。。。#include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#incl

2016-11-24 16:03:17 363

原创 bzoj 1087 [SCOI2005]互不侵犯King 状压dp

sb状压,输int错了一次,没救了。。。#include <bits/stdc++.h>using namespace std;#define ll long long#define N (1<<9)+10int n,m;bool g[N][N];ll f[11][110][N],ans;int num[N];int check(int x,int y){ for(int

2016-11-24 13:27:43 273

原创 bzoj 1080 [SCOI2008]劣质编码 最短路

这题可以用一种迷之暴力水过,不过并不知道复杂度,听说跑的挺快的。。。 算了,说正解。。。 当要求有两种解码方式时可以这样做: 把两个串中长的那个当成模板串,短的那个当成匹配串。 设f[i][j]f[i][j] 表示模板串当前为i,匹配串匹配到j,模板串的最短长度。 然后枚举匹配串下一个接哪个串,如果接完后比模板串长那么互换两个串。 这两个串必须从开始时就接不同的串。然后三个串的情况。一个

2016-11-24 12:30:53 1015

原创 bzoj 1079 [SCOI2008]着色方案 dp

设f[][][][][][]表示剩余个数为1~5的颜色的种类数和上次选的颜色的剩余个数。#include <bits/stdc++.h>using namespace std;#define mod 1000000007#define ll long longll f[16][16][16][16][16][6],num[6];bool vis[16][16][16][16][16][6]

2016-11-23 18:38:40 324

原创 bzoj 1040 [ZJOI2008]骑士 基环树 dp

这是一个基环树森林。 对于每块,对于环上的每一棵树设f[i][0/1]表示选/不选点i,i子树中的最大收益。 对于每个环设g[i][0/1][0/1]表示第一个点选/不选,第i个点选/不选的最大收益。 然后把每个基环树的收益加和就是答案。#include <bits/stdc++.h>using namespace std;#define ll long long#define N 11

2016-11-23 15:37:09 468

原创 bzoj1039 [ZJOI2008]无序运动Movement AC自动机 计算几何

对于平移,旋转,放缩,由于任意相邻两线段呈夹角不变,长度比例不变。因此只需要判断相邻两线段长度比例和夹角不变。 夹角可以用叉积和点积的比值以及符号确定。 注意必须保留两个符号。 然后可以用AC自动机计算,每个点的答案是这个点fail树子树中的点被长串经过的次数和。对于翻转操作只需把长的串翻转再做一遍。 注意判断翻转不变的串和长度小于3的串。#include <bits/stdc++.h>u

2016-11-23 14:49:03 989

原创 bzoj3531 [Sdoi2014]旅行 树链剖分 线段树

先树剖,然后对于每个值开一个动态开点的线段树。#include <bits/stdc++.h>using namespace std;#define N 110000#define M 11000000#define ls l,mid,ch[now][0]#define rs mid+1,r,ch[now][1]int n,q,tot,cnt;int w[N],c[N],head[N]

2016-11-22 20:34:43 357

原创 hdu5307 He is Flying FFT

处理一个前缀和,那么ans[x]=∑sum[i]−sum[j]=xi−jans[x]=\sum_{sum[i]-sum[j]=x}{i-j} 然后sum[i]−sum[j]sum[i]-sum[j]可以当成卷积做,不过由于FFT只支持乘法,因此可以先做一遍关于i的,再做一遍关于j的,然后相减。 注意0的情况。。。#include <bits/stdc++.h>using namespace s

2016-11-22 18:29:26 472

原创 SRM 551 Div1

noip d2t3 没清数组实力滚粗,赶紧做一波SRM 冷静一下。。。。250pts最终答案里至少有一个点没改变位置。因此枚举没改变位置的点,然后把两边和他同色的点移过来的花费排个序,从小到大往里加,直到超过最大花费,更新一下答案。#include <bits/stdc++.h>using namespace std;int n,top,cnt,sum,ans;int st[110];cla

2016-11-22 14:42:54 434

原创 bzoj 4296 [PA2015]Mistrzostwa 宽搜 并查集

先将所有度数小于d的点推入队列,然后把这些点相连的点度数-1,如果一个没入队过的点度数-1后度数小于d,那么把这个点入队。 然后找没入队过的点形成的最大连通块就是答案。#include <bits/stdc++.h>using namespace std;#define N 210000int n,m,d,tot,pos;int head[N],nex[N<<1],to[N<<1];in

2016-11-18 13:19:58 277

原创 bzoj 4295 [PA2015]Hazard 单调队列

对于每个人,他选的点为:x%m , (x+n)%m , (x+2n)%m …. (x+kn)%m会形成一个环。所有环的和为m。可能有一些人在一个环里对于一个人,如果求出这个人在走的过程中经历的最小值和走一个循环值的变化,就可以求出这个人走了多少个循环和走这些环后的剩余值。如果求出这个人之后到达每一个值需要的最小步数就可以求出在走完环之后又走了多少步。走一个循环值的变化可以直接求。 维护一个前缀和。

2016-11-18 12:41:34 546

原创 bzoj 4294 [PA2015]Fibonacci 数学

斐波那契取模10x10^x的循环节是6∗10x6*10^x(别问我怎么证。。。) 求第x项取模可以矩乘。 因此可以深搜枚举每一位然后验证减枝。#include <bits/stdc++.h>using namespace std;#define ull unsigned long longchar s[21];int n;ull ten[21],v,mod;ull mul(ull x

2016-11-17 18:36:24 461

原创 bzoj 3060 [Poi2012]Tour de Byteotia 并查集

并查集先把两个端点大于K的所有边加进去,然后在不产生新的环的情况下加入剩下的边,没了。。。。 感觉poi2012比13,14,15的水多了呀。。。#include <bits/stdc++.h>using namespace std;#define N 2100000int n,m,K,ans;int a[N],b[N],fa[N];int find(int x){return x==f

2016-11-16 15:38:05 263

原创 bzoj 2803 [Poi2012]Prefixuffix hash

设满足条件的两段为: 1~j , n-j+1~n。其中1~i和n-i+1~n相等,i+1~j和n-j+1~n-i相等。 那么从大到小枚举i,如果1~i和n-i+1~n相等,那么就是求最大的j使 i+1~i+j和n-i-j+1~n-i+1相等。设此时的j为f[i]。那么有f[i]<=f[i+1]+2。那么类似后缀数组求h的过程求一下f就行了。#include <bits/stdc++.h>usi

2016-11-16 14:51:22 247

原创 bzoj 2799 [Poi2012]Salaries 贪心

感觉自己语文水平捉鸡,粘一下吴大爷的题解吧。。。 “ 我们维护以每一个节点为根的子树内部有多少个没有确定权值的点,另外,我们利用一个数组维护每个权值已经给了哪个节点. 我们从小到大遍历每个权值,若这个权值当前并没有确定给哪个节点,则将其压入栈中;否则我们在对应节点的子树中进行一系列确定操作: 我们维护栈中有多少个权值,以及有多少个自由权值.(这个是什么一会再说) 若未确定的节点数正好等于当

2016-11-16 10:05:44 488

原创 bzoj 2798 [Poi2012]Bidding 博弈论 dp

第一个操作相当于一个把n减少后的子问题。 因此记录状态f[i][j][k]表示当前n为i,x为2j∗3k2^j*3^k 是否是必胜状态。 想吐槽这题tm为什么出成交互呀???不会改那个交互库只好cheat一下。。。bz AC代码,请自行去注释。#include <bitset>#include <stdio.h>#include <string.h>#include <algorithm>

2016-11-15 19:20:23 393

原创 bzoj 2797 [Poi2012]Squarks set 数学

把n*(n-1)/2个数从小到大排序,最小的和次小一定是x1+x2和x1+x3。x2+x3一定在第三个到第n个之间。并且不能确定x2+x3和x1+xi的大小关系。那么枚举x2+x3就可以计算x1,x2,x3。然后去掉x1+x2,x1+x3,x2+x3后最小的就是x1+x4。这样可以求出x4。同理去掉x4和x1,x2,x3的和后最小的是x1+x5。以此类推。这个东西可以用set维护#include <

2016-11-15 14:37:17 376

原创 bzoj 2795 [Poi2012]A Horrible Poem hash

如果直接枚举长度的约数,hash判断s[l~r-len]和s[l+len~r]是否相等是O(qn√)O(q\sqrt{n}) 的。 由于最后答案的段数对于每个质因子是独立的,所以先把素数筛出来,然后判断每个质因子是否可行,如果可行就将答案的段数乘上这个质因子,就可以把复杂度除log#include <bits/stdc++.h>using namespace std;#define N 510

2016-11-15 14:29:47 260

原创 bzoj 2794 [Poi2012]Cloakroom dp

一开始写了个线段树,每个节点维护个背包,然后发现查询时没法合并,就gg了。先把所有点按m和a[i]排序。然后就是支持添加物品,询问能组成k的b[i]的最小值最大。然后直接dp就好了。#include <bits/stdc++.h>using namespace std;#define N 1100#define M 1100000#define A 100000#define ls l,m

2016-11-15 09:45:50 291

原创 bzoj 2793 [Poi2012]Vouchers 调和级数求和

就是维护一下每个值现在取到几。复杂度调和级数求和nlogn#include <bits/stdc++.h>using namespace std;#define N 1100000#define ll long longint n,m,mx,top;int a[N],pos[N];ll now,bel[N],st[N];int main(){ //freopen("tt.in

2016-11-14 20:25:32 357

原创 bzoj 2792 [Poi2012]Well 单调队列 二分

二分答案,先求一个满足相邻两项之差不大于答案时每个位置的最大值b[i]。 设当前位置为i,二分的答案为x,那么需要满足对于j∈[1,n]j\in[1,n]b[i]=min(a[j]+|i−j|∗x)b[i]=min(a[j]+|i-j|*x) 对于j<ij<i直接维护最小值,对于j>ij>i用单调队列。 然后枚举0的位置,那么受影响区间的左右端点都单调。 求一个前缀和后可以O(1)O(1)计

2016-11-14 19:31:13 268

原创 bzoj 2791 [Poi2012]Rendezvous 倍增lca 基环树

这是一个基环内向树森林。两个点如果在一个子树中,直接倍增lca。 否则两个点先走到环上,然后一个点不动,另一个点走到这个点。#include <bits/stdc++.h>using namespace std;#define N 510000int n,q,top,cnt;int fa[N][21];int vis[N],st[N],inc[N],root[N],deep[N];in

2016-11-14 17:43:45 638

原创 bzoj 2790 [Poi2012]Distance 数学

设d[i]为i的质因子个数(相同算多个)。那么i和j的答案就是d[a[i]gcd(a[i],a[j])]+d[a[j]gcd(a[i],a[j])]d[\frac{a[i]}{gcd(a[i],a[j])}]+d[\frac{a[j]}{gcd(a[i],a[j])}] 然后枚举gcd,对于有当前枚举的gcd的因子的数,维护这些数d[a[i]gcd]d[\frac{a[i]}{gcd}] 的最小值

2016-11-14 15:39:42 296

原创 bzoj 2789 [Poi2012]Letters 树状数组

第i次将A中大于等于i的第一个等于bi的位置换到第i个。 维护一下A中每个点往后第一个和他相等的字符。用树状数组维护每个点当前的排名。#include <bits/stdc++.h>using namespace std;#define N 1100000#define ll long longint n;char s1[N],s2[N];int tr[N],nex[N],pos[26

2016-11-14 12:21:39 337

原创 bzoj 2788 [Poi2012]Festival tarjan+floyd+差分约束

先把这个东西建成差分约束。 跑一遍floyd,如果有负环一定无解。 用tarjan缩点,由于缩完点是一个拓扑图,所以每个强连通分量中的取值是互不影响的(因为可以把拓扑序大的强连通分量中的值无限减少)。所以可以将每个强连通分量的答案相加。然后对于一个强连通分量的答案是这个强连通分量中的点两两之间最长路的最大值+1。 因为所有权值都是0,1,-1,因此从最小值到最大值的所有值都会取到。由于从最小值

2016-11-14 11:14:47 433

原创 bzoj 1573 [Usaco2009 Open]牛绣花cowemb 计算几何 树状数组

先计算几何求每条线在圆上的交点。 然后将两个交点按极角序对应到[l,r]一段区间。那么答案就是求有多少相交区间。按左端点排序离线树状数组扫一遍就行了。#include <bits/stdc++.h>using namespace std;#define N 51000double d;int n,top,ans,cnt;int tr[N<<1];double st[N<<1];str

2016-11-11 14:56:15 513

原创 bzoj 1229: [USACO2008 Nov]toy 玩具 三分+贪心

1229: [USACO2008 Nov]toy 玩具听说这个东西满足三分,并不知道为什么。。。 三分需要新买多少,然后贪心:优先选新买的没有用过的,然后选慢洗的,然后选快洗的。 按时间维护一个队列,每次将当前时间-快洗时间的加入队首。#include <bits/stdc++.h>using namespace std;#define N 110000#define MP(x,y) ma

2016-11-11 14:55:23 644

原创 SRM 553 Div1

250pts把那个东西当成一个变量带进去,单独考虑0的情况。#include <bits/stdc++.h>using namespace std;#define ll long longstruct node{ ll x,y; node(){} node(ll x,ll y):x(x),y(y){} friend node operator + (const

2016-11-10 20:52:21 550

原创 SRM 552 Div1

250pts答案就是min(Rn∗(n+1)/6,Gn∗(n+1)/6,Bn∗(n+1)/6,R+G+Bn∗(n+1)/2)min(\frac{R}{n*(n+1)/6},\frac{G}{n*(n+1)/6},\frac{B}{n*(n+1)/6},\frac{R+G+B}{n*(n+1)/2})#include <bits/stdc++.h>using namespace std;#defi

2016-11-10 14:34:45 275

空空如也

空空如也

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

TA关注的人

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