模板练习(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)$.就是边的数量乘以点的数 ...
随机推荐
- sql isdate判断时间函数(小技巧)
isdate 是一个判断字符串是否为日期的函数,0代表所传入的字符串不是日期,1代表传入的参数是日期. select isdate('30/12/2014') ---0 第一个是 mdy --如 ...
- pycharm最新版新建工程没导入本地包问题:module 'selenium.webdriver' has no attribute 'Firefox'
前言 最新版的pycharm做了很大的改变,新建工程的时候,默认不导入本地的安装包,这就导致很多小伙伴踩坑了... 明明已经pip安装过selenium了,但是却报AttributeError:mod ...
- js小效果:返回顶部 scrollTop 。 滚屏:animate
返回顶部: (scroll 滚屏事件,如果超出第一屏,显示返回顶部的按钮) <div id="gotop" onclick="javascript:scroll(0 ...
- ELK配置过程初次安装使用心得--elasticsearch5.4版--及logstash
安装所遇到的问题:http://www.bubuko.com/infodetail-1889252.html 一,先创建用户和组groupadd es useradd -g es es passwd ...
- zabbixzabbix
一,安装文档 https://www.zabbix.com/documentation/4.0/zh/manual/installation/requirements zabbix3.2.6安装 ...
- leetcode401
public class Solution { /// <summary> /// 将二进制字符串转为十进制数字 /// </summary> /// <param na ...
- mysql 自动执行事件
首先配置mysql的配置文件my.ini, 加上event_scheduler = 1 开启自动执行事件配置 demo drop event event_test; CREATE EVENT ev ...
- 可视化库-seaborn-热力图(第五天)
1. 画一个基本的热力图, 通过热力图用来观察样本的分布情况 import matplotlib.pyplot as plt import numpy as np np.random.seed(0) ...
- 返回顶部 fixed oncheck(点击按钮)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- this指针的调整
我们先来看一段代码: #include <iostream> using namespace std; class A { public: int a; A( ) { printf(&qu ...