自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

CE玩家

人生最大的快乐,就是做别人说你做不到的事。

  • 博客(422)
  • 收藏
  • 关注

原创 [几何 区间DP] Codeforces 438C & 437E. The Child and Polygon

题目是求三角剖分个数令 fi,jf_{i,j} 表示 i∼ji\sim j 这些点组成的多边形的三角剖分方案数我们找到一个点 kk,让 i,j,ki,j,k 形成一个三角形,那么 fi,j=∑fi,k×fk,jf_{i,j}=\sum f_{i,k}\times f_{k,j}那么让 kk 在向量 ij→\vec{i j} 的顺时针方向或逆时针方向就不会有重复且合法了#include <cstdio

2017-10-26 10:58:58 433

原创 [交互] Codeforces Gym101190 NEERC2016I. Indiana Jones and the Uniform Cave

题目要求我们遍历一遍图可以用石子的三种状态表示这个点的状态(Center未访问、Right在栈中、Left不在栈中)从一个点开始遍历,把石子放在当前遍历的边的Right,如果没访问到的点没访问过就继续。如果访问到的点在栈中,那么我们就沿着石子的那条边走,顺便把石子放在Left,这样走到的第一个石子在Left的点说明我们走回去了,记一下之前走了几步,再走一遍就来了如果不在栈中,那么一直沿着石子走,走到

2017-10-25 07:33:01 656

原创 [欧拉回路 最小生成树] UOJ#236 -- IOI2016. railroad

对每个速度建一个点,ss 向 tt 连一条边,那么就是要再加一些边使得能走过所有边。加一条 inf\inf 到 11 的边,题目就转换为求最小代价使图变成欧拉图考虑这样一个区间 [i,i+1][i,i+1] , 只有满足 s≤i,t≥i+1s\le i,t\ge i+1 的边与满足 t≤i,s≥i+1t\le i ,s\ge i +1 的边的个数相同时图才可能是欧拉图。令 gig_i 等于第一种边的

2017-10-24 17:07:17 807

原创 [模拟费用流] Codeforces Gym101190 NEERC2016M. Mole Tunnels

可以费用流建图。但是数据范围太大,那么记一下每个点相连的反向边的流量。枚举lca就相当于模拟费用流找一条最短的增广路树高log,复杂度就是 O(nlogn)O(n\log n )#include <cstdio>#include <iostream>#include <algorithm>using namespace std;typedef long long ll;const int N=1

2017-10-24 15:38:03 477

原创 [数学] Codechef September Challenge 2017 Weasel does Xor on Tree

