蒟蒻目前还是提高组选手,模板将会持续更新!

目录:
线段树 对拍 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++常用模板的更多相关文章

  1. NDK(10)Android.mk各属性简介,Android.mk 常用模板

    参考 : http://blog.csdn.net/hudashi/article/details/7059006 本文内容: Android.mk简介, 各属性表, 常用Android.mk模板 1 ...

  2. IDEA学习——模板及其常用模板

    模板及其常用模板 (1)psvm (2)sout sout / soutp / soutv / 变量.sout (3)fori iter增强for循环 itar普通for循环 (4)list.for ...

  3. Vue常用模板语法

    常用模板语法   本篇将在上一篇的基础上记录文本渲染.表达式.过滤器以及常用指令的简单用法. 一.文本渲染 Vue支持动态渲染文本,即在修改属性的同时,实时渲染文本内容.同时为了提高渲染效率,也支持只 ...

  4. html5常用模板下载网站

    html5常用模板下载网站 开创者素材.站长素材.模板之家 推荐葡萄家园素材网,他们网页模板栏目有个HTML模板,很多静态源码.应该是你所需要的. html静态页面模板 还是服饰素材啊 朋友 设计云 ...

  5. NDK(10)Android.mk各属性简介,Android.mk 常用模板--未完

    参考 : http://blog.csdn.net/hudashi/article/details/7059006 1. Android.mk简介 Android.mk文件是GNU Makefile的 ...

  6. WordPress主题模板层次和常用模板函数

    首页: home.php index.php 文章页: single-{post_type}.php – 如果文章类型是videos(即视频),WordPress就会去查找single-videos. ...

  7. hdu1251+字典树常用模板

    这里只简单给出几个常用的字典树的模板,要看具体介绍的请看:传送门 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现) ...

  8. NOIP经典基础模板总结

    date: 20180820 spj: 距离NOIP还有81天 目录 STL模板: priority_queue 的用法:重载<,struct cmpqueue 的用法 stack 的用法vec ...

  9. spring boot ----> 常用模板freemarker和thymeleaf

    ===========================freemarker=================================== freemarker 官网:https://freem ...

随机推荐

  1. Js 之将字符串当变量使用

    var page1 = 0; var p = "page1"; //修改值 window[p] += 1; var value = eval(p);

  2. easyUI的c if

    {field:'domdistrict2',title:'区县',width:100}, {field:'option',title:'操作',width:fixWidth(0.08),align:' ...

  3. varnish web cache服务

    varnish介绍 缓存开源解决方案: - varnish - 充分利用epoll机制(能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率),并发量大,单连接资源较轻 - squid ...

  4. THREE.js(一)

    //创建场景 var scene = new THREE.Scene(); //透视摄像机(视野角度,长宽比,远剪切面,进剪切面,) var camera = new THREE.Perspectiv ...

  5. spaCy 第一篇:核心类型

    spaCy 是一个号称工业级的自然语言处理工具包,最核心的数据结构是Doc和Vocab.Doc对象包含Token的序列和Token的注释(Annotation),Vocab对象是spaCy使用的词汇表 ...

  6. smarty获得当前url的方法分享

    http://{$smarty.server.SERVER_NAME}/{$smarty.server.REQUEST_URI} 注释: 复制代码代码如下: {$smarty.server.SERVE ...

  7. JavaScript 运行机制:Event事件循环机制

    JavaScript Event事件循环机制 JS是单线程的,浏览器只分配一个主线程给JS.一次只能执行一个任务,当前任务执行完后在可以执行下一个任务.任务多时,就会形成任务队列排队等待执行.但是非常 ...

  8. CockroachDB学习笔记——[译]Scaling Raft

    原文链接:https://www.cockroachlabs.com/blog/scaling-raft/ 原作者:Ben Darnell 原文日期:Jun 11, 2015 译:zifeiy 在Co ...

  9. 【leetcode】504. Base 7

    problem 504. Base 7 solution: class Solution { public: string convertToBase7(int num) { ) "; st ...

  10. 1-3 RHEL7操作系统的安装

    RHEL7操作系统的安装 本节所讲内容: q  RHEL7.2操作系统的安装 第1章 RHEL7系统安装 1.1 安装软件准备: 需要的软件如下: Vmware workstation 12(含注册码 ...