CSP/NOIP c++常用模板
蒟蒻目前还是提高组选手,模板将会持续更新! 目录:
线段树 对拍 exgcd st 树状数组 树剖 dijsktra spfa tarjan 匈牙利 埃筛 差分树状数组 dinic 快速幂取余
Exgcd
#include<bits/stdc++.h>
using namespace std;
int exgcd(int a,int b,int &x,int &y)
{
if(b==)
{
x=;
y=;
return a;
}
int r=exgcd(b,a%b,x,y);
int t = x;
x=y;
y=t-a/b*y;
return r;
}
int main()
{
int a,b;
cin>>a>>b;
int x,y;
int p=exgcd(a,b,x,y);
cout<<(x+b)%b<<endl;
return ;
} 对拍
@echo off
:loop
数据生成器.exe
快速排序.exe
优先队列.exe
fc 快速排序.out 优先队列.out
if not errorlevel goto loop
pause 线段树
#include <stdio.h>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <algorithm>
#define maxn 100010 using namespace std; struct point{
int l,r;
long long val,mark;
}tr[maxn*]; int m,n;
int a[maxn]; void buildtree(int x,int l,int r)
{
tr[x].l=l;
tr[x].r=r;
if(l==r)
{
tr[x].val=a[l];
return;
}
int lch=x*,rch=x*+;
int mid=(l+r)/;
buildtree(lch, l, mid);
buildtree(rch, mid+, r);
tr[x].val=tr[x*].val+tr[x*+].val;
} void release(int x)
{
if(tr[x].mark && tr[x].l<tr[x].r)
{
int lch=x*,rch=x*+;
tr[lch].val+=tr[x].mark*((long long)tr[lch].r-tr[lch].l+);
tr[lch].mark+=tr[x].mark;
tr[rch].val+=tr[x].mark*((long long)tr[rch].r-tr[rch].l+);
tr[rch].mark+=tr[x].mark;
}
tr[x].mark=;
} void modify(int x,int l,int r,long long k)
{
release(x);
if(l<=tr[x].l && tr[x].r<=r)
{
tr[x].val+=k*((long long)tr[x].r-tr[x].l+);
tr[x].mark+=k;
return;
}
int mid=(tr[x].l+tr[x].r)/;
if(l<=mid)
modify(x*, l, r, k);
if(mid<r)
modify(x*+, l, r, k);
tr[x].val=tr[x*].val+tr[x*+].val;
} long long query(int x,int l,int r)
{
release(x);
if(l<=tr[x].l && tr[x].r<=r)
return tr[x].val;
int mid=(tr[x].l+tr[x].r)/;
long long ans=;
if(l<=mid)
ans+=query(x*, l, r);
if(r>mid)
ans+=query(x*+, l, r);
return ans;
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
buildtree(, , n);
for(int i=;i<=m;i++)
{
int op;
scanf("%d",&op);
if(op==)
{
int x,y;
long long k;
scanf("%d%d%lld",&x,&y,&k);
modify(, x, y, k);
}
else
{
int x,y;
scanf("%d%d",&x,&y);
printf("%lld\n",query(, x, y));
}
}
} 树剖
#include<bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
using namespace std;
#define maxn 600009
int dfn[maxn],cnt,pos[maxn],son[maxn],en[maxn],top[maxn],size[maxn],fa[maxn],deep[maxn];
vector<int> v[maxn];
struct node{
int l,r;
int val,mark;
}tr[maxn*];
int n,m,r,mod;
int a[maxn];
void dfs(int rt)
{
size[rt]=;
for(int i=;i<v[rt].size();i++)
{
int to=v[rt][i];
if(!size[to])
{
fa[to]=rt;
deep[to]=deep[rt]+;
dfs(to);
size[rt]+=size[to];
if(size[to]>size[son[rt]])son[rt]=to;
}
}
}
void dfs(int x,int tp)
{
top[x]=tp;
cnt++;
pos[x]=cnt;
dfn[cnt]=x;
if(son[x]!=)dfs(son[x],tp);
for(int i=;i<v[x].size();i++)
{
int to=v[x][i];
if(!top[to])dfs(to,to);
}
en[x]=cnt;
}
void Build(int x,int l,int r)
{
tr[x].l=l,tr[x].r=r;
if(l==r)
{
tr[x].mark=;
tr[x].val=a[dfn[l]];
return;
}
int mid=(l+r)>>;
Build(x*,l,mid);
Build(x*+,mid+,r);
tr[x].mark=;
tr[x].val=tr[x*].val+tr[x*+].val;
tr[x].val%=mod;
}
void relese(int x)
{
if(tr[x].mark==||tr[x].l==tr[x].r)return;
tr[x*].val+=(tr[x*].r-tr[x*].l+)*tr[x].mark;
tr[x*].mark+=tr[x].mark;
tr[x*+].val+=(tr[x*+].r-tr[x*+].l+)*tr[x].mark;
tr[x*+].mark+=tr[x].mark;
tr[x*].val%=mod;
tr[x*].mark%=mod;
tr[x*+].mark%=mod;
tr[x*+].val%=mod;
tr[x].mark=;
}
void Add(int x,int l,int r,int val)
{
if(l<=tr[x].l&&tr[x].r<=r)
{
tr[x].val+=(tr[x].r-tr[x].l+)*val;
tr[x].val%=mod;
tr[x].mark+=val;
tr[x].mark%=mod;
return;
}
//cout<<x<<" "<<l<<" "<<r<<endl;
relese(x);
int mid=(tr[x].l+tr[x].r)>>;
if(l<=mid)Add(x*,l,r,val);
if(r>mid)Add(x*+,l,r,val);
tr[x].val=tr[x*].val+tr[x*+].val;
tr[x].val%=mod;
}
int Sum(int x,int l,int r)
{
if(l<=tr[x].l&&tr[x].r<=r)
{
return tr[x].val;
}
relese(x);
int mid=(tr[x].l+tr[x].r)>>;
int ans=;
if(l<=mid) ans+=Sum(x*,l,r);
if(r>mid) ans+=Sum(x*+,l,r);
ans%=mod;
return ans;
}
void LCA_add(int x,int y,int val)
{
while(top[x]!=top[y])
{
if(deep[top[x]]<deep[top[y]])swap(x,y);
Add(,pos[top[x]],pos[x],val);
x=fa[top[x]];
}
//if(x!=y)
//{
if(pos[x]>pos[y])swap(x,y);
Add(,pos[x],pos[y],val);
// }
}
int LCA_sum(int x,int y)
{
int res=;
while(top[x]!=top[y])
{
if(deep[top[x]]<deep[top[y]])swap(x,y);
res+=Sum(,pos[top[x]],pos[x]);
res%=mod;
x=fa[top[x]];
}
if(pos[x]>pos[y])swap(x,y);
res+=Sum(,pos[x],pos[y]); return res%mod;
}
signed main()
{
scanf("%d%d%d%d",&n,&m,&r,&mod);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(int i=;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
v[x].push_back(y);
v[y].push_back(x);
}
dfs(r);
dfs(r,r);
Build(,,n);
while(m--)
{
int opt;
scanf("%d",&opt);
if(opt==)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
LCA_add(x,y,z);
}else if(opt==)
{
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",LCA_sum(x,y));
}else if(opt==)
{
int x,z;
scanf("%d%d",&x,&z);
Add(,pos[x],en[x],z);
}else
{
int x;
scanf("%d",&x);
printf("%d\n",Sum(,pos[x],en[x]));
}
// for(int i=1;i<=n;i++)
// {
// printf("%d: %d\n",i,Sum(1,pos[i],pos[i]));
// }
}
return ;
} 树状数组
#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&-x
int n,m;
const int maxn=;
int c[maxn];
int a[maxn];
void Add(int x,int s)
{
while(x<=n)
{
c[x]+=s;
x+=lowbit(x);
}
}
int Get(int x)
{
int ans=;
while(x)
{
ans+=c[x];
x-=lowbit(x);
}
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
Add(i,a[i]);
}
while(m--)
{
int o,x,k;
scanf("%d%d%d",&o,&x,&k);
if(o==)
{
Add(x,k);
}else
{
printf("%d\n",Get(k)-Get(x-));
}
}
return ;
} St表
#include<bits/stdc++.h>
#define ll long long
#define inf 0x7fffffff
using namespace std;
int n,m;
#define maxn 100008
int d[maxn][];
int a[maxn];
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(int i=;i<=n;i++)d[i][]=a[i];
for(int j=;(<<j)<=n;j++)
{
for(int i=;i+(<<j)-<=n;i++)
{
d[i][j]=max(d[i][j-],d[i+(<<(j-))][j-]);
}
}
for(int i=;i<=m;i++)
{
int k=;
int l,r;
scanf("%d%d",&l,&r);
while(<<(k+)<=(r-l+))k++;
printf("%d\n",max(d[l][k],d[r-(<<k)+][k]));
} return ;
} Dijkstra
#include<bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
#define maxn 500005
using namespace std;
struct node{
int x,dis;
bool operator < (const node &a)const
{
return dis>a.dis;
}
};
int n,m;
vector<int> son[maxn],v[maxn];
void Set(int prt,int to,int d)
{
son[prt].push_back(to);
v[prt].push_back(d);
}
#define to son[rt.x][i]
int dis[maxn],tim=;
bool vis[maxn];
priority_queue<node> q;
void dijkstra(int s)
{
for(int i=;i<=n;i++)
{
dis[i]=inf;
}
memset(vis,,sizeof(vis));
q.push((node){s,});
dis[s]=;
while(!q.empty())
{
node rt=q.top();
q.pop();
if(vis[rt.x])
{
continue;
}
vis[rt.x]=;
for(int i=;i<son[rt.x].size();i++)
{
if(dis[to]>dis[rt.x]+v[rt.x][i])
{
dis[to]=dis[rt.x]+v[rt.x][i];
q.push((node){to,dis[to]});
}
}
}
}
int main()
{
int s;
scanf("%d%d%d",&n,&m,&s);
for(int i=;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
Set(x,y,z);
}
dijkstra(s);
for(int i=;i<=n;i++)
{
printf("%d ",dis[i]);
}
return ;
} Spfa
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x7fffffff
#define maxn 10009
int n,m,s;
vector<int> son[maxn],v[maxn];
void Add(int x,int y,int val)
{
son[x].push_back(y);
v[x].push_back(val);
}
struct node{
int x;
int dis;
};
int dis[maxn];
void spfa(int s)
{
for(int i=;i<=n;i++)dis[i]=inf;
queue<node> q;
q.push((node){s,});
dis[s]=;
while(!q.empty())
{
node now=q.front();
q.pop();
for(int i=;i<son[now.x].size();i++)
{
int to=son[now.x][i];
if(dis[to]>dis[now.x]+v[now.x][i])
{
dis[to]=dis[now.x]+v[now.x][i];
q.push((node){to,dis[to]});
}
}
}
}
signed main()
{
scanf("%d%d%d",&n,&m,&s);
for(int i=;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
Add(x,y,z);
}
spfa(s);
for(int i=;i<=n;i++)
{
printf("%d ",dis[i]);
}
return ;
} Tarjan
int n,m;
#define maxn 10009
vector<int> son[maxn];
int tim,size[maxn],belong[maxn],scc_cnt,cnt;
bool bein[maxn];
int st[maxn];
int dfn[maxn],low[maxn];
void Tarjan(int rt)
{
dfn[rt]=low[rt]=++tim;
st[++cnt]=rt;
for(int i=;i<son[rt].size();i++)
{
int to=son[rt][i];
if(!dfn[to])//正向边
{
Tarjan(to);
low[rt]=min(low[rt],low[to]);
}else if(!belong[to])//反向边
{
low[rt]=min(low[rt],dfn[to]);//能不能取到一个更早的点
}
}
if(dfn[rt]==low[rt])
{
//关键节点!!
scc_cnt++;
int k;
do{
k=st[cnt--];
belong[k]=scc_cnt;
size[scc_cnt]++;
}while(k!=rt);
}
} 二分图匹配
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x7fffffff
int n,m,e;
#define maxn 3009
vector<int> son[maxn];
int hav[maxn];
int vis[maxn];
int timemark=;
bool dfs(int x)
{
for(int i=;i<son[x].size();i++)
{
int to=son[x][i];
if(vis[to]==timemark)continue;
vis[to]=timemark;
if(!hav[to]||dfs(hav[to]))
{
hav[to]=x;
return ;
}
}
return ;
}
signed main()
{
scanf("%d%d%d",&n,&m,&e);
while(e--)
{
int u,v;
scanf("%d%d",&u,&v);
if(v>m||u>n)continue;
v+=;//!!!
son[u].push_back(v);
son[v].push_back(u);
}
int s=n;
for(int i=;i<=n;i++)
{
timemark++;
if(!dfs(i))s--;
}
printf("%d\n",s);
return ;
} 线性素数筛
#include<bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
using namespace std;
bool p[];
signed main()
{
int n,m;
memset(p,,sizeof(p));
p[]=;
scanf("%d%d",&n,&m);
for(int i=;i<=sqrt();i++)
{
if(p[i])
{
for(int j=i*;j<=;j+=i)p[j]=;
}
}
for(int i=;i<=m;i++)
{
int x;
scanf("%d",&x);
if(p[x])printf("Yes\n");
else printf("No\n");
}
return ;
} 差分树状数组
#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&-x
int n,m;
const int maxn=;
int c[maxn];
int a[maxn];
void Add(int x,int s)
{
while(x<=n)
{
c[x]+=s;
x+=lowbit(x);
}
}
int Get(int x)
{
int ans=;
while(x)
{
ans+=c[x];
x-=lowbit(x);
}
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
Add(i,a[i]);
Add(i+,-a[i]);
}
while(m--)
{
int o;
scanf("%d",&o);
if(o==)
{
int x,y,k;
scanf("%d%d%d",&x,&y,&k);
Add(x,k);
Add(y+,-k);
}else
{
int k;
scanf("%d",&k);
printf("%d\n",Get(k));
}
}
return ;
} dinic
#include<bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
using namespace std;
#define maxn 10009
#define maxm 100009
struct node{
int val,to;
int rev;//rev表示反边在to的vector当中下标是几
node(int _to,int _val,int _rev)
{
to=_to;
val=_val;
rev=_rev;
}
};
vector<node> son[maxn];
int d[maxn];
int n,m,s,t;
void add(int x,int y,int w)
{
son[x].push_back(node(y,w,son[y].size()));
son[y].push_back(node(x,,son[x].size()-));
}
int ans=;
bool bfs()
{
memset(d,-,sizeof(d));
queue<int> q;
q.push(s);
d[s]=;
while(!q.empty())
{
int x=q.front();
q.pop();
for(int i=;i<son[x].size();i++)
{
int y=son[x][i].to;
if(d[y]==- && son[x][i].val)
{
q.push(y);
d[y]=d[x]+;
}
}
}
if(d[t]==-)return ;
return ;
}
int dfs(int x,int low)//x 表示当前节点,low表示当前到x的最小参量
{
if(x==t||low==) return low;
int s=;
for(int i=;i<son[x].size();i++)
{
int y=son[x][i].to;
int rev=son[x][i].rev;
if(d[y]==d[x]+&&son[x][i].val>)
{
int a=dfs(y,min(low,son[x][i].val));//当前
son[x][i].val-=a;
son[y][rev].val+=a;
low-=a;
s+=a;
if(low==) return s;
}
}
if(low!=)//流到x的流量会有冗余,在这一轮dfs之后就在不会到x了
{
d[x]=-;
}
return s;
}
void dinic()
{
while(bfs())
{
ans+=dfs(s,inf);
}
}
int main()
{
scanf("%d%d%d%d",&n,&m,&s,&t);
for(int i=;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
//dinic
dinic();
printf("%d\n",ans);
return ;
} 快速幂取余
#include<bits/stdc++.h>
#define ll long long
ll d,p,k;
ll cal(ll x,ll y)
{
ll ans=;
for(;y;x=x*x%k,y>>=)
if(y&)ans=ans*x%k;
return ans;
}
using namespace std;
int main()
{
cin>>d>>p>>k;
cout<<d<<"^"<<p<<" mod "<<k<<"="<<cal(d,p)%k<<endl;
return ;
}
CSP/NOIP c++常用模板的更多相关文章
- NDK(10)Android.mk各属性简介,Android.mk 常用模板
参考 : http://blog.csdn.net/hudashi/article/details/7059006 本文内容: Android.mk简介, 各属性表, 常用Android.mk模板 1 ...
- IDEA学习——模板及其常用模板
模板及其常用模板 (1)psvm (2)sout sout / soutp / soutv / 变量.sout (3)fori iter增强for循环 itar普通for循环 (4)list.for ...
- Vue常用模板语法
常用模板语法 本篇将在上一篇的基础上记录文本渲染.表达式.过滤器以及常用指令的简单用法. 一.文本渲染 Vue支持动态渲染文本,即在修改属性的同时,实时渲染文本内容.同时为了提高渲染效率,也支持只 ...
- html5常用模板下载网站
html5常用模板下载网站 开创者素材.站长素材.模板之家 推荐葡萄家园素材网,他们网页模板栏目有个HTML模板,很多静态源码.应该是你所需要的. html静态页面模板 还是服饰素材啊 朋友 设计云 ...
- NDK(10)Android.mk各属性简介,Android.mk 常用模板--未完
参考 : http://blog.csdn.net/hudashi/article/details/7059006 1. Android.mk简介 Android.mk文件是GNU Makefile的 ...
- WordPress主题模板层次和常用模板函数
首页: home.php index.php 文章页: single-{post_type}.php – 如果文章类型是videos(即视频),WordPress就会去查找single-videos. ...
- hdu1251+字典树常用模板
这里只简单给出几个常用的字典树的模板,要看具体介绍的请看:传送门 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现) ...
- NOIP经典基础模板总结
date: 20180820 spj: 距离NOIP还有81天 目录 STL模板: priority_queue 的用法:重载<,struct cmpqueue 的用法 stack 的用法vec ...
- spring boot ----> 常用模板freemarker和thymeleaf
===========================freemarker=================================== freemarker 官网:https://freem ...
随机推荐
- 关于mysql数据库远程访问
mysql数据库安装默认为只能本地访问,若需远程连接需根据不同的操作系统做一些操作 Windows: 新装的mysql本地无法登录,显示为1045错误 mysql#1045(1045Access de ...
- Linux设备驱动程序 之 vmalloc
vmalloc()函数的工作方式类似于kmalloc(),只不过在前者分配的内存虚拟地址是连续的,而物理地址则无须连续:这也是用户空间分配函数的工作方式:由malloc()返回的页在进程的虚拟地址空间 ...
- SQL-W3School-高级:SQL BETWEEN 操作符
ylbtech-SQL-W3School-高级:SQL BETWEEN 操作符 1.返回顶部 1. BETWEEN 操作符在 WHERE 子句中使用,作用是选取介于两个值之间的数据范围. BETWEE ...
- kotlin之null值安全性
var a: String =null // 编译错误 var a: String? =null // 编译通过 要允许null值, 需要将变量声明为可为null的字符串类型:String? fun ...
- cs6.8-oracle挂载ceph
https://ceph-users.ceph.narkive.com/EgcYJhbG/hammer-0-94-1-still-getting-feature-set-mismatch-for-ce ...
- postgresql之 drop & delete & truncate
官网:https://www.postgresql.org/docs/8.1/sql-droptable.html Name DROP TABLE -- remove a table Synopsis ...
- uni-app 时间格式问题 new Date(str) IOS系统跟Android系统不兼容
今天做了一个需求,要在列表中把后台返回来的时间给显示出来,使用 new Date(str) 在微信开发者工具上显示是没有问题的,然后在IOS系统上显示是NAN. 原因是 IOS系统只识别 " ...
- 【ML】seq2seq原理
最近要做分享,重温seq2seq原理,这篇文章讲的挺清楚: https://zhuanlan.zhihu.com/p/40920384 https://www.jianshu.com/p/b2b95f ...
- 一个可以让vsftpd启动系统用户登陆ftp的例子
编辑 /etc/vsftpd.conf 如下: listen=YES anonymous_enable=NO local_enable=YES check_shell=NO write_enable= ...
- PHP 调用C# WebService
在VS2010中新建WebService:Finance.asmx 代码如下: using System.Web.Services; namespace WebTest.WebService { // ...