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. 知识picture

  2. mysql 定时执行

      mysqltablevariables任务sqlinsert 重新定义mysql命令行结束符为//,命令行创建存储过程需要.  delimiter //  MySQL5.1.x版本中引入了一项新特 ...

  3. 4.Spring中使用Log4j

    转自:https://blog.csdn.net/luohai859/article/details/52250807 这里要实现web项目中利用Spring来使用Log4j (1)接上面的工程,然后 ...

  4. 浅谈Http、TCP、UDP和 IP 的的区别

    应用层:Http,超文本传输协议(HyperText Transfer Protocal):利用TCP在两台电脑(通常是Web服务器和客户端)之间传输信息的协议.客户端使用Web浏览器发起HTTP请求 ...

  5. css兼容性记录

    *        , ie6,ie7可以识别: _和- ,  ie6可以识别: !important  ,表示高优先级,ie7及以上,firefox都支持,ie6认识带!important的样式属性, ...

  6. MySQL的事务处理及隔离级别

      事务是DBMS得执行单位.它由有限得数据库操作序列组成得.但不是任意得数据库操作序列都能成为事务.一般来说,事务是必须满足4个条件(ACID)       原子性(Autmic):事务在执行性,要 ...

  7. tnsping 命令解析

    C:\Users\nowhill>tnsping jljcz Oracle Net 工具(命令)tnsping,是一个OSI会话层的工具,它用来: 1)验证名字解析(name resolutio ...

  8. 用java编写一个函数,用于计算桌子的面积,可计算任意边长的桌子

    /* *桌子实体类,有属性和方法 */public class Table {    String name; // 声明桌子名称    Double width; // 声明桌子宽度    Doub ...

  9. 实现溢出文本eclipsis的解决

    实现溢出文本eclipsis的解决:overflow:hidden;text-overflow:ellipsis; white-space:nowrap; 如:<a href="&qu ...

  10. css3 fileter始终效果 图片渲染

    http://www.w3cplus.com/css3/ten-effects-with-css3-filter