NOIP模板整理计划
先占个坑
[update]NOIp结束了,已弃 PS:貌似只整理了图论和一点数据结构......
一、图论
1.单源最短路
(1)spfa
已加SLF优化 419ms
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #include <cstring>
- using namespace std;
- const int N=1e4+,M=5e5+,INF=;
- inline int read(){
- char c=getchar();int x=,f=;
- while(c<''||c>''){if(c=='-')f=-;c=getchar();}
- while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
- return x*f;
- }
- int n,m,s,u,v,w;
- struct edge{
- int v,ne,w;
- }e[M<<];
- int h[N],cnt=;
- inline void ins(int u,int v,int w){
- cnt++;
- e[cnt].v=v;e[cnt].w=w;e[cnt].ne=h[u];h[u]=cnt;
- }
- inline void lop(int &x){if(x==N) x=;else if(x==) x=N-;}
- int d[N],q[N],head,tail,inq[N];
- void spfa(int s){
- for(int i=;i<=n;i++) d[i]=INF;
- head=tail=;
- q[tail++]=s;inq[s]=;d[s]=;
- while(head!=tail){
- int u=q[head++];inq[u]=;lop(head);
- for(int i=h[u];i;i=e[i].ne){
- int v=e[i].v,w=e[i].w;
- if(d[v]>d[u]+w){
- d[v]=d[u]+w;
- if(!inq[v]){
- if(d[v]<d[q[head]]) head--,lop(head),q[head]=v;
- else q[tail++]=v,lop(tail);
- inq[v]=;
- }
- }
- }
- }
- }
- int main(){
- n=read();m=read();s=read();
- for(int i=;i<=m;i++){u=read();v=read();w=read();ins(u,v,w);}
- spfa(s);
- for(int i=;i<=n;i++) printf("%d ",d[i]);
- }
(2)dijkstra 503ms
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #include <cstring>
- #include <queue>
- using namespace std;
- const int N=1e4+,M=5e5+,INF=;
- inline int read(){
- char c=getchar();int x=,f=;
- while(c<''||c>''){if(c=='-')f=-;c=getchar();}
- while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
- return x;
- }
- int n,m,s,u,v,w;
- struct edge{
- int v,ne,w;
- }e[M];
- int h[N],cnt=;
- inline void ins(int u,int v,int w){
- cnt++;
- e[cnt].v=v;e[cnt].w=w;e[cnt].ne=h[u];h[u]=cnt;
- }
- struct hn{
- int u,d;
- hn(int a=,int b=):u(a),d(b){}
- bool operator <(const hn &r)const{return d>r.d;}
- };
- priority_queue<hn> q;
- int d[N],done[N];
- void dij(int s){
- for(int i=;i<=n;i++) d[i]=INF;
- d[s]=;
- q.push(hn(s,));
- while(!q.empty()){
- hn x=q.top();q.pop();
- int u=x.u;if(done[u]) continue;
- done[u]=;
- for(int i=h[u];i;i=e[i].ne){
- int v=e[i].v,w=e[i].w;
- if(d[v]>d[u]+w){
- d[v]=d[u]+w;
- if(!done[v]) q.push(hn(v,d[v]));//xiao you hua
- }
- }
- }
- }
- int main(){
- n=read();m=read();s=read();
- for(int i=;i<=m;i++){u=read();v=read();w=read();ins(u,v,w);}
- dij(s);
- for(int i=;i<=n;i++) printf("%d ",d[i]);
- }
(3)dijkstra+配对堆 380ms 吊打用SLF优化的spfa啊啊啊啊啊 [2017-01-14]
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #include <ext/pb_ds/priority_queue.hpp>
- #define pa pair<int,int>
- #define mp make_pair
- using namespace std;
- using namespace __gnu_pbds;
- typedef __gnu_pbds::priority_queue<pa,greater<pa>,thin > heap;
- const int N=1e4+,M=5e5+,INF=;
- inline int read(){
- char c=getchar();int x=,f=;
- while(c<''||c>''){if(c=='-')f=-;c=getchar();}
- while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
- return x*f;
- }
- int n,m,s,u,v,w;
- struct edge{
- int v,ne,w;
- }e[M];
- int h[N],cnt=;
- inline void ins(int u,int v,int w){
- cnt++;
- e[cnt].v=v;e[cnt].w=w;e[cnt].ne=h[u];h[u]=cnt;
- }
- heap q;
- heap::point_iterator it[N];
- int d[N];
- void dij(int s){
- for(int i=;i<=n;i++) d[i]=INF;
- d[s]=;
- it[s]=q.push(mp(,s));
- while(!q.empty()){
- int u=q.top().second;q.pop();
- for(int i=h[u];i;i=e[i].ne){
- int v=e[i].v,w=e[i].w;
- if(d[v]>d[u]+w){
- d[v]=d[u]+w;
- if(it[v]!=) q.modify(it[v],mp(d[v],v));
- else it[v]=q.push(mp(d[v],v));
- }
- }
- }
- }
- int main(){
- n=read();m=read();s=read();
- for(int i=;i<=m;i++){u=read();v=read();w=read();ins(u,v,w);}
- dij(s);
- for(int i=;i<=n;i++) printf("%d ",d[i]);
- }
2.判负环
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #include <cstring>
- using namespace std;
- const int N=1e3+,M=1e5+,INF=1e9+;
- inline int read(){
- char c=getchar();int x=,f=;
- while(c<''||c>''){if(c=='-')f=-;c=getchar();}
- while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
- return x*f;
- }
- int n,m,s,u,v,w;
- struct edge{
- int v,ne,w;
- }e[M+N];
- int h[N],cnt=;
- inline void ins(int u,int v,int w){
- cnt++;
- e[cnt].v=v;e[cnt].w=w;e[cnt].ne=h[u];h[u]=cnt;
- }
- inline void lop(int &x){x++;if(x==N) x=;}
- int q[N],head=,tail=,inq[N];
- int d[N],nc[N];
- bool spfa(int s){
- head=tail=;
- for(int i=;i<=n;i++) d[i]=INF,inq[i]=nc[i]=;
- q[tail]=s;inq[s]=nc[s]=; lop(tail);
- d[s]=;
- while(head!=tail){
- int u=q[head];inq[u]=; lop(head);
- for(int i=h[u];i;i=e[i].ne){
- int v=e[i].v,w=e[i].w;
- if(d[v]>d[u]+w){
- d[v]=d[u]+w;
- if(!inq[v]){
- inq[v]=;q[tail]=v; lop(tail);
- if(++nc[v]>n) return false;
- }
- }
- }
- }
- return true;
- }
- int main(){
- n=read();m=read();s=read();
- for(int i=;i<=m;i++){
- u=read();v=read();w=read();
- if(u==v&&w<) {printf("-1");return ;}
- if(u!=v)ins(u,v,w);
- }
- int ss=n+;//超级源
- for(int i=;i<=n;i++) ins(ss,i,);
- int flag=spfa(ss);
- if(!flag){printf("-1");return ;}
- spfa(s);
- for(int i=;i<=n;i++){
- if(d[i]>=INF) printf("NoPath\n");
- else printf("%d\n",d[i]);
- }
- }
3.最小生成树
kruskal
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #include <cstring>
- using namespace std;
- const int N=,M=2e5+,INF=1e9+;
- inline int read(){
- char c=getchar();int x=,f=;
- while(c<''||c>''){if(c=='-')f=-;c=getchar();}
- while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
- return x*f;
- }
- int n,m,u,v,w;
- int cnt=;
- struct edge{
- int u,v,w;
- bool operator <(const edge &r)const{return w<r.w;}
- }e[M];
- int fa[N];
- inline int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
- int kruskal(){
- int ans=,cnt=;
- for(int i=;i<=n;i++) fa[i]=i;
- sort(e+,e++m);
- for(int i=;i<=m;i++){
- int u=e[i].u,v=e[i].v,w=e[i].w;
- int f1=find(u),f2=find(v);
- if(f1!=f2){
- ans+=w;
- fa[f1]=f2;
- cnt++;
- if(cnt==n-) break;
- }
- }
- return ans;
- }
- int main(){
- n=read();m=read();
- for(int i=;i<=m;i++){
- e[i].u=read();e[i].v=read();e[i].w=read();
- }
- int ans=kruskal();
- printf("%d",ans);
- }
4.floyd
(1)传递闭包
d[i][j]=d[i][j]||(d[i][k]&&d[k][j])
(2)最小环
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #include <cstring>
- using namespace std;
- const int N=,M=1e4+,INF=1e8+;//1E9+1E9+1E9溢出
- inline int read(){
- char c=getchar();int x=,f=;
- while(c<''||c>''){if(c=='-')f=-;c=getchar();}
- while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
- return x*f;
- }
- int n,m,u,v,w,g[N][N];
- int d[N][N],ans=INF;
- void floyd(){
- ans=INF;
- for(int k=;k<=n;k++){
- for(int i=;i<=k-;i++)
- for(int j=i+;j<=k-;j++)
- ans=min(ans,g[i][k]+g[k][j]+d[i][j]);
- for(int i=;i<=n;i++)
- for(int j=;j<=n;j++)
- d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
- }
- }
- int main(){
- while(scanf("%d%d",&n,&m)!=EOF){
- for(int i=;i<=n;i++) for(int j=i+;j<=n;j++) d[i][j]=d[j][i]=g[i][j]=g[j][i]=INF;
- for(int i=;i<=m;i++){
- u=read();v=read();w=read();
- d[u][v]=d[v][u]=g[u][v]=g[v][u]=w;
- }
- floyd();
- if(ans==INF) puts("No solution.");
- else printf("%d\n",ans);
- }
- }
5.割点
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #include <cstring>
- using namespace std;
- const int N=1e5+,M=1e5+,INF=1e9+;
- inline int read(){
- char c=getchar();int x=,f=;
- while(c<''||c>''){if(c=='-')f=-;c=getchar();}
- while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
- return x;
- }
- int n=,m,u,v;
- struct edge{
- int v,ne;
- }e[M<<];
- int h[N],cnt=;
- inline void ins(int u,int v){
- cnt++;
- e[cnt].v=v;e[cnt].ne=h[u];h[u]=cnt;
- cnt++;
- e[cnt].v=u;e[cnt].ne=h[v];h[v]=cnt;
- }
- int dfn[N],low[N],dfc=,iscut[N];
- void dfs(int u,int fa){
- dfn[u]=low[u]=++dfc;
- int child=;
- for(int i=h[u];i;i=e[i].ne){
- int v=e[i].v;
- if(!dfn[v]){
- child++;
- dfs(v,u);
- low[u]=min(low[u],low[v]);
- if(low[v]>=dfn[u]) iscut[u]=;
- }else if(v!=fa) low[u]=min(low[u],dfn[v]);
- }
- if(fa==&&child==) iscut[u]=;
- }
- int main(){
- n=read();m=read();
- for(int i=;i<=m;i++){u=read();v=read();ins(u,v);}
- for(int i=;i<=n;i++) if(!dfn[i]) dfs(i,);
- int ans=;
- for(int i=;i<=n;i++) if(iscut[i]) ans++;
- printf("%d\n",ans);
- for(int i=;i<=n;i++) if(iscut[i]) printf("%d ",i);
- }
6.tarjan 强连通分量
POJ2186
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #include <cmath>
- using namespace std;
- const int N=1e4+,M=5e4+;
- typedef long long ll;
- inline int read(){
- char c=getchar();int x=,f=;
- while(c<''||c>''){if(c=='-')f=-;c=getchar();}
- while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
- return x*f;
- }
- int n,m,u,v;
- struct edge{
- int v,ne;
- }e[M];
- int h[N],cnt=;
- inline void ins(int u,int v){
- cnt++;
- e[cnt].v=v;e[cnt].ne=h[u];h[u]=cnt;
- }
- int dfn[N],belong[N],low[N],dfc,scc,st[N],top;
- int size[N];
- void dfs(int u){
- dfn[u]=low[u]=++dfc;
- st[++top]=u;
- for(int i=h[u];i;i=e[i].ne){
- int v=e[i].v;
- if(!dfn[v]){
- dfs(v);
- low[u]=min(low[u],low[v]);
- }else if(!belong[v])
- low[u]=min(low[u],dfn[v]);
- }
- if(low[u]==dfn[u]){
- scc++;
- while(true){
- int x=st[top--];
- belong[x]=scc;
- size[scc]++;
- if(x==u) break;
- }
- }
- }
- int outd[N],ind[N],ans;
- void point(){
- for(int u=;u<=n;u++)
- for(int i=h[u];i;i=e[i].ne){
- int v=e[i].v;
- if(belong[u]!=belong[v]) outd[belong[u]]++,ind[belong[v]]++;
- }
- }
- int main(){
- n=read();m=read();
- for(int i=;i<=m;i++){u=read();v=read();ins(u,v);}
- for(int i=;i<=n;i++) if(!dfn[i]) dfs(i);
- point();
- for(int i=;i<=scc;i++){
- if(outd[i]==){
- if(ans){ans=;break;}
- else ans=size[i];
- }
- }
- printf("%d",ans);
- }
7.二分图染色
- bool color(int u,int c){
- col[u]=c;
- for(int i=h[u];i;i=e[i].ne){
- int v=e[i].v;
- if(col[u]==col[v]) return false;
- if(!col[v]&&!color(v,-c)) return false;
- }
- return true;
- }
8.二分图最大匹配
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #include <cstring>
- using namespace std;
- const int N=;
- inline int read(){
- char c=getchar();int x=,f=;
- while(c<''||c>''){if(c=='-')f=-;c=getchar();}
- while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
- return x*f;
- }
- int n,m,s,u,v;
- struct edge{
- int v,ne;
- }e[N*N<<];
- int h[N],cnt=;
- inline void ins(int u,int v){
- cnt++;
- e[cnt].v=v;e[cnt].ne=h[u];h[u]=cnt;
- }
- int vis[N],le[N];
- bool find(int u){
- for(int i=h[u];i;i=e[i].ne){
- int v=e[i].v;
- if(!vis[v]){
- vis[v]=;
- if(!le[v]||find(le[v])){
- le[v]=u;
- return true;
- }
- }
- }
- return false;
- }
- int ans=;
- void hungary(){
- for(int i=;i<=n;i++){
- memset(vis,,sizeof(vis));
- if(find(i)) ans++;
- }
- }
- int main(){
- n=read();m=read();int t=read();
- for(int i=;i<=t;i++){u=read();v=read();if(v>m)continue;ins(u,v);}
- ans=;
- hungary();
- printf("%d\n",ans);
- }
数据结构
1.st表
- int a[N],f[N][];
- void init(int n){
- for(int i=;i<=n;i++) f[i][]=a[i];
- for(int j=;j<=;j++)
- for(int i=;i+(<<j)-<=n;i++)
- f[i][j]=min(f[i][j-],f[i+(<<(j-))][j-]);
- }
- int RMQ(int l,int r){
- int k=log(r-l+)/log(); //2^k<=l~r
- return min(f[l][k],f[r-(<<k)+][k]);
- }
2.trie树
- int ch[N*L][],size=,val[N*L];
- void insert(char s[],int n,int id){
- int u=;
- for(int i=;i<=n;i++){
- int v=s[i]-'a';
- if(!ch[u][v]) ch[u][v]=++size;
- u=ch[u][v];
- }
- val[u]=id;//printf("ins %d %d\n",u,id);
- }
3.单调栈
求最大全flag子矩阵
- void sol(int flag){
- memset(tot,,sizeof(tot));
- for(int i=;i<=n;i++){
- top=;
- for(int j=;j<=m;j++){
- if(a[i][j]==flag) tot[j]++;
- else tot[j]=;
- data t;
- t.h=tot[j];t.l=;t.pos=j;
- while(top&&st[top].h>=t.h){
- int l=st[top].l+j--st[top].pos,h=st[top].h;
- ans1=max(ans1,min(l,h)*min(l,h));
- ans2=max(ans2,l*h);
- t.l+=st[top].l;
- top--;
- }
- st[++top]=t;
- }
- while(top){
- int l=st[top].l+m-st[top].pos,h=st[top].h;
- ans1=max(ans1,min(l,h)*min(l,h));
- ans2=max(ans2,l*h);
- top--;
- }
- }
- }
4.单调队列
q[]保存的是下标
- 删除
- while(head<=tail&&q[head]<=i-k) head++; //也可能<
- 插入
- while(head<=tail&&a[q[tail]]>a[i]) tail--;//单增
- q[++tail]=i;
5.并查集
带权
- for(int i=;i<=n;i++) fa[i]=i,d[i]=,s[i]=;
- int fa[N],d[N],s[N];
- inline int find(int x){
- if(x==fa[x]) return x;
- int root=find(fa[x]);
- d[x]+=d[fa[x]];
- return fa[x]=root;
- }
6.树状数组
7.线段树
NOIP模板整理计划的更多相关文章
- [转]开源中国的 IT 公司开源软件整理计划介绍
[转]开源中国的 IT 公司开源软件整理计划介绍 http://www.oschina.net/news/61534/oschina-opensource-collection-plan-for-it ...
- 4632 NOIP[2015] 运输计划
4632 NOIP[2015] 运输计划 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题解 题目描述 Description 公元 2044 ...
- [NOIP 2015]运输计划-[树上差分+二分答案]-解题报告
[NOIP 2015]运输计划 题面: A[NOIP2015 Day2]运输计划 时间限制 : 20000 MS 空间限制 : 262144 KB 问题描述 公元 2044 年,人类进入了宇宙纪元. ...
- Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分)
Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分) Description L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之 ...
- Noip数学整理
目录 Noip数学整理 序 1 取模相关 2 质数相关 3.基本操作 4.方程相关 5.数列相关 6.函数相关 Noip数学整理 序 因为某些原因, Noip对于数学方面的考纲仅停留在比较小的一部分, ...
- NOIP模板总结
NOIP模板总结 进考场先打一份缺省源: # include <cstdio> # include <iostream> # include <cstring> # ...
- wawawa8的模板复习计划
wawawa8的模板复习计划 数据结构 //手写堆 [link][https://www.luogu.org/problemnew/show/P3378] //并查集 [link][https://w ...
- 字符串系列——KMP模板整理
KMP模板整理 KMP与扩展KMP: /*vs 2017/ vs code以外编译器,去掉windows.h头文件和system("pause");*/ #include<i ...
- 开源中国的 IT 公司开源软件整理计划介绍
直击现场 <HTML开发MacOSApp教程> http://pan.baidu.com/s/1jG1Q58M 开源中国的 IT 公司开源软件整理计划介绍 oschina 发布于: 20 ...
随机推荐
- 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)
通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 ja ...
- 记一次debug记录:Uncaught SyntaxError: Unexpected token ILLEGAL
在使用FIS3搭建项目的时候,遇到了一些问题,这里记录下. 这里是发布搭建代码: // 代码发布时 fis.media('qa') .match('*.{js,css,png}', { useHash ...
- ADO.NET对象的详解
1. Connection 类 和数据库交互,必须连接它.连接帮助指明数据库服务器.数据库名字.用户名.密码,和连接数据库所需要的其它参数.Connection对象会被Command对象使用,这样就能 ...
- SSH实战 · 唯唯乐购项目(下)
后台模块 一:后台用户模块 引入后台管理页面 创建adminuser表: CREATE TABLE `adminuser` ( `uid` int(11) NOT NULL AUTO_INCREM ...
- ABP文档 - 异常处理
文档目录 本节内容: 简介 启用错误处理 非AJAX请求 显示异常 UserFriendlyException Error 模型 AJAX 请求 异常事件 简介 这个文档针对Asp.net Mvc和W ...
- 再谈CAAnimation动画
CAAnimaton动画分为CABasicAnimation & CAKeyframeAnimation CABasicAnimation动画, 顾名思义就是最基本的动画, 老规矩先上代码: ...
- const,static,extern 简介
const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ...
- 参考bootstrap中的popover.js的css画消息弹框
前段时间小颖的大学同学给小颖发了一张截图,图片类似下面这张图: 小颖当时大概的给她说了下,其实小颖也不知道上面那个三角形怎么画嘻嘻,给她说了DOM结构,具体的css让她自己百度,今天小颖自己参考boo ...
- 谈谈一些有趣的CSS题目(八)-- 纯CSS的导航栏Tab切换方案
开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...
- Solr 排除查询
前言 solr排除查询也就是我们在数据库和程序中经常处理的不等于,solr的语法是在定语前加[-].. StringBuilder sbHtml=new StringBuilder(); shBhtm ...