自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 [2017纪中11-9]玩游戏 最短路数+LCA

题面 考虑这样定义的最短路对应的最短路树恰好是最小生成树。因为add操作不多,每次暴力重构最短路树,询问的时候跑lca即可。复杂度O(n^2logn)。 代码:#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#define ll long longusing namespace std;in

2017-11-10 15:39:01 413

原创 [2017纪中11-9]道路重建 点双连通分量+树的直径

题面 考虑缩点双连通分量,缩点之后成为一棵树,那么加一条边(x,y)可以使得原树上x到y的路径上的所有边变得不危险,于是跑个树直径即可。 代码:#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int maxn=200010;int n,m,tim,top,nc,dfn[maxn],

2017-11-10 15:24:47 294

原创 [2017纪中11-9]乘积 数论+分组背包

题面 70分显然可以状压每个数分解质因数的情况,DP即可。 正解:考虑一个<=n的数最多有一个>=sqrt(n)的质因子,我们按这个大质因子相同的数分在一组,显然一组中最多选一个,<=sqrt(n)的质因子只有8个,状压即可。f[i][j][s]表示前i组选了j个数,当前乘积分解质因数为s的答案,转移即可。 代码:#include<iostream>#include<cstdio>#inc

2017-11-10 15:20:54 323

原创 [2017纪中11-8]好文章 字符串hash+STL

题面 多hash+map防卡就是了。 详细的卡hash方法 代码:#include<iostream>#include<cstdio>#include<cstring>#include<map>#define ll long longusing namespace std;const int maxn=200010;int n,m,mod[10]={1000000007,1000

2017-11-10 15:16:50 262

原创 [2017纪中11-8]购物 贪心+优先队列

