模版全收集计划

尝试收录目前我掌握的所有模版。

//树状数组
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];
	}
}
posted @ 2025-06-24 11:47  white_tiger  阅读(16)  评论(0)    收藏  举报