模板整合
懒了。
缺省源
点击查看代码
#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));
}
}
}

浙公网安备 33010602011771号