令 fi,jf_{i,j} 表示时间为 ii 的时候,jj 点的权值那么 fi,u=XOR{fi−1,v|v∈sonu}f_{i,u}=\text{XOR}\{f_{i-1,v}|v\in son_u\}fi−1,vf_{i-1,v} 用 fi−1,v′f_{i-1,v'} 带入不断展开就可以得到 fx,1=XOR{ai∗f0,i}f_{x,1}=\text{XOR}\{a_i*f_{0,i}\}

2017-10-24 13:38:02 575

原创 [xor最小生成树 分治 字典树合并] BNUOJ52318 Be Friends

二进制从高到低分治,当前分治到第 ii 位那么肯定是把第 ii 位为0的放一起,为1的放一起,这两块分别成一个联通块,然后之间连一条边是最优的两块分治下去。找最小边的话一边建字典树,另一边的数在字典树上找#include <cstdio>#include <iostream>#include <algorithm>using namespace std;const int N=100010;ty

2017-10-23 20:06:40 505

原创 [博弈] Codeforces Gym101190 NEERC2016G. Game on Graph

有向图博弈Manchery题解#include <cstdio>#include <iostream>#include <algorithm>#include <queue>#include <cstring>using namespace std;typedef pair<int,int> par;const int N=100010;int n,m,cnt,G[N],du[N],idu[

2017-10-23 20:05:21 462

原创 [GCD最大生成树 LCT] HDU5398 .GCD TREE

可以发现只要保留边 (i,j)(i,j) 其中 ii 整除 jj 的边就行了用LCT来维护最大生成树就可以了#include <cstdio>#include <iostream>#include <algorithm>using namespace std;typedef long long ll;const int N=1500010;int n,cnt,m;struct iedge{

2017-10-23 15:06:20 605

原创 [欧拉回路] 「Balkan OI 2016」Acrobat

一个图是欧拉图的充要条件是每个点度数是偶数且连通第一种操作是同时更改 aia_i 与 aja_j 的度数奇偶性,那么 aia_i 与 aja_j 之间连边,搞棵生成树,一个点的度数是奇数时就删去它与它父亲的边。然后用第二种操作把左边的点连通,再用第二种操作把左边度数为奇数的点连起来#include <cstdio>#include <iostream>#include <algorithm>#

2017-10-22 21:03:03 368

原创 [线段树 & 前缀 优化建图 二分 2-SAT] CF Gym100159 facebook-hacker-cup-2012 I. Unfriending

二分答案对于一个点,肯定有一个区间里的点和它不能共存这个可以用线段树优化建图,每个friend list最多只能删一个,用前缀优化建图还要一些针对随机数据什么的trick才能过…比如二分中的那个特判#include <cstdio>#include <iostream>#include <algorithm>#include <vector>#include <cstring>using n

2017-10-21 23:20:57 625

原创 [Trie树优化建图 2-SAT] Codeforces Gym101190B. Binary Code

把所有串建成一棵Trie树,相当于任意一条从根到叶子的链上都至多有一个点,用类似于前缀优化建图的方法建图#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>#include <vector>using namespace std;const int N=5000010;int n,lst,cnt,

2017-10-21 14:25:16 910 4

原创 [二分 前缀优化建图 2-SAT] Codeforces 587D. Duff in Mafia

二分答案对于一个点,最多能删一条相连的边,每一种颜色最多能有一条相连的边,那么把每个点相连的边用前缀优化建图就可以了#include <cstdio>#include <iostream>#include <algorithm>#include <vector>#include <cstring>using namespace std;const int N=1000010;int n,m,

2017-10-21 14:24:44 531

原创 [分治 Floyd] 计蒜之道2016复赛 .百度地图的实时路况

对 yy 分治假设处理到 [l,r][l,r] 区间,如果 l=rl=r ,n2n^2 扫一遍 disdis 数组记录答案。否则把 [l,mid][l,mid] 的边加入图中,递归做 [mid+1,r][mid+1,r],再把 [mid+1,r][mid+1,r] 的边加入图中,递归做 [l,mid][l,mid]#include <cstdio>#include <iostream>#inc

2017-10-20 21:11:01 638

原创 [坑] #定、引、公#理 杂记

几何nn 条边,边长为 aia_i,能组成一个简单多边形当且仅当 ∀i∈[1,n],ai≤12∑i=1nai也就是max{ai}≤12∑i=1nai\forall i\in[1,n],a_i\le\dfrac{1}{2}\sum_{i=1}^n a_i \text{也就是}\max\{a_i\}\le\dfrac{1}{2}\sum_{i=1}^n a_i 图论1.Ore′sTheoremOr

2017-10-20 21:07:09 382

原创 [树形DP] Codeforces 856D. Masha and Cactus

令 fif_i 表示子树 ii 中加边的方案,gi=∑j∈sonifjg_i=\sum_{j\in son_i}f_j若当前考虑的点为 uu ,第一种方案是不加边,那么 fu=guf_{u}=g_u如果要加边,那么加的边的两个端点的lca肯定是 uu 如果加一条 x,yx,y 的边,那么造成的贡献是 ∑i∈path(x,y)∑j∈soni⋀j∉path(x,y)fj\sum_{i\in path(x

2017-10-18 15:43:24 505

原创 [树链剖分 线段树] Codeforces 860E. Arkady and a Nobody-men

按照深度从小大加入,就是一个很典型的熟练剖分加线段树实现路径修改、询问的模型复杂度是 O(nlog2n)O(n\log^2n)最后一个点加个标记永久化、记忆化什么的卡一卡才能过…#include <cstdio>#include <iostream>#include <algorithm>#include <cmath>#include <vector>#include <set>#in

2017-10-18 12:28:56 492

原创 [杂题 SET维护DP] Codeforces 875E. Delivery Club

考虑二分答案只要能检验答案能不能小于 xx 就行了令 fi,jf_{i,j} 表示一个人在 ii 另一个人在 jj 是否可行那么 fi,j=or{fi−1,k | |ak−ai|≤x}f_{i,j}=\text{or}\{f_{i-1,k} ~|~ |a_k-a_i|\le x\} 这东西要set维护下就好了…#include <cstdio>#include <iostream>#includ

2017-10-18 07:35:04 475

原创 [数学?] Codeforces871C. Points, Lines and Ready-made Titles

一个点向它上下左右的点连边每个联通块是独立的,只要方案数相乘就可以了如果一个联通块有环,那么它的所有边都能出现,通过删一些边就可以做到所有图案如果没有环就做不到所有边都出现,但其他情况都能出现。STL搞一搞搞一搞#include <cstdio>#include <iostream>#include <algorithm>#include <vector>#include <map>usin

2017-10-17 21:41:04 466

原创 [Meet in Middle] 51nod算法马拉松29 F. 空间统计学

Meet in Middle暴力过了…正解挖个坑,可能永远不会填了把…把9维坐标分成前4维和后6维令 fi,j,kf_{i,j,k} 表示前4维为 ii ,后5维与 kk 的距离为 jj 的点数(ii ,kk 状压)这样预处理下,然后再枚举一遍就好了复杂度应该是 O(45n+15×44n)O(4^5n+15\times4^4n)反正常数巨大#include <cstdio>#include <io

2017-10-17 20:29:39 335

原创 [最小基环生成树] Codeforces875F .Royal Questions

考虑在 aia_i 和 bib_i 之间连一条 wiw_i 的边这样会形成一个无向图。如果一个公主嫁给一个王子,就相当于给一条边定向,每个点只有一个入点如果把结果图拿出来,那么就是一棵基环树。求个最大基环生成树就好了以后打CF要先把题看完×2#include <cstdio>#include <algorithm>#include <iostream>#include <vector>usin

2017-10-17 18:21:35 733

原创 [二分 ST表 杂题] Codeforces875D. High Cry

早知道先看D题就不会掉这么惨了枚举左端点,那么区间或值最多变化log次二分变化的区间,再二分区间或值大于区间最大值的区间用ST表记一下区间最大值、或值#include <cstdio> #include <algorithm>#include <iostream>using namespace std;typedef long long ll;const int N=200010;int n,a

2017-10-17 13:11:33 638

原创 [FWT] Codeforces663E .Binary Table

套路题VP的时候发现这题过的人很多…把每一列状压,每一列就可以表示成小于 2202^{20} 的数字令 aia_i 为状态 ii 出现的次数, bib_i 为状态 ii 的贡献(也就是反转或不反转的1的个数的较小值)SS 表示哪些列被反转那么答案就是 minS{∑ai×bi⊕S}\min_S\{\sum a_i\times b_{i\oplus S}\}这就是个FWT的形式直接搞就好了#includ

2017-10-17 10:33:37 378

原创 [2-SAT] Codeforces875C.National Property

发现原来我并不会输出方案…这题只要找第一个不相同的位置 pospos如果 ai,pos>ai+1,posa_{i,pos}>a_{i+1,pos} 那么 ai,posa_{i,pos} 一定是大写,ai+1,posa_{i+1,pos} 一定是小写如果 ai,pos<ai+1,posa_{i,pos}<a_{i+1,pos} 那么如果 ai,posa_{i,pos} 是大写, ai+1,posa_{

2017-10-17 10:33:07 440

原创 [最小生成树 并查集] Codechef October Challenge 2017 .Lucky Edge

O(n)O(n) 枚举左端点,然后往右做一棵以编号为权值的最小生成树,每一条非树边覆盖的树边的编号一定小于它。那么再从左往右扫每条非树边,会对它覆盖的树边加上 n−i+1n-i+1 的贡献,但是树边只能被加一次所以可以用并查集把加过的树边的两个端点缩起来。这样也就不需要求LCA了O(n2α)O(n^2\alpha)然后卡卡常就好了…#include <cstdio>#include <iostre

2017-10-17 07:54:34 490

原创 [多维FFT Bluestein′s Algorithm] Codechef October Challenge 2017 .Chef and Horcrux

题目里那个 其实不重要,只要能算出 pip_i 就行了pip_i 的话发现就是个多维FFT的转移形式到Hillan大佬博客里拷了个代码改一改就好了…Bluestein算法里的FFT可以用暴力卷积代替,因为数据范围小FFT常数大#include<cstdio>#include<iostream>#include<cstring>#include<cstdlib>#include<algori

2017-10-17 07:47:48 986

原创 [容斥 DP] LOJ#6077. 「2017 山东一轮集训 Day7」逆序对

考虑从小到大加入一个数,加入 ii 时会增加大于0小于 ii 对逆序对那么就相当于求 ∑ai=k\sum a_{i} = k 的方案数,其中 ai<ia_i<i这就是个很经典的背包了——BZOJ2431但是这题不能用背包来做考虑容斥。朴素的容斥要枚举哪些超过限制,这样复杂度是指数级别的,但是很多是有重复的令 fi,jf_{i,j} 表示用 ii 个数组成 jj 的方案数gi=∑fi,j×(n+k−j

2017-10-16 15:23:01 1047

原创 [回文自动机优化转移] Central Europe Regional Contest 2014 G. Virus synthesis

一个可行的方案肯定是把一个回文串前后加上一些字符变成 SS 那么只要能DP出每个回文字串的方案就可以了,令这个方案为 ff如果一个回文串长度为奇数,那么它可以由 f去掉两端后的串+2f_\text{去掉两端后的串}+2 和 f最长回文后缀+leni−len最长回文后缀f_\text{最长回文后缀}+len_{i}-len_\text{最长回文后缀} 中的最小值转移过来。如果是偶数,那么它可以由 f去

2017-10-14 11:10:48 418

原创 [回文自动机 fail树] Codechef April Lunchtime 2015. Palindromeness

传送门有个很显然的做法就是建出回文自动机,然后在fail树上倍增找到长度小于等于一半的最长的回文后缀。这样复杂度是O(|S|log|S|)O(|S|\log|S|)但实际上每个点也可以维护一个half指针指向它的合法回文后缀,那么找当前点的half就沿着父节点的half指针的fail指针网上爬就好了复杂度就是建回文自动机的复杂度 O(|S|log|Σ|)O(|S|\log|\Sigma|)fail树

2017-10-14 09:31:24 416

原创 [字典树上建回文自动机] ICPC Preparatory Series by Team Akatsuki. Three Palindromes

传送门dfs整棵树,记录根到当前结点的字符串,然后从父节点在回文自动机上对应的节点开始转移就行了用基础的插入方法会被卡成 O(n2)O(n^2)#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int N=100010;int n,cnt,tot

2017-10-14 07:42:07 469

原创 [分块 回文自动机] LOJ#6070. 「2017 山东一轮集训 Day4」基因

回文自动机那套理论可以在 翁文涛的集训队论文 里看每个串的回文自动机形态是固定的,一个子串的回文自动机也就是一个子图那么就可以用记忆化的方式来降低复杂度……我感觉好像就是论文里提到的“不基于势能分析的插入方法“#include <cstdio>#include <iostream>#include <algorithm>#include <vector>#include <map>#inc

2017-10-14 06:46:56 853

原创 [回文自动机] BZOJ3676 [Apio2014] . 回文串

回文自动机的简单应用…#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int N=300010;int n,p,cnt=1;int nxt[N][30],fail[N],len[N],size[N];char a[N];inline voi

2017-10-13 13:34:32 341

原创 [后缀自动机 DP] LOJ#6071. 「2017 山东一轮集训 Day5」字符串

fi,jf_{i,j} 表示前 ii 个串,以 jj 结尾的可接受的字符串的个数。那么DP的转移可以用后缀自动机转移#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int N=4000010,P=1e9+7;int n,cnt=1,len;i

2017-10-13 07:58:57 852

原创 [莫队维护DP] LOJ#6074. 「2017 山东一轮集训 Day6」子序列

如果只考虑求一个数列的不同子序列个数,可以简单地DP出来fi=2×fi−1−flstai−1f_{i}=2\times f_{i-1}-f_{lst_{a_i}-1},其中 lstjlst_j 表示字符 jj 上次出现的位置,没出现过就忽略但是这样不好维护可以换一种DP方式,fi,jf_{i,j} 表示以字符 ii 开头,字符 jj 结尾的子序列个数。那么在左边新加一个字符 xx ,fx,if_{x

2017-10-12 18:20:11 1019

原创 [最短路 杂题] LOJ#6075. 「2017 山东一轮集训 Day6」重建

刚开始以为可以二分…实际上是没有单峰性的。考虑每条边都加一个整数,那么肯定是使 ss 到 tt 的路劲经过的点变少。用DP算出经过 ii 个点到达 jj 的最短路,用 gi,jg_{i,j} 表示,以及只经过 ii 个关键点到达 jj 的最短路,用 fi,jf_{i,j}表示。如果经过 ii 个点不能到 jj ,那么 fi,j=inff_{i,j}=\inf 或 gi,j=infg_{i,j}=\i

2017-10-12 14:45:41 797

原创 [动态网络 网络流] LOJ#6068.「2017 山东一轮集训 Day4」棋盘

这种棋盘模型很像网络流但是边很难建。可以动态加边,每次跑完一边费用流,把流过的边重新建一条,加上费用就好了#include <cstdio>#include <iostream>#include <algorithm>#include <queue>using namespace std;const int N=10010;int n,q,nx,ny,S,T,cnt=1,lst,G[N],an

2017-10-12 14:25:39 722

原创 [线段树 哈希] Codeforces452F. Permutation

考虑第 ii 位上的数 aia_i ,如果对于任意 k∈[1,min(ai−1,n−ai)]k\in[1,\min(a_i-1,n-a_i)] ,ai−ka_i-k 和 ai+ka_i+k 都在它左边或者都在它右边,那么就不会存在以 aia_i 为中位数的长度为3的等差数列。那么我们从左往右扫这个数列,用权值线段树记录哪些数出现过,那么就是判断区间 [ai−k,ai][a_i-k,a_i] 和 [a

2017-10-06 18:28:02 373

原创 [双联通分量 并查集] CEOI 2017. One-Way Streets

很显然如果一条边在双联通分量中,那么它两个方向都是可以的。否则的话,因为保证输入合法,那么就可以从两个点往 lca\text{lca} 扫没有扫过的边,把边定向。这个东西可以用并查集维护总复杂度就 O(n log n)\text{O(n log n)} #include <cstdio>#include <iostream>#include <algorithm>#include <asser

2017-10-06 18:19:58 1001

原创 [二分 树形DP] CEOI2017. Mousetrap

第一次做这种DP题以 tt 为根,那么老鼠的决策肯定是先往上走一段(或不走),再往子树中走。如果老鼠往子树中走,我们肯定是等它走到某个位置不能走了,然后把他当前在的位置当根节点这段路上的其他支路都封死,这样是最优的。那么我们可以树形DP出老鼠走到以这个点为根的子树的时候,需要的最少步数。令 wiw_i 表示走到这个节点为根的子树时候的最小步数( wiw_i 要算上从这个点到根路径上的支路的数量)那么

2017-10-06 18:10:31 752

原创 [DP 决策单调 分治]Codeforces 868F .Yet Another Minimization Problem

DP 令 fi,jf_{i,j} 表示前 ii 个数分成 jj 个区间的最小代价那么 fi,k=min{fj,k+cost(j+1,i)}f_{i,k}=\min\{f_{j,k}+cost(j+1,i)\} 这东西很想之前CF833B那种可以用线段树维护的套路但是因为 cost()=∑ai∗(ai−1)2cost()=\sum \frac{a_i*(a_i-1)}{2},这东西用线段树不好维护

2017-10-05 21:44:27 1201

原创 [树形DP] CEOI 2017 Practice. Museum

首先把 xx 这个点作为根 令 fi,jf_{i,j} 表示在子树 ii 中,以 ii 为起点,进过 j−1j-1 个点并且回到 ii 时的最小代价gi,jg_{i,j} 在子树 ii 中,以 ii 为起点,进过 j−1j-1 个点不回到 ii 时的最小代价这东西可以用树形DP搞出来。dfs过程中,开一个 hi,j,0..1h_{i,j,0..1} 表示当前点的前 ii 个儿子中,经过 jj 个节

2017-10-04 16:24:24 388

空空如也

空空如也

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

TA关注的人

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