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. 线段树模板1 [Luogu P3372]

    代码+注释: #include <iostream> #include <cstdio> using namespace std; int n, q, flag, x, y, ...

  2. [模板](luogu P3387)縮點

    前言:對於這週的咕咕咕表示好像沒什麼好表示的,完全沒有靈感a......寫東西真的好難啊......於是又玩了半天鬼泣4???還挺好玩的 來源:題解 题目背景 缩点+DP 题目描述 给定一个n个点m条 ...

  3. 线性基(模板) LUOGU 3812

    题面 解题思路 线性基,是构造出一组数:ax,ax-1-.a1,ax的二进制最高位为x.这些数字能异或和可以表示原来所有数的异或和.其实相当于一个高斯消元的过程.所以我们按位枚举,如果这一位曾经没数, ...

  4. AC自动机(模板) LUOGU P3808

    传送门 解题思路 AC自动机,是解决多模匹配问题的算法,是字典树与kmp结合的算法,可以解决许多子串在文本串中出现的次数等信息.关键是实现一个fail指针,是指向更靠上的前缀相同字母,从而可以实现在文 ...

  5. 主席树 模板题 luogu([POI2014]KUR-Couriers)

    求区间内是否有个数大于二分之一的数,有的话输出这个数,没有的话输出0. 在询问的时候,如果左边有sum大于这个limit,就可以继续求,如果右边有sum大于limit  也递归, 如果都不行,返回 0 ...

  6. 【模板】 非旋转treap

    模板:luogu P3369 [模板]普通平衡树 code: #include <cstdio> #include <cstdlib> const int MAX_N=1000 ...

  7. 有关素数判断的一些算法(总结&&对比)

    素性测试是数论题中比较常用的一个技巧.它可以很基础,也可以很高级(哲学).这次主要要介绍一下有关素数判断的奇技淫巧 素数的判断主要分为两种:范围筛选型&&单个判断型 我们先从范围筛选型 ...

  8. 浅谈博弈论中的两个基本模型——Bash Game&&Nim Game

    最近在数学这一块搞了蛮多题目,已经解决了数论基础,线性代数(只有矩阵,行列式待坑),组合数学中的一些简单问题.所以接下来不可避免的对博弈论这一哲学大坑开工. 当然,由于我很菜,所以也只能从最基础最容易 ...

  9. 关于dijkstra的小根堆优化

    YY引言 在NOI2018D1T1中出现了一些很震惊的情况,D1T1可以用最短路解决,但是大部分人都在用熟知的SPFA求解最短路.而SPFA的最坏复杂度能够被卡到$O(VE)$.就是边的数量乘以点的数 ...

随机推荐

  1. sql isdate判断时间函数(小技巧)

    isdate 是一个判断字符串是否为日期的函数,0代表所传入的字符串不是日期,1代表传入的参数是日期. select   isdate('30/12/2014')  ---0 第一个是 mdy --如 ...

  2. pycharm最新版新建工程没导入本地包问题:module 'selenium.webdriver' has no attribute 'Firefox'

    前言 最新版的pycharm做了很大的改变,新建工程的时候,默认不导入本地的安装包,这就导致很多小伙伴踩坑了... 明明已经pip安装过selenium了,但是却报AttributeError:mod ...

  3. js小效果:返回顶部 scrollTop 。 滚屏:animate

    返回顶部: (scroll 滚屏事件,如果超出第一屏,显示返回顶部的按钮) <div id="gotop" onclick="javascript:scroll(0 ...

  4. ELK配置过程初次安装使用心得--elasticsearch5.4版--及logstash

    安装所遇到的问题:http://www.bubuko.com/infodetail-1889252.html 一,先创建用户和组groupadd es useradd -g es es passwd  ...

  5. zabbixzabbix

    一,安装文档    https://www.zabbix.com/documentation/4.0/zh/manual/installation/requirements zabbix3.2.6安装 ...

  6. leetcode401

    public class Solution { /// <summary> /// 将二进制字符串转为十进制数字 /// </summary> /// <param na ...

  7. mysql 自动执行事件

    首先配置mysql的配置文件my.ini,  加上event_scheduler = 1  开启自动执行事件配置 demo drop event event_test; CREATE EVENT ev ...

  8. 可视化库-seaborn-热力图(第五天)

    1. 画一个基本的热力图, 通过热力图用来观察样本的分布情况 import matplotlib.pyplot as plt import numpy as np np.random.seed(0) ...

  9. 返回顶部 fixed oncheck(点击按钮)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. this指针的调整

    我们先来看一段代码: #include <iostream> using namespace std; class A { public: int a; A( ) { printf(&qu ...