板子复习
其余
1.倍增可以快速求静态区间信息。
2.区间操作的数据结构考虑线段树,要思考如何优化信息
3.有点思路时先想暴力,然后一点点优化复杂度,相信自己场上除了水题外是有时间也有能力再做出来一道的。
4.想好思路时先打爆暴力,可以让思路在脑子里在思考一下,不会写一半乱了,正解错的时候可以对拍,打不完了,也还有暴力垫底
5.freopen!,freopen!,freopen!
6.思维题留到最后做,先做有能力拿分的
7.最后一小时专心打暴力,别太相信自己。。。
8.一道题最多给自己一个半小时,打不出来直接转暴力和性质
9.相信它考的都是我会的,我不会的它一定不考。真考到不会的了,放最后做,或努力找性质看看有没有下位替代。
数学
exgcd
点击查看代码
int exgcd(int a,int b,int &x,int &y)
{
if(!b) return x=1,y=0,a;
int d=exgcd(b,a%b,y,x);
return y-=a/b*x,d;
}
错排
点击查看代码
d[0]=d[2]=1;
for(int i=3;i<=n;i++)
d[i]=(i-1)*(d[i-1]+d[i-2])%mod;
\[x^k=\sum_{i=0}^k{k\brace i}x^\underline i
\]
\[{k\brace i}={k-1\brace i-1}+{k-1\brace i}*(k-1)
\]
\[(a+b)^n=\sum\limits_{i=0}^{n} \dbinom{n}{i}a^i b^{n-i}
\]
lca
点击查看代码
struct LCA
{
int dfn[maxn],tot,dep[maxn],st[20][maxn];
int get(int x,int y) {return dep[x]<dep[y]?x:y;}
void dfs(int u,int fa)
{
dfn[u]=++tot,st[0][tot]=fa; dep[u]=dep[fa]+1;
for(int i=head[u];i;i=nxt[i]) if(to[i]!=fa) dfs(to[i],u);
}
void init()
{
dfs(1,0);
for(int i=1;(1<<i)<=n;i++)
for(int j=1;j<=n-(1<<i)+1;j++)
st[i][j]=get(st[i-1][j],st[i-1][j+(1<<i-1)]);
}
int lca(int x,int y)
{
if(x==y) return x;
if((x=dfn[x])>(y=dfn[y])) swap(x,y);
int l=__lg(y-x);
return get(st[l][x+1],st[l][y-(1<<l)+1]);
}
}e;
tarjan
缩点
点击查看代码
stack<int>q;
void tarjan(int u)
{
pre[u]=low[u]=++cnt;
q.push(u);
vis[u]=1;
for(int i=head[u];i;i=nxt[i])
{
int y=to[i];
if(!pre[y])
{
tarjan(y);
low[u]=min(low[u],low[y]);
}
else if(vis[y])
{
low[u]=min(low[u],pre[y]);
}
}
if(low[u]==pre[u])
{
num++;
int temp;
do{
temp=q.top();
q.pop();
vis[temp]=0;
id[temp]=num;
sz[num]++;
}while(u!=temp);
}
}
割点
点击查看代码
void tarjan(int u)
{
pre[u]=low[u]=++cnt;
int now=0;
for(int i=head[u];i;i=nxt[i])
{
int y=to[i];
if(!pre[y])
{
tarjan(y);
low[u]=min(low[u],low[y]);
if(low[y]>=pre[u])//如果u的访问时间比y最早返回的点的时间还靠前,那u被割了y一定不连通
{
now++;
if(u!=root||now>1)
vis[u]=1;
}
}
else
low[u]=min(low[u],pre[y]);
}
}
割边
点击查看代码
void tarjan(int u,int fa)
{
pre[u]=low[u]=++cnt;
for(int i=head[u];i;i=nxt[i])
{
int y=to[i];
if(!pre[y])
{
tarjan(y,u);
low[u]=min(low[u],low[y]);
if(low[y]>pre[u])
{
vis[(i+1)>>1]=1;
}
}
else if(y!=fa) low[u]=min(low[u],pre[y]);
}
}
最短路
dij
priority_queue<pair<int,int> >q;
void dijkstra(int s)
{
memset(vis,0,sizeof(vis));
memset(dis,0,sizeof(dis));
dis[s]=maxn;
q.push(make_pair(maxn,s));
while(q.size())
{
int x=q.top().second;
q.pop();
if(vis[x]) continue;
vis[x]=1;
for(int i=head[x];i;i=nxt[i])
{
int y=to[i],z=val[i];
if(dis[y]<min(z,dis[x]))
{
dis[y]=min(z,dis[x]);
q.push(make_pair(dis[y],y));
}
}
}
}
spfa
void spfa(int s)
{
memset(dis,0x7f7f7f7f,sizeof(dis));
dis[s]=0;
queue<int>q;
q.push(s);
vis[s]=true;
while(q.size())
{
s=q.front();
q.pop();
vis[s]=false;
for(int i=head[s];i;i=nxt[i])
{
int y=to[i];
if(dis[y]>dis[s]+val[i])
{
dis[y]=dis[s]+val[i];
if(!vis[y])
{
cnt[y]++;
q.push(y);
vis[y]=true;
}
}
}
}
}