模板练习(LUOGU)
1:并查集
P3183食物链
#define man 300050
int fa[man],opt,x,y,fx,fy,n,k,ans=;
int find(int x){
if(fa[x]==x) return fa[x];
return fa[x]=find(fa[x]);
}
int main(){
n=read();k=read();
for(rint i=;i<=*n;i++) fa[i]=i;
//[1,n]同类;[n+1,2*n]猎物;[2*n+1,3*n]天敌;
for(rint i=;i<=k;i++){
opt=read();x=read();y=read();
if(x>n||y>n){ ans++;continue;}
if(opt==){
if(find(x+n)==find(y)||find(x+n+n)==find(y)){ ans++;continue;}
//y是x的猎物或者天敌,谎言
fa[find(x)]=find(y);//x的同类是y的同类
fa[find(x+n)]=find(y+n);//x的猎物是y的猎物
fa[find(x+n+n)]=find(y+n+n);//x的天敌是y的天敌
}
else if(opt==){
if(find(x)==find(y)||find(x+n+n)==find(y)){ ans++;continue;}
//x是y的同类或者y是x的天敌,谎言
fa[find(x)]=find(y+n+n);//y的天敌是x
fa[find(x+n)]=find(y);//x的猎物是y
fa[find(x+n+n)]=find(y+n);//x的天敌是y的猎物(由循环关系可得)
}
}
cout<<ans<<endl;
return ;
}
2.单调队列
P1638逛画展
int n,m;
int pos[];//第i个画师的最后出现的下标
int pic[];//画作
int cnt,l=;//已经出现的画师的数量及不断更新的左端点
int ml=,mr=,ans=1e9+;//最终答案的左右端点及区间的长度 int main(){
n=read();m=read();
memset(pos,,sizeof(pos));
for(rint i=;i<=n;i++){
pic[i]=read();
if(!pos[pic[i]]) cnt++;//如果之前的画师没有出现过,那么cnt+1
pos[pic[i]]=i;//将画师的下标更新到最新的一幅
while(l!=i && l<pos[pic[l]]) l++;//如果最左边的画师的作品在后面的枚举中出现过,那么就可以向后移动一个
if(cnt==m && i-l+<ans)//如果数量足够并且区间的长度更有,那么更新
ml=l,mr=i,ans=i-l+;
}
cout<<ml<<" "<<mr<<endl;
return ;
}
3.差分约束
求最小值时用最长路,求最大值是用最短路
P3275 [SCOI2011]糖果
#define man 1000050
int n,m;
struct edge{ int next,to,dis;}e[man];
int head[man<<],num=;
inline void add(int from,int to,int dis){
e[++num]=(edge){head[from],to,dis};
head[from]=num;
}
int dis[man],vis[man],cnt[man];
inline void spfa(int s){
queue<int>q;
memset(dis,,sizeof(dis));
memset(vis,,sizeof(vis));
//memset(cnt,0,sizeof(cnt));
dis[s]=;vis[s]=;q.push(s);
do{
int u=q.front();q.pop();vis[u]=;cnt[u]++;
if(cnt[u]>n){ printf("-1\n");exit();}
for(rint i=head[u];i;i=e[i].next){
int to=e[i].to;
if(dis[to]<dis[u]+e[i].dis){
dis[to]=dis[u]+e[i].dis;
if(!vis[to]){
vis[to]=;
q.push(to);
}
}
}
}while(q.size());
}
int main(){
//printf("%.3lf M\n",(double)sizeof(e)/(1<<20));
n=read();m=read();
for(rint i=,opt,x,y;i<=m;i++){
opt=read();x=read();y=read();
if(opt==) add(x,y,),add(y,x,);
if(opt==) add(x,y,);
if(opt==) add(y,x,);
if(opt==) add(y,x,);
if(opt==) add(x,y,);
if(opt%==&&x==y){
printf("-1\n");
return ;
}
}
for(rint i=n;i>=;i--) add(,i,);
spfa();
long long ans=;
for(rint i=;i<=n;i++){
ans+=dis[i];
}
printf("%lld\n",ans);
return ;
}
4.二分图匹配
P2055 假期的宿舍
#define man 55 int T,n;
int a[man],b[man],c[man][man],tot,ans;
int used[man],link[man]; bool find(int s){
for(rint i=;i<=n;i++){
if(a[i]==)
if(c[s][i]==&&used[i]==){
used[i]=;
if(link[i]==||find(link[i])){
link[i]=s;
return ;
}
}
}
return ;
} int main(){
T=read();
while(T--){
n=read();
memset(a,,sizeof(a));
memset(b,,sizeof(b));
memset(c,,sizeof(c));
memset(link,,sizeof(link));
for(rint i=;i<=n;i++) a[i]=read();
for(rint i=;i<=n;i++) b[i]=read();
for(rint i=,x;i<=n;i++)
for(rint j=;j<=n;j++){
x=read();
if(x==||i==j)
c[i][j]=;
}
ans=,tot=;
for(rint i=;i<=n;i++){
memset(used,,sizeof(used));
if(a[i]==||(a[i]==&&b[i]==)){
tot++;
if(find(i)) ans++;
}
}
if(ans==tot) printf("^_^\n");
else printf("T_T\n");
}
return ;
}
模板练习(LUOGU)的更多相关文章
- 线段树模板1 [Luogu P3372]
代码+注释: #include <iostream> #include <cstdio> using namespace std; int n, q, flag, x, y, ...
- [模板](luogu P3387)縮點
前言:對於這週的咕咕咕表示好像沒什麼好表示的,完全沒有靈感a......寫東西真的好難啊......於是又玩了半天鬼泣4???還挺好玩的 來源:題解 题目背景 缩点+DP 题目描述 给定一个n个点m条 ...
- 线性基(模板) LUOGU 3812
题面 解题思路 线性基,是构造出一组数:ax,ax-1-.a1,ax的二进制最高位为x.这些数字能异或和可以表示原来所有数的异或和.其实相当于一个高斯消元的过程.所以我们按位枚举,如果这一位曾经没数, ...
- AC自动机(模板) LUOGU P3808
传送门 解题思路 AC自动机,是解决多模匹配问题的算法,是字典树与kmp结合的算法,可以解决许多子串在文本串中出现的次数等信息.关键是实现一个fail指针,是指向更靠上的前缀相同字母,从而可以实现在文 ...
- 主席树 模板题 luogu([POI2014]KUR-Couriers)
求区间内是否有个数大于二分之一的数,有的话输出这个数,没有的话输出0. 在询问的时候,如果左边有sum大于这个limit,就可以继续求,如果右边有sum大于limit 也递归, 如果都不行,返回 0 ...
- 【模板】 非旋转treap
模板:luogu P3369 [模板]普通平衡树 code: #include <cstdio> #include <cstdlib> const int MAX_N=1000 ...
- 有关素数判断的一些算法(总结&&对比)
素性测试是数论题中比较常用的一个技巧.它可以很基础,也可以很高级(哲学).这次主要要介绍一下有关素数判断的奇技淫巧 素数的判断主要分为两种:范围筛选型&&单个判断型 我们先从范围筛选型 ...
- 浅谈博弈论中的两个基本模型——Bash Game&&Nim Game
最近在数学这一块搞了蛮多题目,已经解决了数论基础,线性代数(只有矩阵,行列式待坑),组合数学中的一些简单问题.所以接下来不可避免的对博弈论这一哲学大坑开工. 当然,由于我很菜,所以也只能从最基础最容易 ...
- 关于dijkstra的小根堆优化
YY引言 在NOI2018D1T1中出现了一些很震惊的情况,D1T1可以用最短路解决,但是大部分人都在用熟知的SPFA求解最短路.而SPFA的最坏复杂度能够被卡到$O(VE)$.就是边的数量乘以点的数 ...
随机推荐
- [Python] Scipy and Numpy(1)
import numpy as np #Create an array of 1*10^7 elements arr = np.arange(1e7) #Converting ndarray to l ...
- python入门-字典
1 python是使用{}来表示字典 字典是一系列的键值对 alien_0={} 2 访问字典中的值 new_point = alien_0['point'] print("you just ...
- Mysql数据库查询数据文件大小
参考网站:https://zhidao.baidu.com/question/201227796936321525.html 用SQL命令查看Mysql数据库大小 要想知道每个数据库的大小的话,步骤如 ...
- mysql 集群 数据同步
mysql集群配置在网站负载均衡中是必不可少的: 首先说下我个人准备的负载均衡方式: 1.通过nginx方向代理来将服务器压力分散到各个服务器上: 2.每个服务器中代码逻辑一样: 3.通过使用redi ...
- php用正则判断是否为数字
验证数字:^[0-9]*$验证n位的数字:^\d{n}$验证至少n位数字:^\d{n,}$验证m-n位的数字:^\d{m,n}$验证零和非零开头的数字:^(0|[1-9][0-9]*)$验证有两位小数 ...
- Mysql 唯一性约束添加
来自: http://blog.csdn.net/yumushui/article/details/38960619 一.单列唯一约束 在一列上添加唯一约束,主要是让该列在表中只能有唯一的一行,例如 ...
- net3.5 无网络环境安装
下载 提取码:t0dq 将下载的文件复制到复制到 C 盘的 Windows 文件夹 后请在“命令提示符(管理员)”中执行下面的命令: dism /online /Enable-Feature /F ...
- C++Primer笔记-----继承
==========================================================================day11 面向对象程序设计============ ...
- idea常用设置(持续更新)
1.注释模板 Setting里找到live Templates (1)创建一个Templates Group (2)在Templates Group下创建Live Template 2.常用内置模板 ...
- select 中添加option的注意
在平时写JS中经常要给Select添加option,如果我们把option中的数据用一个字符串来表示: eg: var strOption='<option>1</option> ...