模版全收集计划
尝试收录目前我掌握的所有模版。
//树状数组
namespace BIT{
int c[N];
void clear(){
memset(c,0,sizeof(c));
}void add(int x,int k){
for(;x<=n;x+=x&-x) c[x]+=k;
}int sum(int x){
int re=0;
for(;x;x-=x&-x) re+=c[x];
return re;
}
}
//线段树1
namespace SGT1{
int sm[N*4],lz[N*4];
void down(int x,int l,int r,int k){
lz[x]+=k,sm[x]+=(r-l+1)*k;
}void push_down(int x,int l,int r){
if(!lz[x]) return;int mid=(l+r)/2;
down(x*2+1,mid+1,r,lz[x]);
down(x*2,l,mid,lz[x]),lz[x]=0;
}void build(int x,int l,int r){
if(l==r) return sm[x]=a[l],void();
int mid=(l+r)/2;build(x*2+1,mid+1,r);
build(x*2,l,mid),sm[x]=sm[x*2]+sm[x*2+1];
}void add(int x,int l,int r,int L,int R,int k){
if(L<=l&&r<=R) return down(x,l,r,k);
int mid=(l+r)/2;push_down(x,l,r);
if(L<=mid) add(x*2,l,mid,L,R,k);
if(R>mid) add(x*2+1,mid+1,r,L,R,k);
sm[x]=sm[x*2]+sm[x*2+1];
}int sum(int x,int l,int r,int L,int R){
if(L<=l&&r<=R) return sm[x];
int mid=(l+r)/2,re=0;push_down(x,l,r);
if(L<=mid) re=sum(x*2,l,mid,L,R);
if(R>mid) re+=sum(x*2+1,mid+1,r,L,R);
return re;
}
}
//线段树2
namespace SGT{
int sm[N*4],ad[N*4],ml[N*4];
void down(int x,int l,int r,int tm,int da){
ml[x]=(ll)ml[x]*tm%p,ad[x]=((ll)ad[x]*tm+da)%p;
sm[x]=((ll)sm[x]*tm+(ll)da*(r-l+1))%p;
}void push_down(int x,int l,int r){
if(!ad[x]&&ml[x]==1) return;
int mid=(l+r)/2;down(x*2+1,mid+1,r,ml[x],ad[x]);
down(x*2,l,mid,ml[x],ad[x]),ml[x]=1,ad[x]=0;
}void build(int x,int l,int r){
if(l==r) return sm[x]=a[l],void();
int mid=(l+r)/2;ml[x]=1,build(x*2+1,mid+1,r);
build(x*2,l,mid),sm[x]=(sm[x*2]+sm[x*2+1])%p;
}void add(int x,int l,int r,int L,int R,int k){
if(L<=l&&r<=R) return down(x,l,r,1,k);
int mid=(l+r)/2;push_down(x,l,r);
if(L<=mid) add(x*2,l,mid,L,R,k);
if(R>mid) add(x*2+1,mid+1,r,L,R,k);
sm[x]=(sm[x*2]+sm[x*2+1])%p;
}void mul(int x,int l,int r,int L,int R,int k){
if(L<=l&&r<=R) return down(x,l,r,k,0);
int mid=(l+r)/2;push_down(x,l,r);
if(L<=mid) mul(x*2,l,mid,L,R,k);
if(R>mid) mul(x*2+1,mid+1,r,L,R,k);
sm[x]=(sm[x*2]+sm[x*2+1])%p;
}int sum(int x,int l,int r,int L,int R){
if(L<=l&&r<=R) return sm[x];
int mid=(l+r)/2,re=0;push_down(x,l,r);
if(R>mid) re=sum(x*2+1,mid+1,r,L,R);
if(L<=mid) re=(re+sum(x*2,l,mid,L,R))%p;
return re;
}
}
//单调队列
int n,k,a[N],qa[N],fa=1,la,qb[N],fb=1,lb;
signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++){
if(fa<=la&&i-qa[fa]==k) fa++;
while(fa<=la&&a[i]<=a[qa[la]]) la--;
qa[++la]=i;if(i>=k) cout<<a[qa[fa]]<<" ";
}cout<<"\n";
for(int i=1;i<=n;i++){
if(fb<=lb&&i-qb[fb]==k) fb++;
while(fb<=lb&&a[i]>=a[qb[lb]]) lb--;
qb[++lb]=i;if(i>=k) cout<<a[qb[fb]]<<" ";
}return 0;
}
//单调栈
int n,a[N],st[N],tp,f[N];
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0),cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;st[++tp]=i++)
while(tp&&a[i]>a[st[tp]]) f[st[tp--]]=i;
for(int i=1;i<=n;i++) cout<<f[i]<<" ";
return 0;
}
//强连通分量
namespace TAR1{
int dfn[N],low[N],st[N],vis[N],tp,idx;
void tarjan(int x){
dfn[x]=low[x]=++idx,vis[st[++tp]=x]=1;
for(auto y:g[x]){
if(!dfn[y]) tarjan(y),low[x]=min(low[x],low[y]);
else if(vis[y]) low[x]=min(low[x],dfn[y]);
}if(dfn[x]!=low[x]) return;
while(st[tp+1]!=x){
cs[num].push_back(st[tp]);
bid[st[tp]]=num,vis[st[tp--]]=0;
}sort(cs[num].begin(),cs[num].end()),num++;
}
}
//边双连通分量
namespace TAR2{
int dfn[N],low[N],st[N],idx,tp;
void tarjan(int x,int fa){
dfn[x]=low[x]=++idx,st[++tp]=x;
for(auto y:g[x]){
if(y==fa){fa=0;continue;}
if(dfn[y]) low[x]=min(low[x],dfn[y]);
else tarjan(y,x),low[x]=min(low[x],low[y]);
}if(dfn[x]!=low[x]) return;num++;
while(st[tp+1]!=x) cs[num].push_back(st[tp--]);
}
}
//点双连通分量
namespace TAR3{
int dfn[N],low[N],st[N],idx,tp;
void tarjan(int x,int fa){
dfn[x]=low[x]=++idx,st[++tp]=x;int sn=0;
for(auto y:g[x]) if(y!=fa){
if(!dfn[y]){
sn++,tarjan(y,x);
if(dfn[x]<=low[y]){
cs[++num].push_back(x);
while(st[tp+1]!=y) cs[num].push_back(st[tp--]);
}low[x]=min(low[x],low[y]);
}else low[x]=min(low[x],dfn[y]);
}if(!fa&&!sn) cs[++num].push_back(x);
}
}
//lca
namespace LCA{
int f[N][20],dep[N];
void dfs(int x,int fa){
f[x][0]=fa,dep[x]=dep[fa]+1;
for(int i=0;i<19;i++)
f[x][i+1]=f[f[x][i]][i];
for(auto y:g[x]) if(y!=fa) dfs(y,x);
}int lca(int x,int y){
if(dep[x]<dep[y]) swap(x,y);
for(int i=19;~i;i--)
if(dep[x]-dep[y]>=(1<<i)) x=f[x][i];
if(x==y) return x;
for(int i=19;~i;i--)
if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
return f[x][0];
}
}
//ST表
namespace ST{
int st[N][19],ln[N];
void init(){
for(int i=1;i<=n;i++) st[i][0]=a[i];
for(int i=2;i<=n;i++) ln[i]=ln[i/2]+1;
for(int j=0;j<18;j++)
for(int i=1;i<=n-(2<<j)+1;i++)
st[i][j+1]=max(st[i][j],st[i+(1<<j)][j]);
}int rmq(int l,int r){
int k=ln[r-l+1],x=r-(1<<k)+1;
return max(st[l][k],st[x][k]);
}
}
//高斯消元
namespace GAUSS{
int c,t,f;double a[N][N];
int gauss(){
for(c=t=f=1;c<=n;t=f,c++){
for(int i=f;i<=n;i++)
if(fabs(a[i][c])>fabs(a[t][c])) t=i;
if(fabs(a[t][c])<eps) continue;
for(int i=c;i<=n+1;i++) swap(a[f][i],a[t][i]);
for(int i=n+1;i>=c;i--) a[f][i]/=a[f][c];
for(int i=f+1;i<=n;i++) for(int j=n+1;j>=c;j--)
a[i][j]-=a[f][j]*a[i][c];f++;
}if(f<=n){
for(int i=f;i<=n;i++)
if(fabs(a[i][n+1])>eps) return -1;
return 0;
}for(int i=n;i;i--) for(int j=n;j>i;j--)
a[i][n+1]-=a[j][n+1]*a[i][j];
return 1;
}
}
//exgcd
namespace EXGCD{
int exgcd(int a,int b,int &x,int &y){
if(!b) return x=1,y=0,a;
int gc=exgcd(b,a%b,x,y);
return swap(x,y),y-=a/b*x,gc;
}
}
//bsgs
namespace BSGS{
unordered_map<int,int>zjy;
int qpow(int x,int y){
int re=1;
while(y){
if(y&1) re=re*x%p;
x=x*x%p,y>>=1;
}return re;
}int bsgs(int p,int b,int n){
if(n==1) return 0;
int z=sqrt(p)+1,pw=1,qp=qpow(n,p-2);
for(int i=0;i<z;i++) zjy[pw]=i,pw=pw*b%p;
for(int i=1,j=pw;i<=z;i++,j=pw*j%p)
if(zjy.count(j*qp%p)) return i*z-zjy[j*qp%p];
return -1;
}
}
//kmp
namespace KMP{
int nxt[N],st[N],tp;
void gnx(int m,string t){
for(int i=2,j=0;i<=m;i++){
while(t[j+1]!=t[i]&&j) j=nxt[j];
if(t[i]==t[j+1]) nxt[i]=++j;
}
}void kmp(int n,int m,string s,string t){
for(int i=1,j=0;i<=n;i++){
while(t[j+1]!=s[i]&&j) j=nxt[j];
if(s[i]==t[j+1]) j++;
if(j==m) st[++tp]=i-m+1;
}
}
}
//trie
namespace TRIE{
int idx,sum[N],tr[N][62];
int zh(char c){
if(c>='a') return c-'a';
if(c>='A') return c-'A'+26;
return c-'0'+52;
}void clear(){
for(int i=1;i<=idx;sum[i++]=0)
for(int j=0;j<62;j++) tr[i][j]=0;idx=1;
}void add(string s){
int now=1;
for(int i=0;s[i];i++){
int cc=zh(s[i]);
if(!tr[now][cc]) tr[now][cc]=++idx;
sum[now]++,now=tr[now][cc];
}sum[now]++;
}int ans(string s){
int now=1;
for(int i=0;s[i];i++)
now=tr[now][zh(s[i])];
return sum[now];
}
}

浙公网安备 33010602011771号