首页 > 其他分享 >P2294 [HNOI2005] 狡猾的商人 两种做法

P2294 [HNOI2005] 狡猾的商人 两种做法

时间:2024-09-14 15:25:28浏览次数:1  
标签:tmp cha int cin long HNOI2005 sg P2294 狡猾

贪心

#include<bits/stdc++.h>
#define int long long

using namespace std;

const int N=1e3+100;

int n,m;

struct NODE{
	int l,r,val;
	bool operator < (const NODE &h)const
	{
		if(l!=h.l)	return l>h.l;
		return r>h.r;
	}
};

priority_queue<NODE> q;

signed main()
{
	int T;
	cin>>T;
	while(T--)
	{
		while(q.size())	q.pop();
		cin>>n>>m;
		for(int i=1;i<=m;i++)
		{
			int l,r,val;
			cin>>l>>r>>val;
			q.push({l,r,val});
		}
		
		bool sg=false;
		
		auto tmp=q.top();
		q.pop();
		while(q.size())
		{
			auto tmp1=q.top();q.pop();
			if(tmp.l==tmp1.l)
			{
				if(tmp.r==tmp1.r)
				{
					if(tmp.val!=tmp1.val)
					{
						sg=true;
						break;
					}
				}
				else
					if(tmp.r<tmp1.r)
						q.push({tmp.r+1,tmp1.r,tmp1.val-tmp.val});
			}
			tmp=tmp1;
		}
		if(sg)	cout<<"false"<<endl;
		else	cout<<"true"<<endl;
	}
	
	return 0;
}

带权并查集

#include<bits/stdc++.h>
#define int long long

using namespace std;

const int N=110;

int n,m;
int f[N],cha[N];

int find(int x)
{
	if(x!=f[x])
	{
		int t=find(f[x]);
		cha[x]+=cha[f[x]];
		f[x]=t;
	}
	return f[x];
}

signed main()
{
	int T;
	cin>>T;
	while(T--)
	{
		bool sg=false;
		cin>>n>>m;
		for(int i=0;i<=n;i++)	f[i]=i,cha[i]=0;
		for(int i=1;i<=m;i++)
		{
			int x,y,z;
			cin>>x>>y>>z;
			x--;
			if(find(x)!=find(y))
			{
				cha[f[y]]=cha[x]-cha[y]-z;
				f[f[y]]=f[x];
			}
			else
				if(cha[x]-cha[y]!=z)
				{
					sg=true;
					break;
				}
		}
		if(sg)	cout<<"false";
		else	cout<<"true";
		cout<<endl; 
	}
	return 0;
}

区间DP

#include<bits/stdc++.h>
#define int long long

using namespace std;

const int N=110;

int n,m;
int f[N][N];

signed main()
{
	int T;
	cin>>T;
	while(T--)
	{
		memset(f,0,sizeof f);
		cin>>n>>m;
		for(int i=1;i<=m;i++)
		{
			int x,y,z;
			cin>>x>>y>>z;
			f[x][y]=z;
		}
		bool sg=true;
		for(int i=2;i<=n;i++)
			if(sg)//加速
				for(int j=i-1;j>=1;j--)
					if(sg)//加速*2
						for(int k=j;k<i;k++)
							if(f[j][k] && f[k+1][i]) 
							{
								if(f[j][i])
								{
									if(f[j][i]!=f[j][k]+f[k+1][i])
									{
										sg=false;
										break;
									}
								}
								else
									f[j][i]=f[j][k]+f[k+1][i];
							}
		if(sg)	cout<<"true";
		else	cout<<"false";
		cout<<endl; 
	}
	return 0;
}

标签:tmp,cha,int,cin,long,HNOI2005,sg,P2294,狡猾
From: https://www.cnblogs.com/tangml/p/18414065

相关文章

  • P2294 [HNOI2005] 狡猾的商人
    原题链接题解先看成前缀和,这样就是维护\(pre[r],pre[l-1]\)两点之间的权值如果是false,代表存在矛盾,且矛盾出现在回路我们可以把这个回路之前的元素看成一个集合,如果新加入的边使得原先两点间的权值不等便失效而对于一个集合里的元素,由于相加具有矢量特性,所以我们维护集合内......
  • [HNOI2005] 狡猾的商人's 题解
    题目描述给你一个\(n\)元一次方程,判断是否有解,方程给出的格式为\(a-b=c\)思路这道题看上去是一道题目看上去就是判断给出条件是否有矛盾,所以就自然而然的可以使用带权并查集但是因为我太懒了并且这道题目要求使用差分约束系统进行求解,于是就需要将题目转化一下因为差分约束......
  • [HNOI2005] 星际贸易 题解
    [HNOI2005]星际贸易将问题分为两次dp。题面有:“只有一种获得最大贸易额的方法”所以直接说明了贸易额与那些费用无关。有考虑到无论干啥都要维护,第二次\(dp\)直接以暗物质为核心即可对于这里\(R\)与\(n*2\)取\(min\)的一些细节理解。我们设计状态,因为观察到了暗......
  • HydroOJ 踩坑指南(1)狡猾的分布式官方文档
    本系列旨在记录使用HydroOJ时的一些坑点,更全的说明文档请查看官方文档。欢迎联系本人QQ补充:2422609586.HydroOJ官方QQ群:1085853538.入门第一坑:官方文档不止一处!都说学习项目要先认真读文档,HydroOJ的文档使用了分布式阅读系统,并异地多中心部署(bushi),所以需要汇总一下:......
  • 并查集的具体应用 CF1213G CF444E [HNOI2005]狡猾的商人
    每当我们看到“最大值最小”“路径上的最大最小值”等字眼时,我们就可以考虑并查集。我们可以尝试把这些问题转化为某种意义上按单调顺序的合并,利用并查集求解答案。以下时两例并查集的巧妙应用。CF1213GPathQueries注意“最大权值不大于q”,加上允许离线,我们可以把边按照权值......