NOIP 考前模板复习--zhengjun

发布时间 2023-11-17 07:38:25作者: A_zjzj
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
#ifdef DEBUG
template<typename T>
ostream& operator << (ostream &out,vector<T> a){
	out<<'[';
	for(T x:a)out<<x<<',';
	return out<<']';
}
template<typename T>
vector<T> ary(T *a,int l,int r){
	return vector<T>{a+l,a+1+r};
}
template<typename T>
void debug(T x){
	cerr<<x<<endl;
}
template<typename T,typename...S>
void debug(T x,S...y){
	cerr<<x<<' ',debug(y...);
}
#else
#define debug(...) void()
#endif
const int N=1e5+10;
int n,a[N];
namespace SGT1{
	int t[N<<2],laz[N<<2];
	void pushup(int rt){
		t[rt]=min(t[rt<<1],t[rt<<1|1])+laz[rt];
	}
	void pushadd(int rt,int x){
		t[rt]+=x,laz[rt]+=x;
	}
	void build(int l=1,int r=n,int rt=1){
		if(l==r){
			t[rt]=a[l];return;
		}
		int mid=(l+r)>>1;
		build(l,mid,rt<<1);
		build(mid+1,r,rt<<1|1);
		pushup(rt);
	}
	void update(int L,int R,int x,int l=1,int r=n,int rt=1){
		if(L<=l&&r<=R)return pushadd(rt,x);
		int mid=(l+r)>>1;
		if(L<=mid)update(L,R,x,l,mid,rt<<1);
		if(mid<R)update(L,R,x,mid+1,r,rt<<1|1);
		pushup(rt);
	}
	void modify(int x,int y,int l=1,int r=n,int rt=1){
		if(l==r)return pushadd(rt,x);
		int mid=(l+r)>>1;
		if(x<=mid)modify(x,y,l,mid,rt<<1);
		else modify(x,y,mid+1,r,rt<<1|1);
		pushup(rt);
	}
	int find(int L,int R,int x,int l=1,int r=n,int rt=1){
		if(t[rt]>x)return 0;
		if(l==r)return l;
		x-=laz[rt];
		int mid=(l+r)>>1,s=0;
		if(L<=mid)s=find(L,R,x,l,mid,rt<<1);
		if(s)return s;
		if(mid<R)s=find(L,R,x,mid+1,r,rt<<1|1);
		return s;
	}
	int query(int L,int R,int l=1,int r=n,int rt=1){
		if(L<=l&&r<=R)return t[rt];
		int mid=(l+r)>>1;
		if(R<=mid)return query(L,R,l,mid,rt<<1)+laz[rt];
		if(mid<L)return query(L,R,mid+1,r,rt<<1|1)+laz[rt];
		return min(query(L,R,l,mid,rt<<1),query(L,R,mid+1,r,rt<<1|1))+laz[rt];
	}
}
namespace SGT2{
	ll t[N<<2],laz[N<<2];
	int siz[N<<2];
	void pushup(int rt){
		t[rt]=t[rt<<1]+t[rt<<1|1];
	}
	void pushadd(int rt,ll x){
		t[rt]+=1ll*x*siz[rt],laz[rt]+=x;
	}
	void pushdown(int rt){
		if(laz[rt]){
			pushadd(rt<<1,laz[rt]);
			pushadd(rt<<1|1,laz[rt]);
			laz[rt]=0;
		}
	}
	void build(int l=1,int r=n,int rt=1){
		if(l==r){
			siz[rt]=1,t[rt]=a[l];return;
		}
		int mid=(l+r)>>1;
		build(l,mid,rt<<1);
		build(mid+1,r,rt<<1|1);
		pushup(rt);
		siz[rt]=siz[rt<<1]+siz[rt<<1|1];
	}
	void update(int L,int R,int x,int l=1,int r=n,int rt=1){
		if(L<=l&&r<=R)return pushadd(rt,x);
		int mid=(l+r)>>1;
		pushdown(rt);
		if(L<=mid)update(L,R,x,l,mid,rt<<1);
		if(mid<R)update(L,R,x,mid+1,r,rt<<1|1);
		pushup(rt);
	}
	ll query(int L,int R,int l=1,int r=n,int rt=1){
		if(L<=l&&r<=R)return t[rt];
		int mid=(l+r)>>1;
		pushdown(rt);
		if(R<=mid)return query(L,R,l,mid,rt<<1);
		if(mid<L)return query(L,R,mid+1,r,rt<<1|1);
		return query(L,R,l,mid,rt<<1)+query(L,R,mid+1,r,rt<<1|1);
	}
}
namespace SGT3{
	const int K=1e5,INF=1e9;
	struct tree{
		int ls,rs,mn,laz;
		tree():mn(INF),laz(0),ls(0),rs(0){}
	}t[K];
	int k;
	void pushup(int rt){
		t[rt].mn=min(t[t[rt].ls].mn,t[t[rt].rs].mn)+t[rt].laz;
	}
	void pushadd(int rt,int x){
		if(rt)t[rt].mn+=x,t[rt].laz+=x;
	}
	void update(int &rt,int L,int R,int x,int l=1,int r=n){
		if(!rt)rt=++k;
		if(L<=l&&r<=R)return pushadd(rt,x);
		int mid=(l+r)>>1;
		if(L<=mid)update(t[rt].ls,L,R,l,mid);
		if(mid<R)update(t[rt].rs,L,R,mid+1,r);
		pushup(rt);
	}
	void merge(int &x,int y,int l=1,int r=n){
		if(!x||!y){
			x|=y;return;
		}
		if(l==r){
			t[x].mn+=t[y].mn;return;
		}
		int mid=(l+r)>>1;
		t[x].laz+=t[y].laz;
		merge(t[x].ls,t[y].ls,l,mid);
		merge(t[x].rs,t[y].rs,mid+1,r);
		pushup(x);
	}
	int query(int rt,int L,int R,int l=1,int r=n){
		if(!rt)return INF;
		if(L<=l&&r<=R)return t[rt].mn;
		int mid=(l+r)>>1,s=INF;
		if(L<=mid)s=min(s,query(t[rt].ls,L,R,l,mid));
		if(mid<R)s=min(s,query(t[rt].rs,L,R,mid+1,r));
		return s+t[rt].laz;
	}
}
namespace BIT{
	int c[N];
	void add(int x,int y){
		for(;x<=n;x+=x&-x)c[x]+=y;
	}
	int get(int x,int y=0){
		for(;x;x^=x&-x)y+=c[x];
		return y;
	}
}
namespace DSU1{
	int fa[N];
	void init(){
		iota(fa,fa+1+n,0);
	}
	int find(int x){
		return fa[x]==x?x:fa[x]=find(fa[x]);
	}
	bool merge(int x,int y){
		x=find(x),y=find(y);
		if(x==y)return 0;
		return fa[x]=y,1;
	}
}
namespace DSU2{
	int fa[N],siz[N];
	void init(){
		iota(fa,fa+1+n,0),fill(siz+1,siz+1+n,1);
	}
	int find(int x){
		return fa[x]==x?x:find(fa[x]);
	}
	int top,stk[N];
	bool merge(int x,int y){
		x=find(x),y=find(y);
		if(x==y)return 0;
		if(siz[x]>siz[y])swap(x,y);
		siz[y]+=siz[x],fa[x]=y,stk[++top]=x;
		return 1;
	}
	void undo(int x){
		siz[fa[x]]-=siz[x],fa[x]=x;
	}
	void reduce(int k){
		for(;top>k;top--)undo(stk[top--]);
	}
}
vector<int>to[N];
int kk,head[N];
struct edges{
	int to,nex;
}edge[N*2];
void add(int u,int v){
	edge[++kk]={v,head[u]},head[u]=kk;
	edge[++kk]={u,head[v]},head[v]=kk;
}
namespace TJ1{
	int dft,sct,top,dfn[N],low[N],scc[N],stk[N];
	void tarjan(int u){
		low[u]=dfn[u]=++dft,stk[++top]=u;
		for(int i=head[u];i;i=edge[i].nex){
			int v=edge[i].to;
			if(!dfn[v])tarjan(v),low[u]=min(low[u],low[v]);
			else if(!scc[v])low[u]=min(low[u],dfn[v]);
		}
		if(dfn[u]==low[u]){
			sct++;
			do scc[stk[top]]=sct;while(stk[top--]^u);
		}
	}
}
namespace TJ2{
	int dft,top,sct,dfn[N],low[N],scc[N],stk[N];
	void tarjan(int u,int fa=0){
		low[u]=dfn[u]=++dft,stk[++top]=u;
		for(int v:to[u])if(v^fa){
			if(!dfn[v])tarjan(v),low[u]=min(low[u],low[v]);
			else if(!scc[v])low[u]=min(low[u],dfn[v]);
		}
		if(low[u]==dfn[u]){
			sct++;
			do scc[stk[top]]=sct;while(stk[top--]^u);
		}
	}
}
namespace TJ3{
	vector<int>A[N];
	int k,dft,top,dfn[N],low[N],stk[N];
	void add(int u,int v){
		A[u].push_back(v),A[v].push_back(u);
	}
	void tarjan(int u,int fa=0){
		dfn[u]=low[u]=++dft,stk[++top]=u;
		for(int v:to[u])if(v^fa){
			if(!dfn[v]){
				tarjan(v),low[u]=min(low[u],low[v]);
				if(low[v]>=dfn[u]){
					add(++k,u);
					do add(k,stk[top]);while(stk[top--]^v);
				}
			}else low[u]=min(low[u],dfn[v]);
		}
	}
}
namespace FHQ{
	struct tree{
		int ls,rs,rnd,val,siz,laz;
	}t[N];
	void pushup(int rt){
		t[rt].siz=t[t[rt].ls].siz+t[t[rt].rs].siz+1;
	}
	void pushadd(int rt,int x){
		if(rt)t[rt].val+=x,t[rt].laz+=x;
	}
	void pushdown(int rt){
		if(t[rt].laz){
			pushadd(t[rt].ls,t[rt].laz);
			pushadd(t[rt].rs,t[rt].laz);
		}
	}
	void split(int rt,int val,int &x,int &y){
		if(!rt){
			x=y=0;return;
		}
		pushdown(rt);
		if(val<t[rt].val)y=rt,split(t[rt].ls,val,x,t[rt].ls);
		else x=rt,split(t[rt].rs,val,t[rt].rs,y);
		pushup(rt);
	}
	int merge(int x,int y){
		if(!x||!y)return x|y;
		if(t[x].rnd<t[y].rnd){
			pushdown(x);
			t[x].rs=merge(t[x].rs,y);
			return pushup(x),x;
		}else{
			pushdown(y);
			t[y].ls=merge(x,t[y].ls);
			return pushup(y),y;
		}
	}
}
const int INF=1e9;
namespace Floyd{
	const int N=1e2+10;
	int a[N][N],f[N][N];
	void solve(){
		for(int i=1;i<=n;i++){
			copy(a[i]+1,a[i]+1+n,f[i]+1);
			f[i][i]=0;
		}
		for(int k=1;k<=n;k++){
			for(int i=1;i<=n;i++){
				for(int j=1;j<=n;j++){
					f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
				}
			}
		}
	}
}
namespace DIJ{
	vector<pair<int,int> >to[N];
	#define v e.first
	#define w e.second
	ll dis[N];
	const ll INF=1e18;
	int vis[N];
	void dij(int s){
		fill(dis+1,dis+1+n,INF),dis[s]=0;
		priority_queue<pair<ll,int> >q;
		q.push({0,s});
		for(int u;!q.empty();){
			u=q.top().second,q.pop();
			if(vis[u])continue;
			vis[u]=1;
			for(auto e:to[u]){
				if(dis[v]>dis[u]+w){
					dis[v]=dis[u]+w,q.push({-dis[v],v});
				}
			}
		}
	}
	#undef v
	#undef w
}
namespace Flow1{
	const int V=1e5,E=1e5;
	int s,t,kk,head[V],cur[V],d[V];
	struct edges{
		int to,c,nex;
	}edge[E];
	void init(int x,int y){
		s=x,t=y,kk=1;
		fill(head+s,head+1+t,0);
	}
	int add(int u,int v,int c){
		edge[++kk]={v,c,head[u]},head[u]=kk;
		edge[++kk]={u,0,head[v]},head[v]=kk;
		return kk-1;
	}
	bool bfs(){
		fill(d+s,d+1+t,-1),d[s]=0;
		copy(head+s,head+1+t,cur+s);
		queue<int>q;
		q.push(s);
		for(int u;!q.empty();){
			u=q.front(),q.pop();
			for(int i=head[u];i;i=edge[i].nex){
				int v=edge[i].to,c=edge[i].c;
				if(c&&!~d[v])d[v]=d[u]+1,q.push(v);
			}
		}
		return !~d[t];
	}
	int dfs(int u,int lim=INF){
		if(u==t)return lim;
		int flow=0;
		for(int i=cur[u];i&&flow<lim;i=edge[i].nex){
			cur[u]=i;
			int v=edge[i].to,c=edge[i].c;
			if(!c||d[v]!=d[u]+1)continue;
			int f=dfs(v,min(c,lim-flow));
			if(!f)d[v]=-1;
			flow+=f,edge[i].c+=f,edge[i^1].c-=f;
		}
		return flow;
	}
		static const int M=2;
	int dinic(){
		int sum=0;
		for(;bfs();)sum+=dfs(s);
		return sum;
	}
}
namespace Flow2{
	const int V=1e5,E=1e5;
	int s,t,kk,head[V],dis[V],cur[V];
	struct edges{
		int to,c,w,nex;
	}edge[E];
	void init(int x,int y){
		s=x,t=y,kk=1;
		fill(head+s,head+1+t,0);
	}
	int add(int u,int v,int c,int w){
		edge[++kk]={v,c,w,head[u]},head[u]=kk;
		edge[++kk]={u,0,-w,head[v]},head[v]=kk;
		return kk-1;
	}
	bool spfa(){
		fill(dis+s,dis+1+t,INF),dis[s]=0;
		queue<int>q;
		q.push(s);
		for(int u;!q.empty();){
			u=q.front(),q.pop();
			for(int i=head[u];i;i=edge[i].nex){
				int v=edge[i].to,c=edge[i].c,w=edge[i].w;
				if(c&&dis[v]>dis[u]+w){
					dis[v]=dis[u]+w,q.push(v);
				}
			}
		}
		return dis[t]<INF;
	}
	int cost,vis[N];
	int dfs(int u,int lim=INF){
		if(u==t)return lim;
		vis[u]=1;
		int flow=0;
		for(int i=cur[u];i&&flow<lim;i=edge[i].nex){
			cur[u]=i;
			int v=edge[i].to,c=edge[i].c,w=edge[i].w;
			if(vis[v]||!c||dis[v]!=dis[u]+w)continue;
			int f=dfs(v,min(lim-flow,c));
			edge[i].c-=f,edge[i^1].c+=f;
			flow+=c,cost+=c*w;
		}
		vis[u]=0;
		return flow;
	}
	int dinic(){
		int sum=0;
		for(;spfa();)sum+=dfs(s);
		return sum;
	}
}
const int mod=998244353;
namespace Matrix{
	struct matrix{
		static const int M=2;
		int a[M][M];
		matrix(){
			memset(a,0,sizeof a);
		}
		matrix operator * (const matrix &x)const{
			matrix b;
			for(int k=0;k<M;k++){
				for(int i=0;i<M;i++){
					for(int j=0;j<M;j++){
						b.a[i][j]=(b.a[i][j]+1ll*a[i][k]*x.a[k][j])%mod;
					}
				}
			}
			return b;
		}
	};
	struct vec{
		static const int M=2;
		int a[M];
		vec(){
			memset(a,0,sizeof a);
		}
		vec operator * (const matrix &x)const{
			vec b;
			for(int i=0;i<M;i++){
				for(int j=0;j<M;j++){
					b.a[j]=(b.a[j]+1ll*a[i]*x.a[i][j])%mod;
				}
			}
			return b;
		}
	};
}
namespace binom{
	int fac[N],ifac[N];
	ll qpow(ll x,ll y=mod-2,ll ans=1){
		for(;y;(x*=x)%=mod,y>>=1)if(y&1)(ans*=x)%=mod;
		return ans;
	}
	void init(int n){
		for(int i=fac[0]=1;i<=n;i++)fac[i]=1ll*fac[i-1]*i%mod;
		ifac[n]=qpow(fac[n]);
		for(int i=n;i>=1;i--)ifac[i-1]=1ll*ifac[i]*i%mod;
	}
	int C(int n,int m){
		if(0>m||m>n)return 0;
		return 1ll*fac[n]*ifac[m]%mod*ifac[n-m]%mod;
	}
}
namespace Path{
	int fa[N],siz[N],dep[N],top[N],son[N];
	void dfs1(int u){
		siz[u]=1,son[u]=0;
		for(int v:to[u])if(v^fa[u]){
			fa[v]=u,dfs1(v);
			siz[u]+=siz[v];
			if(siz[v]>siz[son[u]])son[u]=v;
		}
	}
	int dft,dfn[N],pos[N];
	void dfs2(int u,int t){
		top[u]=t,pos[dfn[u]=++dft]=u;
		if(son[u])dfs2(son[u],t);
		for(int v:to[u])if(v^fa[u]&&v^son[u])dfs2(v,v);
	}
	int LCA(int u,int v){
		for(;top[u]^top[v];u=fa[top[u]]){
			if(dep[top[u]]<dep[top[v]])swap(u,v);
		}
		return dep[u]<dep[v]?u:v;
	}
	int jump(int u,int k){
		for(;k>dfn[u]-dfn[top[u]];u=fa[top[u]]){
			k-=dfn[u]-dfn[top[u]]+1;
		}
		return pos[dfn[u]-k];
	}
}
namespace Euler_LCA{
	const int M=N*2,K=__lg(M)+2;
	int dft,dfn[N],f[K][M],dep[N];
	bool cmp(int x,int y){
		return dep[x]<dep[y];
	}
	void make(int u,int fa=0){
		f[0][dfn[u]=++dft]=u,dep[u]=dep[fa]+1;
		for(int v:to[u])if(v^fa){
			make(v,u);
			f[0][++dft]=u;
		}
	}
	void init(){
		dft=0,make(1);
		for(int i=1;(1<<i)<=dft;i++){
			for(int j=1;j+(1<<i)-1<=dft;j++){
				f[i][j]=min(f[i-1][j],f[i-1][j+(1<<i-1)],cmp);
			}
		}
	}
	int LCA(int l,int r){
		if(l=dfn[l],r=dfn[r],l>r)swap(l,r);
		int k=__lg(r-l+1);
		return min(f[k][l],f[k][r-(1<<k)+1],cmp);
	}
}
namespace AC{
	const int K=26;
	int k,ch[N][K],fail[N];
	int insert(char *a){
		int n=strlen(a),u=0;
		for(int i=0;i<n;i++){
			int &v=ch[u][a[i]-'a'];
			if(!v)v=++k;
			u=v;
		}
		return u;
	}
	void getfail(){
		queue<int>q;
		for(int i=0;i<K;i++){
			int v=ch[0][i];
			if(v)q.push(v),fail[v]=0;
		}
		for(int u;!q.empty();){
			u=q.front(),q.pop();
			for(int i=0;i<K;i++){
				int &v=ch[u][i],x=ch[fail[u]][i];
				if(v)fail[v]=x,q.push(v);
				else v=x;
			}
		}
	}
}
namespace KMP{
	char a[N];
	int nex[N];
	void kmp(){
		int n=strlen(a+1);
		for(int i=2,j=0;i<=n;i++){
			for(;j&&a[j+1]!=a[i];j=nex[j]);
			nex[i]=j+=a[j+1]==a[i];
		}
	}
}
namespace Manacher{
	int n,m;
	char a[N],b[N*2];
	int len[N*2];
	void init(){
		n=strlen(a+1),m=0,b[++m]='$';
		for(int i=1;i<=n;i++){
			b[++m]=a[i],b[++m]='$';
		}
		for(int i=1,mx=0,id=0;i<=n;i++){
			len[i]=i<=mx?min(len[id*2-i],mx-i+1):0;
			for(;i+len[i]<=m&&i-len[i]>=1&&b[i+len[i]]==b[i-len[i]];len[i]++);
			if(i+len[i]>mx)mx=i+len[i]-1,id=i;
		}
	}
}
namespace Z{
	char a[N];
	int n,z[N];
	void init(){
		n=strlen(a+1);
		fill(z+1,z+1+n,0);
		for(int i=2,gap=0,mx=0;i<=n;i++){
			z[i]=i<=mx?min(z[i-gap],mx-i+1):0;
			for(;i+z[i]<=n&&a[z[i]]==a[i+z[i]-1];z[i]++);
			if(i+z[i]>mx)mx=i+z[i]-1,gap=i-1;
		}
	}
}
namespace MinCircle{
	char a[N];
	int get(){
		int n=strlen(a),i=0,j=1,k=0;
		for(;i<n&&j<n&&k<n;){
			if(a[(i+k)%n]==a[(j+k)%n])k++;
			else{
				if(a[(i+k)%n]<a[(j+k)%n])j+=k+1;
				else i+=k+1;
				if(i==j)i++;
				k=0;
			}
		}
		return min(i,j);
	}
}
namespace Hash{
	char a[N];
	int n,f[N],pw[N];
	const int base=19260817,mod=1e9+7;
	void init(){
		n=strlen(a+1);
		for(int i=pw[0]=1;i<=n;i++)pw[i]=1ll*pw[i-1]*base%mod;
		for(int i=1;i<=n;i++)f[i]=(1ll*f[i-1]*base+a[i])%mod;
	}
	int Hash(int l,int r){
		return (f[r]+1ll*(mod-f[l-1])*pw[r-l+1])%mod;
	}
}
int main(){
	freopen(".in","r",stdin);
	// freopen(".out","w",stdout);
	return 0;
}