OI常用模板
Nemlit
2018-11-08 19:26:57
```
void Prim()
{
memset(dis,127,sizeof(dis));
for(int i=head[1];i;i=e[i].next) dis[e[i].v]=min(dis[e[i].v],e[i].w);
for(int i=1;i<n;++i)
{
int minn=inf,now=0;
for(int j=2;j<=n;++j)
if(dis[j]<minn&&!vis[j]) minn=dis[j],now=j;
ans+=dis[now];
vis[now]=1;
for(re int j=head[now];j;j=e[j].next)
dis[e[j].v]=min(dis[e[j].v],e[j].w);
}
}
void eulershai()
{
for(int i=2;i<=n;i++)
{
if(!f[i]) p[++cnt]=i;
for(int j=1;j<=cnt;j++)
{
if(i*p[j]>n) break;
f[i*p[j]]=1;
if(!(i%p[j])) break;
}
}
}
void spfa(int s)
{
memset(vis,0,sizeof(vis));
memset(dis,127,sizeof(dis));
int l=1,r=0;
q[++r]=s,dis[s]=0;
while(l<=r)
{
int u=q[l++];
vis[u]=0;
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].v,w=e[i].w;
if(dis[v]>dis[u]+w)
{
if(++col[v]>n) return 0;//负环
dis[v]=dis[u]+w,ans[v]=ans[u];//最短路记数
if(!vis[v]) q[++r]=v,vis[v]=1;
}
else if(dis[v]==dis[u]+1) ans[v]+=ans[u]//最短路记数
}
}
}
il void add(int x,int v)
{
while(x<=n) a[x]+=v,x+=lb(x);
}
int query(int x)
{
re int ans=0;
while(x) ans+=a[x],x-=lb(x);
return ans;
}
//单点加+区间查:
//add(x,v);
//printf("%d\n",query(y)-query(x-1));
//区间加+单点查:
//add(x,z),add(y+1,-z);
//printf("%d\n",query(x));
void threecut()
{
while(r-l>eps)
{
re D mid=(r-l)/3;
f(l+mid)>f(r-mid)?r-=mid:l+=mid;
}
}
void ST()
{
log[0]=-1;
for(re int i=1;i<=n;++i)
{
st[0][i]=a[i];
log[i]=log[i>>1]+1;
}
for(re int j=1;j<20;++j)
for(re int i=1;i+(1<<j)-1<=n;++i)
st[j][i]=max(st[j-1][i],st[j-1][i+(1<<j-1)]);
l=read(),r=read();
re int t=log[r-l+1];
cout<<max(st[t][l],st[t][r-(1<<t)+1]);
}
void aca()
{
memset(c,0,sizeof(c));
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
for(int k=1;k<=n;++k) c[i][j]+=a[i][k]*a[k][j];
memcpy(a,c,sizeof(c));
}
void acb()
{
memset(c,0,sizeof(c));
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
for(int k=1;k<=n;++k) c[i][j]+=a[i][k]*b[k][j];
memcpy(b,c,sizeof(c));
}
void ksm()
{
memcpy(b,a,sizeof(a));
while(k)
{
if(k&1ll) acb();
k>>=1,aca();
}
}
void sort(int l,int r)
{
if(l==r) return;
int mid=(l+r)>>1;
sort(l,mid),sort(mid+1,r);
int x=l,y=mid+1,p=l;
while(x<=mid&&y<=r)
{
if(a[x]>=a[y])
{
b[p++]=a[y++];
ans+=mid-x+1;
}
else b[p++]=a[x++];
}
while(x<=mid) b[p++]=a[x++];
while(y<=r) b[p++]=a[y++];
for(int i=l;i<=r;i++) a[i]=b[i];
}
void KMP()
{
n=strlen(a+1),m=strlen(b+1);
for(re int i=2,j=0;i<=m;++i)
{
while(j&&b[i]!=b[j+1]) j=p[j];
if(b[i]==b[j+1]) ++j;
p[i]=j;
}
for(re int i=1,j=0;i<=n;++i)
{
while(j&&b[j+1]!=a[i]) j=p[j];
if(a[i]==b[j+1]) ++j;
if(m==j) printf("%d\n",i-m+1),j=p[j];
}
}
il void exgcd(int a,int b,int&x,int&y)
{
if(!b)
{
x=1,y=0;
return;
}
exgcd(b,a%b,y,x);
y-=x*(a/b);
}
void getinv()
{
inv[1]=1;
for(re int i=2;i<=n;++i) inv[i]=(inv[p%i]*(p-p/i))%p;
}
void TarjanLCA()
{
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].v;
if(v==father[u]) continue;
father[v]=u;
Tarjan(v);
hb(v,u),vis[v]=1;
}
for(int i=head1[u];i;i=q[i].next)
if(vis[q[i].v])
ans[i]=find(q[i].v);
}
int outLCA()
{
for(int i=1;i<=m;i++)
printf("%d\n",max(ans[i<<1],ans[(i<<1)-1]));
}
ll C(int n,int m)
{
if(m>n) return 0;
return ((fac[n]*inv(m))%p*inv(n-m))%p;
}
inline ll lucas(int n,int m)
{
if(m==0) return 1;
return (lucas(n/p,m/p)*C(n%p,m%p))%p;
}
struct node
{
int now,w;
il bool operator<(const node&x) const{return w>x.w;}
};
il void Dij()
{
memset(dis,127,sizeof(dis));
dis[s]=0;
q.push((node){s,0});
while(!q.empty())
{
re node t=q.top(); q.pop();
if(!vis[t.now])
{
vis[t.now]=1;
for(re int i=head[t.now];i;i=e[i].next)
{
if(!vis[e[i].v])
{
dis[e[i].v]=min(dis[e[i].v],dis[t.now]+e[i].w);
q.push((node){e[i].v,dis[e[i].v]});
}
}
}
}
}
void LCS()
{
for(re int i=1;i<=n;++i) a[read()]=i;//最长公共子序列
for(re int i=1;i<=n;++i)
{
re int x=a[read()];
if(x>dp[len]) dp[++len]=x;
else
{
re int l=1,r=len;
while(l<=r)
{
re int mid=(l+r)/2;
if(dp[mid]<x) l=mid+1;
else r=mid-1;
}
dp[l]=x;
}
}
printf("%d",len);
}
void manacher()
{
s[0]='!',s[1]='#';
char c=get_char();
while(c!=EOF)
{
s[len++]=c,s[len++]='#';
c=getchar();
}
for(int i=1;i<len;i++)
{
if(i<mx) p[i]=min(p[2*mid-i],mx-i);
else p[i]=1;
while(s[i-p[i]]==s[i+p[i]]) p[i]++;
if(mx<i+p[i])
{
mid=i;
mx=i+p[mid];
}
maxlen=max(maxlen,p[i]);
}
printf("%d",maxlen-1);
}
il void tarjancut(int u,int fr)
{
dfn[u]=low[u]=++tim;
st[++top]=u;
col=0;
for(ri int i=head[u];i;i=e[i].nxt)
{
ri int v=e[i].v;
if(!dfn[v])
{
col++;
tarjan(v,u);
low[u]=min(low[u],low[v]);
if((u!=root&&dfn[u]<=low[v])||(u==root&&col>1)) ans[u]=1;
}
else low[u]=min(low[u],dfn[v]);
}
}
void tarjansuo()
{
dfn[u]=low[u]=++tim;
st[++top]=u;
for(re int i=head[u];i;i=e[i].next)
{
re int v=e[i].v;
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(!suo[v]) low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u])
{
++co;
while(st[top+1]!=u)
{
suo[st[top]]=co;
sum[co]+=a[st[top--]];
}
}
}
void Gauss()
{
for(re int i=1;i<=n;++i)
{
re int max=i;
for(re int j=i+1;j<=n;++j)
if(fabs(a[j][i])>fabs(a[max][i])) max=j;
for(re int j=1;j<=n+1;++j)
swap(a[i][j],a[max][j]);
if(!a[i][i]) return puts("No Solution"),0;
for(re int j=1;j<=n;++j)
{
if(j!=i)
{
re D temp=a[j][i]/a[i][i];
for(re int k=i+1;k<=n+1;++k) a[j][k]-=a[i][k]*temp;
}
}
}
for(re int i=1;i<=n;++i) printf("%.2lf\n",a[i][n+1]/a[i][i]);
}
il void SA()
{
re D xx=xans,yy=yans,t=T;
while(t>EPS)
{
re D xt=xx+(rand()*2-RAND_MAX)*t;
re D yt=yy+(rand()*2-RAND_MAX)*t;
re D now=getans(xt,yt);
re D deta=now-ans;
if(deta<0)
{
xx=xans=xt,yy=yans=yt;
ans=now;
}
else if(RAND_MAX*exp(-deta/t)>rand()) xx=xt,yy=yt;
t*=delta;
}
}
void Binary()
{
for(re int i=1;i<=n;++i)
{
re int W=read(),V=read(),num=read();
for(re int j=1;j<=num;j<<=1)
{
w[++cnt]=j*W,v[cnt]=j*V;
num-=j;
}
if(num) w[++cnt]=num*W,v[cnt]=num*V;
}
for(re int i=1;i<=cnt;++i)
for(re int j=m;j>=v[i];--j)
dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
}
int getp(int x)
{
int ans=x;
for(int i=2;i*i<=x;++i)
{
if(x%i==0)
{
ans-=ans/i;
while(x%i==0) x/=i;
}
}
return x>1?ans-ans/x:ans;
}
void Euler()
{
for(re int i=1;i<=n;++i) p[i]=i;
for(re int i=2;i<=n;++i)
if(p[i]==i)
for(re int j=i;j<=n;j+=i) p[j]=p[j]*(i-1)/i;
}
int fx[4]={1,0,0,-1},fy[4]={0,-1,1,0};
il void dfs(int x,int y,int sum,int last)
{
re int tl=gu();
if(ans==sum)
{
if(tl==0) b=1;
return;
}
if(b||sum+tl-1>ans) return;
++sum;
for(re int i=0;i<4;++i)
{
re int vx=x+fx[i],vy=y+fy[i];
if(vx>2||vx<0||vy>2||vy<0||i+last==3) continue;
swap(a[vx][vy],a[x][y]),dfs(vx,vy,sum,i),swap(a[vx][vy],a[x][y]);
}
}
void Astar()
{
while(1)
{
dfs(sx,sy,0,-1);
if(b) return printf("%d",ans),0;
++ans;
}
}
void treeDP()
{
sort(e+1,e+n+1,cmp);//右端点排序
memset(f,127,sizeof(f));
f[L]=0;
build(1,L,R);
for(re int i=1;i<=n;++i)
{
f[e[i].v]=min(f[e[i].v],query(1,L,R,e[i].u-1,e[i].v)+e[i].w);
change(1,L,R,e[i].v,f[e[i].v]);
if(e[i].v>=R)
{
if(f[e[i].v]<1234567890) printf("%d",f[e[i].v]);
else puts("-1");
return;
}
}
}
int mathDP(int now,int last,int lend,int higher)
{
if(!now) return 1;
if(dp[now][last][higher][lend]!=-1) return dp[now][last][higher][lend];
int temp=0,n=(lend?a[now]:9);
for(register int i=0;i<=n;++i)
if(abs(i-last)>=2)
temp+=mathDP(now-1,(((!i)&&higher)?-10:i),(lend&&(i==n)),((!i)&&higher));
return dp[now][last][higher][lend]=temp;
}
int work(int x)
{
cnt=0;
while(x) a[++cnt]=x%10,x/=10;
memset(dp,-1,sizeof(dp));
return dfs(cnt,-10,1,1);
}
namespace Dinic
{
bool bfs()
{
memset(deep,0,sizeof(deep));
q.push(s);
deep[s]=1;
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].v;
if(!deep[v]&&e[i].w>0)
{
deep[v]=deep[u]+1;
q.push(v);
}
}
}
return deep[t];
}
int dfs(int u,int minn)
{
if(u==t) return minn;
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].v;
if(e[i].w&&deep[v]==deep[u]+1)
{
int l=dfs(v,min(minn,e[i].w));
if(l>0)
{
e[i].w-=l,e[i+1].w+=l;
return l;
}
}
}
return 0;
}
int dinic()
{
int low,ans=0;
while(bfs()) while(low=dfs(s,INF)) ans+=low;
return ans;
}
}
struct Heap
{
int now;
D gu,w;
il bool operator<(Heap x) const{return gu>x.gu;}
}u;
priority_queue<Heap> h;
il void KAstar()
{
h.push((Heap){1,dis[1],0});
while(!h.empty())
{
u=h.top();
h.pop();
if(E<u.w) return;
if(n==u.now)
{
++ans,E-=u.w;
continue;
}
for(re int i=head[u.now];i;i=e[i].next)
{
h.push((Heap){e[i].v,v.w+dis[e[i].v],u.w+e[i].w});
}
}
}
```