首页 > 其他分享 >食物链(并查集)

食物链(并查集)

时间:2024-09-29 13:33:49浏览次数:8  
标签:食物链 typedef return int 查集 st vx find

一开始默认为0,如果有捕食关系调整d[x]

#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
typedef pair<int,int> PII;
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int uint;
typedef vector<string> VS;
typedef vector<int> VI;
typedef vector<vector<int>> VVI;
vector<int> vx;
inline void divide() {sort(vx.begin(),vx.end());vx.erase(unique(vx.begin(),vx.end()),vx.end());}
inline int mp(int x) {return upper_bound(vx.begin(),vx.end(),x)-vx.begin();}
inline int log_2(int x) {return 31-__builtin_clz(x);}
inline int popcount(int x) {return __builtin_popcount(x);}
inline int lowbit(int x) {return x&-x;}
const int N = 50100;
//d[i]表示i到根节点的异或值是1还是0
int f[N],d[N];
int find(int u)
{
    if(f[u] == u) return u;
    int t = find(f[u]);
    d[u] += d[f[u]], d[u]%=3;
    return f[u] = t;
}
void merge(int u,int v,int st)
{
    int f1 = find(u), f2 = find(v);
    //要实现的效果为(d[f1]+d[u])%3 = (d[v]+st)%3
    d[f1] = (d[v]+st-d[u]+3)%3, f[f1] = f2;
}
void solve()
{
    int n,k;
    cin>>n>>k;
    int cnt = 0;
    for(int i=1;i<=n;++i) f[i] = i;
    for(int i=0;i<k;++i)
    {
        int st,u,v;
        cin>>st>>u>>v;
        if(u>n||v>n||u==v&&st==2) cnt++;
        else if(find(u) == find(v))
        {
            if((d[u]-d[v]+3)%3 != st-1) 
            {
                //cout<<u<<' '<<v<<' '<<d[u]<<' '<<d[v]<<'\n';
                cnt++;
            }
        }
        else
        {
            merge(u,v,st-1);
        }
    }
    cout<<cnt<<'\n';
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T = 1;
	//cin>>T;
	while(T--)
	{
		solve();
	}
}

标签:食物链,typedef,return,int,查集,st,vx,find
From: https://www.cnblogs.com/ruoye123456/p/18439531

相关文章

  • [CEOI1999] Parity Game(并查集)
    方法1:带权路径维护本题核心:[a,b]之间有奇数个1转换为s[a-1]^s[b]=1,从而转向并查集#include<bits/stdc++.h>usingnamespacestd;#definexfirst#defineysecondtypedefpair<int,int>PII;typedeflonglongll;typedefunsignedlonglongull;typedefunsignedint......
  • [NOI2002] 银河英雄传说(带权并查集)
    带权并查集稍微注意下细节、#include<bits/stdc++.h>usingnamespacestd;#definexfirst#defineysecondtypedefpair<int,int>PII;typedeflonglongll;typedefunsignedlonglongull;typedefunsignedintuint;typedefvector<string>VS;typedefve......
  • Supermarket(并查集)
    考虑利润从高到底排序,优先把利润最高的填到最接近过期的空余位置贪心证明:如果当前a[i]被填入而填入了比最靠近过期前面的位置显然不会更优,如果没有被填入而放了另一组方案利润更大,则把属于a[i]的位置换成a[i]一定更优,两者矛盾#include<bits/stdc++.h>usingnamespacestd;#def......
  • P1955 [NOI2015] 程序自动分析(并查集)
    相等放并查集里,不等直接判断#include<bits/stdc++.h>usingnamespacestd;#definexfirst#defineysecondtypedefpair<int,int>PII;typedeflonglongll;typedefunsignedlonglongull;typedefunsignedintuint;typedefvector<string>VS;typedefv......
  • 数据结构:速通并查集
    并查集用来干什么:处理不相交的集合的合并以及查询相交集合的个数等情况例题(自行搜索):36024年第一批笔试算法题传染病防控 并查集具有三个操作initfindunioninit初始化集合,将当前所有节点的父节点设置为自己intfa[]=newint[10000];intsize[]=newint[10000];//这里是......
  • LeetCode力扣——并查集:947. 移除最多的同行或同列石头,1971. 寻找图中是否存在路径,24
    947.移除最多的同行或同列石头题目描述947.移除最多的同行或同列石头n 块石头放置在二维平面中的一些整数坐标点上。每个坐标点上最多只能有一块石头。如果一块石头的 同行或者同列 上有其他石头存在,那么就可以移除这块石头。给你一个长度为 n 的数组 stones ,其......
  • 基础带权并查集
    只能基础查询到根节点的距离structDSU{intfa[N],siz[N],deep[N];voidinit(){for(inti=1;i<=n;i++){fa[i]=i;siz[i]=1;deep[i]=0;}}intfind(intx){inttmpfa=fa[x];......
  • 2024牛客多校 4 (概率,带权并查集,构造)
    2024牛客多校4(概率,带权并查集,构造)J-Zero题面:给出整数\(n\)和\(k\),一个01?字符串\(s\)。?有概率是0或是1,且概率相等,一段区间\([l,r]\)的贡献这样计算:这一段区间不包含0贡献为长度的\(k\)次方求这个字符串\(s\)的期望贡献是多少?solution:首......
  • 九、并查集-算法总结
    文章目录九、并查集9.1简介9.2数据结构9.2.1初始化9.2.2Quick-Find9.2.3Quick-Union9.2.4WeightedQuickUnion九、并查集9.1简介并查集用于处理不相交集合的合并与查询问题,常见操作有:查询:查询元素属于哪个集合,可用于判断元素是否在一个集合中合并:合并两......
  • 食物链题解
    双倍经验:P2024[NOI2001]食物链当问题要求维护一些对立的关系时(朋友、敌人),就可以用种类并查集实现。因为有三种关系所以并查集的数组要开三倍空间,第一倍空间存同类关系,第二倍存捕食关系,第三倍存被捕食关系。注意:一的猎物的猎物就是一的天敌,其他就可以直接并查集维护即可。注......