
模板
一条很咸的鱼
这个作者很懒,什么都没留下…
展开
-
虚树
将树压缩成若干个有用的点for(int i=0;i<k;++i){ int f=lca(stk[r],h[i]); while(r&&id[f]<id[stk[r-1]]){ g1.add(stk[r-1],stk[r],get(stk[r],stk[r-1])); --r; } if(f^stk[r])...原创 2020-01-07 14:21:17 · 213 阅读 · 0 评论 -
星球大战
星球大战有一棵树。每次可以攻击树上的某棵子树,然后这棵子树上的每条边有12\frac{1}{2}21的概率消失。定义 若攻击以x为根的子树,深度ht(x)为x子树剩余点(与x连通)的最大深度。共q次操作,两种: 1 x.新建一个节点,其父节点为x。2 x.询问若攻击以x为根的子树,x子树的期望深度。 q≤5×105q\leq 5\times10^5q≤5×105设dp[i][j]为以i为根的...原创 2019-12-20 22:20:20 · 157 阅读 · 0 评论 -
Cards
Team Work计算ans=∑r=1nCnrrkans=\sum_{r=1}^nC_n^rr^kans=∑r=1nCnrrk首先,有(1+x)n=∑r=0nCnrxr(1+x)^n=\sum_{r=0}^nC_n^rx^r(1+x)n=∑r=0nCnrxrop1:微分再乘以x.nx(1+x)n−1=∑r=1nCnrrxrnx(1+x)^{n-1}=\sum_{r=1}^nC_n^...原创 2019-12-20 22:18:49 · 208 阅读 · 0 评论 -
费用流
#include<bits/stdc++.h>using namespace std;char buf[1<<20],*_=buf,*__=buf;#define gc() (_==__&&(__=(_=buf)+fread(buf,1,1<<20,stdin),_==__)?EOF:*_++)#define TT template<...原创 2019-12-13 17:51:33 · 233 阅读 · 0 评论 -
Tarjan
Tarjan割点low[x]:x能到达的cnt最小的节点(包括x自身节点)对于x节点,存在dfs树上x的子节点y,low[y]>=low[x],即y能到达的最小编号节点是以x为根节点的子树,删除x之后,y与x的父节点不连通(特判根节点)void tarjan(int x){ low[x]=dfn[x]=++tarcnt; int flag=0; for(int...原创 2019-12-12 14:57:08 · 144 阅读 · 0 评论 -
非旋treap模板
非旋treap模板struct Treap{ int ls[MAXN],rs[MAXN],siz[MAXN],rd[MAXN]; int val[MAXN]; bool flag[MAXN]; int root,cnt,ltr,mtr,rtr; Treap(){cnt=0;srand(996);} int random(){return rand(...原创 2019-11-27 20:05:15 · 171 阅读 · 0 评论 -
树剖top数组
好像很少有关于top数组性质的博客。for(int i=top[x];fa[i];i=top[fa[i]])可以遍历所有子树中含有x节点的重链链头节点(或叶子节点),由于重链不超过log(n)个,所以这个循环复杂度是O(logN)的。设i是重链链头节点,f是i的父节点,则i是f的轻儿子。所以,如果有操作:对于x节点,他的所有儿子均加上不同的值,且这个值只与儿子节点自身和提供的值有关,那么...原创 2019-11-22 11:44:44 · 182 阅读 · 0 评论 -
dsu on tree 启发式树上合并
解决树上关于子树信息的静态问题,如某节点子树中符合某条件的个数。cf-600E给定一棵树,每个节点有一个颜色,求节点x的子树中出现次数最多的颜色,如果有相同次数的,颜色id相加。考虑暴力,遍历x的每个节点,统计,若只用一个数组,那么两个子节点之间必须要清空数组。优化,对于清空操作,选择x的轻儿子进行清空,重儿子最后遍历,不需要清空,然后将信息合并给x。#include<bits/s...原创 2019-11-19 14:20:06 · 139 阅读 · 0 评论 -
cf Round 600 Antenna Coverage dp
Antenna Coverage给定若n个区间,每次操作可以使一个区间左右拓宽1,求最小操作次数使得区间[1,m]均被覆盖.考虑dp:dp[i]=区间[i,m]均被覆盖的最小花费转移:dp[i]=dp[i+1]dp[i]=dp[i+1]dp[i]=dp[i+1],如果[1,i][1,i][1,i]被原始区间覆盖.否则,p=l−i,dp[i]=min(p+dp[r+p+1]),(l>...原创 2019-11-17 23:07:35 · 186 阅读 · 0 评论 -
平面最近点对 cdq分治
cdq分治可以很好地处理平面点对间具有某种性质的值或数量,最近点对也不例外。参考OI Wiki先对x排序,cdq返回点集内部最近点对的距离记为mindis。考虑如何合并左右区间,对于处于点集A的点a和B的点b,显然∣a.x−b.x∣<=mindis|a.x-b.x|<=mindis∣a.x−b.x∣<=mindis设a,b属于C,找到C后,对于点p,k属于C,显然也要满...原创 2019-11-15 15:57:28 · 780 阅读 · 0 评论 -
纸牌均分问题
首先,如果有某序列aia_iai,则∑i=1n∣ai−k∣\sum_{i=1}^n|a_i-k|∑i=1n∣ai−k∣取最小值时,k为aia_iai的中位数。(因为如果是pos,则pos向靠近中位数的位置移动能更小),这个性质也能dp有n个人站成一排,每个人有aia_iai张纸牌,求最小移动次数使得每个人纸牌数一样,一张纸牌交给旁边的人记为一次移动。如果tot是n的倍数,则有解,设t...原创 2019-11-12 13:50:23 · 216 阅读 · 0 评论 -
cdq分治(模板)
可求解多维偏序问题三维偏序(陌上花开)有 nn 个元素,第 ii 个元素有 aia_iai、bib_ibi 、cic_ici 三个属性,设 f(i)f(i)f(i)表示满足aj≤aia_j \leq a_iaj≤ai且 bj≤bib_j \leq b_ibj≤bi 且 cj≤cic_j \leq c_icj≤ci的 j 的数量。对于 d∈[0,n)d \in [0, n)...原创 2019-11-11 17:14:10 · 268 阅读 · 0 评论 -
费解的开关 高斯消元
费解的开关你玩过“拉灯”游戏吗?25盏灯排成一个5x5的方形。每一个灯都有一个开关,游戏者可以改变它的状态。每一步,游戏者可以改变某一个灯的状态。游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也要相应地改变其状态。我们用数字“1”表示一盏开着的灯,用数字“0”表示关着的灯。下面这种状态1011101101101111000011011在改变了最左上角的灯的状态后将变...原创 2019-11-03 19:15:07 · 320 阅读 · 0 评论 -
快读
快读char buf[1<<20],*P1=buf,*P2=buf;#define gc() (P1==P2&&(P2=(P1=buf)+fread(buf,1,1<<20,stdin),P1==P2)?EOF:*P1++)#define gc() getchar()#define TT template<class T>inlineT...原创 2019-11-03 18:53:59 · 259 阅读 · 0 评论 -
主席树
静态主席树#include<bits/stdc++.h>using namespace std;#define mid ((l+r)>>1)const int MAXN=10;int n,m,a[MAXN],b[MAXN],N;//a为原数组,b为离散后的数组,N为离散后的个数int root[MAXN],sum[MAXN<<5],node_num...原创 2019-11-03 18:48:03 · 80 阅读 · 0 评论 -
splay树(修订版)
伸展树#include<bits/stdc++.h>using namespace std;template<class T> inline bool read(T &x){ x=0;register char c=getchar();register bool f=0; while(!isdigit(c)){if(c==EOF)return ...原创 2019-11-03 18:46:57 · 116 阅读 · 0 评论 -
树链剖分(边)
树链剖分(边)将边权下放至两端点中深度大的点中,当做点权维护。#include<iostream>#include<algorithm>using namespace std;#define gc getchartemplate<typename T>inline void read(T&x) { int flag=x=0; ...原创 2019-11-03 18:45:35 · 174 阅读 · 0 评论 -
树剖版lca
树剖版lca树剖自带lca#include<bits/stdc++.h>using namespace std;template<class T>inline bool read(T &x){ x=0;register char c=getchar(); while(!isdigit(c)){if(c==EOF)return false;c=...原创 2019-11-03 18:44:43 · 139 阅读 · 0 评论 -
树链剖分
树链剖分(点)解决:将两个节点之间的简单路径上的点的权值加上v求两个节点之间的简单路径上的点的权值之和以某一节点为根节点的子树内所有的点的权值加上v求某一节点为根节点的子树内所有的点的权值之和思想:将数划分成若干链,用线段树或者树状数组对这些链进行操作重儿子:对于非叶子节点x,以x的子节点的为根的子树中节点数最多的节点。轻儿子:对于非叶子节点x,除重儿子外其余子节点都是轻儿子...原创 2019-11-03 18:43:37 · 152 阅读 · 0 评论 -
kruskal重构树
解决图中:任意两节点(可以不连通)找到x<->y路径中边权的最小值最大,反之亦然(也可以用树剖写)给定起点,经过的路径边权有某限制下的(如小于等于某值)点权第k小(大),需要主席树。对于1:看着像二分。。对原图边权排序,生成树是直接并查集merge x,y两个节点,重构树的话会新生成一个节点,并把原来的x与y的边断开,用边权当做新节点的点权。//ff[]是并查集for...原创 2019-11-01 16:03:36 · 119 阅读 · 0 评论 -
多重背包的二进制优化
P4544 [USACO10NOV]购买饲料Buying Feed约翰开车来到镇上,他要带KK吨饲料回家。运送饲料是需要花钱的,如果他的车上有XX吨饲料,每公里就要花费X2X^2X2 元,开车D公里就需要D×X2D\times X^2D×X2 元。约翰可以从N家商店购买饲料,所有商店都在一个坐标轴上,第ii家店的位置是XiX_iXi ,饲料的售价为每吨CiC_iCi 元,库存为FiF_...原创 2019-10-19 23:43:43 · 184 阅读 · 0 评论 -
斜率dp(模板)
HUD-3507Zero has an old printer that doesn’t work well sometimes. As it is antique, he still like to use it to print articles. But it is too old to work for a long time and it will certainly wear and...原创 2019-10-18 11:53:53 · 141 阅读 · 0 评论 -
SPFA模板+dfs版检测负环
const int MAXN=1e4+10;int m,n,s,cnt,head[MAXN],dist[MAXN];struct Edge { int to,val,next;} e[500010];inline void add(int x,int y,int val) { e[++cnt].to=y; e[cnt].val=val; e[cnt].ne...原创 2019-07-24 22:40:46 · 254 阅读 · 0 评论 -
逆序数对归并排序模板
//归并排序求逆序数对int ans=0;void mergesort(int arr[],int len) { int mid=len>>1; int *data=new int[len]; for(int i=0; i<len; ++i) data[i]=arr[i]; if(mid>1)mergesort(data,...原创 2019-07-24 22:24:16 · 116 阅读 · 0 评论 -
lagrange 插值法模板
对于n次多项式Γ(k)=∑i=0nyi∏j=0,j≠ink−xjxi−xj \Gamma(k) = \sum_{i=0}^{n}y_i\prod_{j=0,{j}\neq {i} }^{n}\frac{k-x_j}{x_i-x_j} Γ(k)=i=0∑nyij=0,j̸=i∏nxi−xjk−xjconst int mod=1e9+7;template<class T...原创 2019-07-23 23:15:54 · 192 阅读 · 0 评论 -
模板 树状数组
1.单点修改 区间查询const int MAXN=1e5+8;typedef long long ll;int n;ll a[MAXN];inline int lowbit(int x){return x&(-x);}inline void add(int x,ll val){//单点修改 while(x){ a[x]+=val; x+=lowbit...原创 2019-07-24 22:21:00 · 128 阅读 · 0 评论 -
线段树扫描线求矩形面积交(合集)
AtlantisProblem DescriptionThere are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some of these texts even include maps of parts of the island. But unfortunat...原创 2019-08-02 21:35:25 · 312 阅读 · 0 评论 -
dp上升子序列方案数
P3970 [TJOI2014]上升子序列题目描述给定一个只包含整数的序列(序列元素的绝对值大小不超过10^9),你需要计算上升子序列的个数,满足如下条件的称之为一个上升子序列:是原序列的一个子序列长度至少为2所有元素都严格递增如果两个上升子序列相同,那么只需要计算一次。例如:序列{1,2,3,3}有4个上升子序列,分别为{1,2}{1,3},{1,2,3},{2,3}...原创 2019-08-04 19:45:59 · 782 阅读 · 0 评论 -
kmp模板
代码:const int inf=0x3f3f3f3f,mod=998244353,MAXN=1e5+8;int next[MAXN];void getnext(char p[]){ int len=strlen(p); next[0]=-1; int k=-1,j=0; while(j<len-1){ if(k==-1||p[j]==p...原创 2019-09-20 23:18:58 · 98 阅读 · 0 评论 -
凸包模板
struct pt{ double x,y;}k[MAXN];bool cross(const pt&a,const pt&b,const pt&z){//za叉乘zb向量 return (a.x-z.x)*(b.y-z.y)-(a.y-z.y)*(b.x-z.x)>=0;}bool cmp(const pt&a,const pt&am...原创 2019-09-26 22:58:04 · 141 阅读 · 0 评论 -
高斯约旦消元(模板)
求一个N×N的矩阵的逆矩阵。答案对10^9+7取模。输入格式第一行有一个整数NN,代表矩阵的大小;从第22行到第N+1行,每行N个整数,其中第i+1行第j列的数代表矩阵中的元素aija_{ij}aij。输出格式若矩阵可逆,则输出N行,每行N个整数,其中第ii行第jj列的数代表逆矩阵中的元素 bijb_{ij}bij,答案对10^9+7取模;否则只输出一行 No Solution。输...原创 2019-10-01 22:13:14 · 387 阅读 · 0 评论 -
不带修改莫队(模板)
P1494 [国家集训队]小Z的袜子作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿。终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同色的袜子会很尴尬。你的任务便是告诉...原创 2019-10-03 22:21:13 · 95 阅读 · 0 评论 -
线性基模板
线性基可以解决如下问题:给定一个集合S,包含若干个数 a1,a2,…,ana_1,a_2,\dots ,a_na1,a2,…,an求S子集中所有元素异或和的最大值、最小值、第k小、第k大、所有子集异或之和。判断一个数是否可以被S某子集元素异或出来。struct LinerBasis{ ll p[64],rk,tot; //p集合中的元素是S的一组极大线性无关组...原创 2019-10-07 19:07:05 · 101 阅读 · 0 评论 -
莫比乌斯反演模板
莫比乌斯函数定义:设 n=p1k1⋅p2k2⋅⋯⋅pmkmn = p_1 ^ {k_1} \cdot p_2 ^ {k_2} \cdot\cdots\cdot p_m ^ {k_m}n=p1k1⋅p2k2⋅⋯⋅pmkm,其中 p 为素数,则定义如下:μ(n)={1n=1(−1)m∏i=1mki=10otherwise(ki>1)\mu(n) = \begin{case...原创 2019-07-29 13:19:40 · 263 阅读 · 0 评论