模板整合

懒了。

缺省源

点击查看代码
#include<bits/stdc++.h>
#define pii pair<int,int>
#define pb push_back
#define ll long long
#define mkp make_pair
#define fir first
#define sec second
#define ls (x<<1)
#define rs (x<<1|1)
using namespace std;
char buf[1<<23],*p1=buf,*p2=buf,obuf[1<<23],*O=obuf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
inline void read(int &x) {
	x=0;
	int f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
	while(isdigit(ch)) x=x*10+(ch^48),ch=getchar();
	x*=f;
}
inline void read(int &x) {
	char c;int f=1;
	while(!isdigit(c=getchar())) if(c=='-') f=-1;;
	x=c-'0';
	while(isdigit(c=getchar())) x=(x<<1)+(x<<3)+c-'0';
	x=x*f;
}//正常读负数版本
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);

	return 0;
}
/*
random_shuffle(a,a+1+n); // 随机打乱
next_permutation(a+1,a+1+n); // 排列 
*/


最大流

dinic

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=405,M=5005,inf=1e9;
int n,m,ss,tt;
struct edge{
	int nt,to,w;
}g[M<<1];
int head[N],cnt=1;
void add(int u,int v,int w){
	g[++cnt].w=w;
	g[cnt].to=v;
	g[cnt].nt=head[u];
	head[u]=cnt;
}
int maxflow,cur[N],dis[N];
int bfs(int s,int t){
	for(int i=1;i<=n;i++)
		cur[i]=head[i],dis[i]=0;//cur[i]记得重置 
	dis[s]=1;
	queue<int> q;
	q.push(s);
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(int i=head[u];i;i=g[i].nt){
			int v=g[i].to,w=g[i].w;
			if(!dis[v] && w>0) {
				dis[v]=dis[u]+1;
				q.push(v);
			}
		}
	}
	if(dis[t]) return 1;
	return 0;
}
int dfs(int u,int flow){
	if(!flow||u==tt) return flow;
	int tmp=0;
	for(int i=cur[u];i;i=g[i].nt){//从cur[u]
		cur[u]=i;
		int v=g[i].to,w=g[i].w;
		int f;
		if(dis[v]==dis[u]+1 && (f=dfs(v,min(flow-tmp,w)))) {//顺序不能变 
			g[i].w-=f;
			g[i^1].w+=f;
			tmp+=f;
			if(tmp>=flow) return tmp;
		}
	}
	return tmp;
}
void dinic(int s,int t){
	while(bfs(s,t)!=0) 
		maxflow+=dfs(s,inf);
}
signed main(){
	cin>>n>>m>>ss>>tt;
	int u,v,w;
	for(int i=1;i<=m;i++){
		cin>>u>>v>>w;
		add(u,v,w);
		add(v,u,0);
	}
	dinic(ss,tt);
	cout<<maxflow;
	return 0;
}

组合

点击查看代码
#include<bits/stdc++.h>
#define ll long long
#define pb push_back
using namespace std;
const int p=1e9+7,N=1e6+5;
int t,n,m;
ll d[N];
ll fac[N],inv[N],facinv[N];
ll C(int x,int y){
	if(x<y) return 0;
	return fac[x]*facinv[y]%p*facinv[x-y]%p;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	fac[0]=fac[1]=1;
	inv[0]=inv[1]=1;
	facinv[0]=facinv[1]=1;
	for(int i=2;i<=1e6;i++){
		inv[i]=(p-p/i)*inv[p%i]%p;
		fac[i]=fac[i-1]*i%p;
		facinv[i]=facinv[i-1]*inv[i]%p;
	}
	return 0;
}

树状数组

点击查看代码
struct tree{
	ll c[N],c2[N];
	void update2(int x,ll y){
		for(int i=x;i<=n;i+=(i&-i))
			c[i]+=y,c2[i]+=y*x;
	}
	void update(int l,int r,ll x){
		update2(l,x);
		update2(r+1,-x);
	}
	ll query(int x){
		ll s=0;
		for(int i=x;i;i-=(i&-i))
			s+=(x+1)*c[i]-c2[i];
		return s;
	}
}tr;
// 区间修改区间查询版

struct tree{
	int c[N];
	void update(int x,int y){
		for(int i=x;i<=n;i+=(i&-i))
			c[i]+=y;
	}
	ll query(int x){
		ll s=0;
		for(int i=x;i>0;i-=(i&-i))
			s+=c[i];
		return s;
	}
}tr; 

线段树

点击查看代码
struct tree{
	int sum[N<<2],tag[N<<2],tag2[N<<2];
	void down(int x,int l,int r){
		if(tag2[x]==-1){
			tag2[x]=0;
			tag2[ls]=tag2[rs]=-1;
			tag[ls]=tag[rs]=0;
			sum[ls]=sum[rs]=0;
		}
		if(tag[x]){
			int mid=(l+r)>>1;
			sum[ls]+=(mid-l+1)*tag[x];
			sum[rs]+=(r-(mid+1)+1)*tag[x];
			tag[ls]+=tag[x];
			tag[rs]+=tag[x];
			tag[x]=0;
		}
	}
	void update(int x,int l,int r,int lt,int rt,int v){
		if(l>rt || r<lt) return ;
		if(lt<=l && r<=rt) {
			sum[x]+=(r-l+1)*v;
			tag[x]+=v;
			return ;
		}
		int mid=(l+r)>>1;
		down(x,l,r);
		update(ls,l,mid,lt,rt,v);
		update(rs,mid+1,r,lt,rt,v);
		sum[x]=sum[ls]+sum[rs];
	}
	void cov(int x,int l,int r,int lt,int rt){
		if(l>rt || r<lt) return ;
		if(lt<=l && r<=rt) {
			sum[x]=0;
			tag2[x]=-1;tag[x]=0;
			return ;
		}
		int mid=(l+r)>>1;
		down(x,l,r);
		cov(ls,l,mid,lt,rt);
		cov(rs,mid+1,r,lt,rt);
		sum[x]=sum[ls]+sum[rs];
	}
	int query(int x,int l,int r,int lt,int rt){
		if(l>rt || r<lt) return 0;
		if(lt<=l && r<=rt) 
			return sum[x];
		int mid=(l+r)>>1;
		down(x,l,r);
		return query(ls,l,mid,lt,rt)+query(rs,mid+1,r,lt,rt);
	}
}tr[30];

最短路

点击查看代码
const int N=5e5+5;
int n,m,s,cnt,head[N],dis[N];
struct edge{
	int to,nt,ct;
} g[N];
void add(int x,int y,int ct){
	cnt++;
	g[cnt].to=y;
	g[cnt].nt=head[x];
	g[cnt].ct=ct;
	head[x]=cnt;
}
priority_queue< pii > q;
int vis[N];
void dij(int s){
	int p=(1<<30)-1;
	for(int i=0;i<=n;i++)
		dis[i]=p;
	dis[s]=0;
	q.push(make_pair(0,s));
	while(!q.empty()){
		int mx=q.top().second;
		q.pop();
		if(vis[mx]) continue;
		vis[mx]=1;
		for(int j=head[mx];j;j=g[j].nt){
			int to=g[j].to,ct=g[j].ct;
			if(dis[to]>dis[mx]+ct && !vis[to])
				dis[to]=dis[mx]+ct,q.push(make_pair(-dis[to],to));	
		}
	}
}
posted @ 2024-04-10 22:00  point_fish  阅读(12)  评论(0)    收藏  举报