省选_简单算法
这里是一些简单的算法模板,没有编译过.(编译过的话会做特殊说明)
目录:
1.最近公共祖先
2.CDQ分治
1.最近公共祖先
namespace LCA{
#define LOG 21
int cnt;
int f[22][maxn],dep[maxn];
int head[maxn],to[maxn],nex[maxn];
void addedge(int u,int v){
nex[++cnt] = head[u],head[u]=cnt,to[cnt] = v;
}
void dfs(int u,int fa){
dep[u] = dep[fa] + 1;
f[0][u]=fa;
for(int i=1;i<LOG;++i) f[i][u]=f[i-1][f[i-1][u]];
for(int i=head[u];i;i=nex[i])
if(to[i]!=fa)dfs(to[i],u);
}
int query(int x,int y){
if(dep[x]<dep[y]) swap(x,y);
if(dep[x]!=dep[y]){
for(int i=LOG-1;i>=0;--i)
if(dep[f[i][y]]<=dep[x]) y=f[i][y];
}
if(x==y) return x;
for(int i=LOG-1;i>=0;--i)
if(f[i][x]!=f[i][y])
x=f[i][x],y=f[i][y];
return f[0][x];
}
};
2.CDQ分治(二维 LIS)
//CDQ分治 --- 3维LIS
namespace CDQ{
#define maxn 500060
#define ll long long
#define nex (oo = (oo * A) % mod)
#define setIO(s) freopen(s".in","r",stdin)
int n,cnt,fin,ans[maxn];
long long mod,oo = 1,A,H[maxn];
void getmax(int &a,int b){ if(b > a) a = b; }
struct Node{
long long x,y,z;
int id;
}node[maxn],arr[maxn];
int cmpx(Node a,Node b){
if(a.x == b.x && a.y == b.y) return a.z < b.z;
if(a.x == b.x) return a.y < b.y;
return a.x < b.x;
}
int cmpy(Node a,Node b){
if(a.x == b.x) return a.y < b.y;
return a.x < b.x;
}
int equal(Node a,Node b) {
return (a.x == b.x && a.y == b.y && a.z == b.z);
}
struct BIT{
int C[maxn];
int lowbit(int x){
return x & (-x);
}
void update(int p,int x){
while(p < maxn){
C[p] = max(C[p],x);
p += lowbit(p);
}
}
int query(int p){
if(p <= 0) return 0;
int ss = 0;
while(p > 0) {
ss = max(ss,C[p]), p -= lowbit(p);
}
return ss;
}
void del(int p){
while(p < maxn) C[p] = 0,p += lowbit(p);
}
}tree;
void solve(int l,int r){
if(l >= r) return ;
int mid = (l + r) >> 1,tl = l,tr = mid + 1;
solve(l,mid);
sort(arr+l,arr+mid+1,cmpy),sort(arr+mid+1,arr+r+1,cmpy);
while(tl <= mid && tr <= r){
if(arr[tl].y < arr[tr].y){
tree.update(arr[tl].z,ans[arr[tl].id]);
++tl;
}
else {
getmax(ans[arr[tr].id],tree.query(arr[tr].z - 1) + 1);
++tr;
}
}
for(int i = tr;i <= r; ++i) getmax(ans[arr[i].id],tree.query(arr[i].z-1) + 1);
for(int i = l;i <= mid; ++i) tree.del(arr[i].z);
sort(arr+mid+1,arr+1+r,cmpx),solve(mid+1,r);
};
};

浙公网安备 33010602011771号