题面 这题有点像samjia2000出的三元组。。。 考虑把物品按Qi从小到大排序,那么一定有一个分界点,使得在这个点之前的物品要么买Pi要么买Qi,这个点之后的物品要么买Pi,要么不买(可以想象一下如果之前有一个x不买,之后有一个买Qy,买Qx不买y一定更优)。 于是设s[i]为使用至多k张优惠券买下1~i所有物品(或Pi或Qi)最少需要的钱(经典的二元组问题,强制选某一种然后把两者之差扔进

2017-11-10 15:14:11 352

原创 [2017纪中11-6]奇怪的队列 树状数组+二分/线段树

题面 考虑先按高度排序,那么第i位置的人一共有n-i个人比他高,为了方便,这个人报的数字t=min(t,n-i-t)。 那么从小到大把这些人放进序列里。每次放在当前序列t的位置上,然后把这个位置删除即可。 可以用树状数组+二分搞。复杂度O(nlog^2n)。 线段树正解 nlog^2n代码:#include<iostream>#include<cstdio>#include<algor

2017-11-07 15:10:15 464

原创 [2017纪中11-6]拆网线 树型DP/二分图匹配

题面 首先考虑到,把企鹅分成若干对,每一对的两只企鹅共用一条网线是最优的。变成一个树上的二分图匹配问题,每条边有2的贡献。 但并不一定每个企鹅都能被匹配,但因为是树是一个联通的二分图,未能匹配的点必定连着一个已经匹配的点,这样每条边只有1的贡献。 假如企鹅是奇数个,也必定要花1的代价把它连进去。 于是f[x][0/1]表示以x为根的子树中,x未被匹配/已被匹配的最大匹配数。树型DP即可。

2017-11-07 14:51:18 376

原创 [2017纪中11-5]仔细的检查 树hash

题面 树hash裸题。 正确姿势貌似是找重心,然后每次计算x点的hash值要把其子树的hash值排序之后再像字符串那样hash,最后融进自己的一些信息去。 我则是乱搞,每个点的hash值是其儿子的hash值的和+R(size[x],num[x])(关于其子树大小和儿子个数的一个函数,千万不要是一次的。。。)这样就可以O(1)换根啦。 找到一个相同的根,两个再一起跑一边DFS就可以啦。 代码

2017-11-05 21:38:01 271

原创 [2017纪中11-5]好路线 DP

方差好像之和平方和以及和的平方有关。 化式子得到(n+m-1)*平方和-和的平方。 因为和的值域很小,于是f[i][j][k]表示走到(i,j)和为k是最小的平方和,直接DP即可。 代码:#include<iostream>#include<cstdio>#include<cstring>#define chkmin(a,b) a=min(a,b)#define R(a) (a)*(a

2017-11-05 21:27:24 293

原创 [2017纪中11-5]轰炸 强联通分量+DAG最长路

题面 读清题。。。 考虑一个强联通分量,两两互相可达,那么轰炸掉这个强联通分量至少需要其中点的个数轮。 考虑一条路径,轰炸一条路径需要它的长度轮。 于是tarjan缩点在拓扑排序一下跑一个DAG最长路即可。 代码:#include<iostream>#include<cstdio>using namespace std;const int maxn=1000010;int n,m,

2017-11-05 21:21:12 334

原创 [2017纪中11-4][ARC071]F-neutral DP

题面 首先考虑假如填了连续的两个数a,b均>=2,那么后面的数一定全是b。先暂时不考虑这种情况。 考虑假如填了一个>=2的数a,那么后面a个数都必须填1,之后才能自由填,于是设计状态f[i]表示从i开始可以自由填的方案数。那么假设上一个自由填>=2的数是d,那么f[i]+=f[i-d-1],假如上一个自由填的是1,f[i]+=f[i-1],总之不能转移i-2就是了。 但考虑到有一些>=2的a使

2017-11-05 21:12:28 613

原创 [2017纪中11-4][Codeforces Round #395 Div.1]C pacifist

题面 坑待填。

2017-11-05 21:01:51 272

原创 [2017纪中11-3]机房比教室好多了 博弈+树型DP

题面 先考虑出发点在x,先手玩以x为根这棵子树的答案。 首先不难证明,a[x]变大,不会变得更劣。 那我们考虑先手拿完一个石头后走向一个a[son]>=a[x]的儿子,这样肯定是不明智的,因为假如对手把你推回x,你当然不能和他一直这样推来推去(你肯定先死),所以你会选择去别的儿子,但这当然不如一开始就去别的儿子(因为a[x]更大)。 再考虑先手拿完一个石头后走向一个a[son]#includ

2017-11-03 21:31:12 353

原创 [2017纪中11-3][ARC069-F]高考是不可能高考的 2-sat+线段树优化建图

题面 原题 首先考虑二分答案k,验证就可以用2-sat。假如要选某一个x[i],那么x[i]左右距离k的区间内的点都不能选,于是这些点都必须选另一半;y[i]同理。 由于边数太多,直接建图是不可接受的,考虑到不能选的点都在一个区间内,于是把所有x[i],y[i]排序,开一棵线段树,x的位置存y的点编号,y的位置存x的点编号(因为要连另一半嘛),建边时向线段树上节点连,线段树从根往叶子连边,边数

2017-11-03 21:04:10 877

原创 [2017纪中11-2]失格 最小生成树+数论

题面 正解 考场100pts乱搞做法: 首先先去重。 最小生成树从小到大加进边去是没有问题的,于是考虑枚举边长(余数)k,再枚举数a[i],再枚举倍数j,如果a[i]*j+k存在,则连一条边长为k的边,直到合并成数为止。 复杂度O(maxk*nlogP),不知道为什么跑得飞快,比O(nlogP)的正解跑的还快,貌似maxk *n大概是P级别的,此消彼长的那种。。。再加上常数小吧。。。加上x

2017-11-02 20:01:50 319

原创 [2017纪中11-2]救赎 dfs序+树状数组 / 递推

题面 考场O(nlogn)做法: 对于一棵有根树,考虑每个点和它的儿子们的那些边的期望,容易得出答案为: 假如建出来的树以1为根,计算出子树大小sz和儿子个数num,那么考虑一个点对不同点为根节点的答案的贡献: 1、根节点不在它的子树中,上式size=sz[x],|son|=num[x]。 2、根节点为它自己,上式size=n,|son|=num[x]+1。 3、根节点在它的某个儿子p的

2017-11-02 19:29:35 331

原创 [2017纪中11-2]字典序 拓扑排序+优先队列

题面 拓扑排序的时候每次取出最小点就是了。。。 代码:#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<queue>#include<vector>using namespace std;const int maxn=100010;int n,m,rd[maxn],ans[

2017-11-02 19:13:13 643

原创 [2017纪中11-1]荒诞 欧拉序+状压DP

题面 题解 太巧妙了。。。图上还能DP。。。 代码:#include<iostream>#include<cstdio>#include<cstring>#define chkmin(a,b) a=min(a,b)using namespace std;const int maxn=100010;int n,m,c[maxn],d[maxn],f[12][60000],ans=0,

2017-11-02 15:33:11 433

原创 [2017纪中11-1]序列 搜索+IDA*

题面 每次将 n 翻转到 x1 再翻转到 xn,可以得到一个不超过2n-2 步的做法。由于步数不多,我们可以使用迭代加深搜索。 我们发现每次翻转只会改变一对相邻数对,因此对于一个状态求出相差>1 的相邻数对的数量,剩余步数一定大于这个值。加上这个剪枝就能通过本题。 代码:#include<iostream>#include<cstdio>#include<cstring>#includ

2017-11-02 15:20:45 295

原创 [2017纪中11-1]背包 二分

题面 先考虑数据随机。先把物品排好序,每次二分出买的那个价格最大的物品,因为数据随机,买不了多少个就没钱了。 但构造的数据可以卡,于是考虑预处理一个价格前缀和,每次像之前一样二分出能卖的右端点R,然后在二分一个能取走的最长区间[L,R],一次把他们去玩。可以证明这样复杂度是O(nlog^2n)的,因为每次剩下的钱至少变成原来的一半。设钱数为M,[L,R]的价格和于M-C,假设M-C>M/2,那么

2017-11-02 15:13:38 332

原创 [BZOJ4488][JSOI2015]最大公约数 DP+STL

一个数的约数大概是log级的,那么右端点确定的若干区间的gcd最多也只有log种。显然,右端点确定时,随着左端点递增,gcd是不降的。 从左往右DP,对于每种以当前点为右端点的区间gcd的取值,记录左端点最左可以延伸到哪。用map搞个映射就好了。复杂度O(nlog^2n) 代码:#include<iostream>#include<cstdio>#include<cstring>#incl

2017-11-01 07:58:09 631

原创 [BZOJ4870][SHOI2017]组合数问题 DP+矩阵快速幂

考虑这个式子的组合意义,表示从nk个物品中选取mod k=r个物品。递推式很显然咯,f[i][j]=f[i-1][j]+f[i-1][(j-1)%k]。矩阵快速幂加速一下就好了。 WA点:转移矩阵第i行是第j列和(j-1)%k列为一,所以第0行是第0列和k-1列,特别地,当k=1时,1*1矩阵中那个唯一的数应该是2,因为加了两次。 代码:#include<iostream>#include<c

2017-11-01 07:53:13 402

空空如也

空空如也

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

TA关注的人

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