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. 洛谷:P1087 FBI树 P1030 求先序排列 P1305 新二叉树

    至于为啥把这三个题放到一起,大概是因为洛谷的试炼场吧,三道树的水题,首先要理解 先序中序后序遍历方法. fbi树由于数量小,在递归每个区间时,暴力跑一遍区间里的数,看看是否有0和1.至于递归的方法,二 ...

  2. 并发基础(二) Thread类的API总结

    Thread 类是java中的线程类,提供给用户用于创建.操作线程.获取线程的信息的类.是java线程一切的基础,掌握这个类是非常必须的,先来看一下它的API: 1.字段摘要 static int M ...

  3. linux 使用随笔

    目录:1,ab命令 一,ab命令 ab网站压力测试命令的参数.输出结果的中文注解 ab命令是Apache的Web服务器的性能测试工具,它可以测试安装Web服务器每秒种处理的HTTP请求. 来自: ht ...

  4. 39. 在linux下装好Tomcat要给 tomcat/bin/下面所有.sh的文件执行权限

    chmod a+x *.sh(赋予可执行的权限)

  5. 解决maven工程 子工程中的一些配置读取进来的问题

    方案:在父工程中手动配置一些节点 <build> <!-- 插件 --> <plugins> <plugin> <groupId>org.a ...

  6. SourceTree使用方法

    一 .SourceTree简介 SourceTree 是 Windows 和Mac OS X 下免费的 Git 和 Hg 客户端,拥有可视化界面,容易上手操作.同时它也是Mercurial和Subve ...

  7. 突破MSDE 的2GB数据限制

    Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\ ...

  8. as2 无法加载类或接口

    1.最大问题就是可能新建文件的时候选择as3的as或者直接复制了as3的as文件过来修改.as文件必须是2的 2.类名是否一致 3.包引用是否正确

  9. 在mfc中picture控件中显示Mat图片<转>

    void ShowMatImgToWnd(CWnd* pWnd, cv::Mat img) { if(img.empty()) return; CRect drect; pWnd->GetCli ...

  10. ABAP-HTTP支持

    ABAP 中对HTTP的支持 SAP Web Application Server -> Internet Communication  Framework. http://help.sap.c ...