首页 > 其他分享 >一本通差分约束入门题

一本通差分约束入门题

时间:2024-03-27 12:58:39浏览次数:13  
标签:dist 入门 idx int 一本 add 差分 return mod

最关键的就是找好所有的要满足的不等式条件,注意隐含的条件还有一点就是注意没有源点 建立源点

#2436. 「SCOI2011」糖果

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int,int>;
#define int long long
const int N = 5e5+10,M = 2e6+10;
const int inf = 0x3f3f3f3f;
const int mod = 1e9+7;
int gcd(int a,int b){return b?a:gcd(b,a%b);}
int lcm(int a,int b){return a*b/gcd(a,b);}
int qmi(int a,int b,int mod){int res=1;while(b){if(b&1)res=res*a%mod;b>>=1;a=a*a%mod;}return res;}


int n,q,m;
int dist[N];
bool vis[N];
int cnt[N];
int e[M],ne[M],w[M],h[N],idx;
void add(int a,int b,int c){
	e[idx] = b,ne[idx] = h[a],w[idx] = c,h[a] = idx++;
}

void spfa()
{
	stack<int>q;
	memset(dist,-0x3f,sizeof dist);
	dist[0] = 0;
	vis[0] = true;
	q.push(0);
	
	//int count = 0;
	while(q.size()){
		auto t = q.top();
		q.pop();
		vis[t] = false;
		
		for(int i=h[t];~i;i=ne[i]){
			int j = e[i];
			if(dist[j]<dist[t]+w[i]){
				dist[j] = dist[t]+w[i];
				cnt[j]++;
				if(cnt[j]>=n){cout<<-1;return;}
				//if(++count>100000){cout<<-1;return;}
				if(!vis[j]){
					vis[j] = true;
					q.push(j);
				}
			}
		}
	}
	
	
	int res = 0;
	
	
	for(int i=1;i<=n;i++)res+=dist[i];
	cout<<res;
	
	

	
}

void solve()
{
	cin>>n>>m;
	memset(h,-1,sizeof h);
	for(int i=1;i<=m;i++){
		int a,b,c;cin>>c>>a>>b;
		if(c==1){add(a,b,0),add(b,a,0);}
		else if(c==2){add(a,b,1);}
		else if(c==3){add(b,a,0);}
		else if(c==4){add(b,a,1);}
		else add(a,b,0);
	}
	for(int i=1;i<=n;i++)add(0,i,1);
	spfa();

}

signed main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int _;
	//cin>>_;
	_ = 1;
	while(_--)solve();
	return 0;
}

#10087. 「一本通 3.4 例 1」Intervals

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int,int>;
#define int long long
const int N = 2e5+10;
const int inf = 0x3f3f3f3f;
const int mod = 1e9+7;
int gcd(int a,int b){return b?a:gcd(b,a%b);}
int lcm(int a,int b){return a*b/gcd(a,b);}
int qmi(int a,int b,int mod){int res=1;while(b){if(b&1)res=res*a%mod;b>>=1;a=a*a%mod;}return res;}


int n,q,m;

int e[N],ne[N],w[N],h[N],idx;
void add(int a,int b,int c){
	e[idx] = b,ne[idx] = h[a],w[idx] = c,h[a] = idx++;
}

int dist[N];
bool vis[N];
int mx;
void spfa()
{
	memset(dist,-0x3f,sizeof dist);
	queue<int>q;
	q.push(0);
	dist[0] = 0;
	vis[0] = true;
	
	
	while(q.size()){
		auto t = q.front();
		q.pop();
		vis[t] = false;
		//cout<<t<<"\n";
		for(int i=h[t];~i;i=ne[i]){
			int j = e[i];
			if(dist[j]<dist[t]+w[i]){
				dist[j] = dist[t]+w[i];
				if(!vis[j]){
					vis[j] = true;
					q.push(j);
				}
			}
		}
	}
	
	
	
	cout<<dist[50001];
}



void solve()
{
	memset(h,-1,sizeof h);
	cin>>m;
	for(int i=1;i<=50001;++i){
		add(i-1,i,0),add(i,i-1,-1);
	}
	while(m--){
		int a,b,c;cin>>a>>b>>c;
		a++,b++;
		add(a-1,b,c);
	}
	
	
	
	spfa();

}

signed main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int _;
	//cin>>_;
	_ = 1;
	while(_--)solve();
	return 0;
}

#10090. 「一本通 3.4 练习 2」布局 Layout

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int,int>;
#define int long long
const int N = 1e5+10;
const int inf = 0x3f3f3f3f;
const int mod = 1e9+7;
int gcd(int a,int b){return b?a:gcd(b,a%b);}
int lcm(int a,int b){return a*b/gcd(a,b);}
int qmi(int a,int b,int mod){int res=1;while(b){if(b&1)res=res*a%mod;b>>=1;a=a*a%mod;}return res;}


int n,q,m1,m2;
int dist[N],cnt[N];
bool vis[N];
int e[N],ne[N],w[N],h[N],idx;
void add(int a,int b,int c){
	e[idx] = b,ne[idx] = h[a],w[idx] = c,h[a] = idx++;
}


bool spfa(int sz)
{
	memset(dist,0x3,sizeof dist);
	memset(cnt,0,sizeof cnt);
	memset(vis,0,sizeof vis);
	queue<int>q;
	
	for(int i=1;i<=sz;++i){
		dist[i] = 0;
		q.push(i);
		vis[i] = true;
	}
	
	while(q.size()){
		auto t = q.front();
		q.pop();
		vis[t] = false;
		for(int i=h[t];~i;i=ne[i]){
			int j = e[i];
			if(dist[j]>dist[t]+w[i]){
				dist[j] = dist[t]+w[i];
				cnt[j]++;
				if(cnt[j]>=n)return true;
				if(!vis[j]){
					vis[j] = true;
					q.push(j);
				}
			}
		}
		
	}
	
	return false;
	
	
}


void solve()
{
	cin>>n>>m1>>m2;
	memset(h,-1,sizeof h);
	for(int i=0;i<=n;++i)add(i+1,i,0);
	while(m1--){
		int a,b,c;cin>>a>>b>>c;if(a>b)swap(a,b);
		add(a,b,c);
	}	
	
	while(m2--){
		int a,b,c;cin>>a>>b>>c;if(a>b)swap(a,b);
		add(b,a,-c);
	}
	
	if(spfa(n))cout<<-1;
	else{
		spfa(1);
		if(dist[n]>inf/2)cout<<-2;
		else cout<<dist[n];
	}
	

}

signed main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int _;
	//cin>>_;
	_ = 1;
	while(_--)solve();
	return 0;
}

标签:dist,入门,idx,int,一本,add,差分,return,mod
From: https://blog.csdn.net/m0_60921016/article/details/137046470

相关文章

  • 【go从入门到精通】函数详解
    作者简介:    高科,先后在 IBMPlatformComputing从事网格计算,淘米网,网易从事游戏服务器开发,拥有丰富的C++,go等语言开发经验,mysql,mongo,redis等数据库,设计模式和网络库开发经验,对战棋类,回合制,moba类页游,手游有丰富的架构设计和开发经验。 (谢谢你的关注)---------------......
  • webpack 入门笔记1
    webpack是一个综合性平台1为npm环境-packjson->依赖->依赖的编译器环境bale-->esj->程序.构建一个综合平台。2开发目录到生产目录;3打包优化将上百个依赖整合为若干chunk.提升下载速度.综合总线打通步骤1(node环境已下载)建立npm环境-与本地的链接npminit指令......
  • Python-VBA编程500例-020-02(入门级)
    第k个组合(ThekthCombination)的问题在实际应用中具有广泛的用途,它涉及从n个不同元素中选出k个元素的所有可能组合。这种组合的概念在许多领域都有重要的应用,常见的一些具体应用有:1、彩票与赌博:在某些彩票或赌博游戏中,参与者需要选择特定数量的号码或符号。这些号码或符号的......
  • 人工智能深度学习入门指南
    人工智能深度学习是一个涉及复杂算法和技术的领域,主要目的是让机器能够模仿人脑的学习过程,从而具备理解、分析、预测等能力。下面将详细描述深度学习的工作原理、学习过程,并给出一些建议。深度学习的工作原理基于神经网络,这是一种模拟人脑神经元连接方式的计算模型。神经网络......
  • linux入门
    组管理usermod-grootws#将ws的主组(gid)改为root组usermod-Grootws#将用户ws添加到root组当中idws#查看用户信息gid是主组uid是身份group是其他组#在ugo例g是指与创建用户相同主组的组群shellname='cxk'#shell变量不能有空格$path#是全局变量$?#若返回的......
  • 监控工具-jvisualvm.exe-入门,监控tomcat7的jmx、jstatd
    1、添加JMX1.1、catalina-jmx-remote.jar 放在Tomcat的 lib 目录下catalina-jmx-remote.jar 的确切位置可能因Tomcat版本和发行版而异,但通常它应该被放置在Tomcat的 lib 目录下 1.2、catalina.sh设置JVM参数对于Linux/Unix,编辑 catalina.sh 文件......
  • 【Canal】Canal快速入门
    canal介绍 canal[kə'næl],译意为水道/管道/沟渠,主要用途是基于MySQL数据库增量日志解析,提供增量数据订阅和消费早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务trigger获取增量变更。从2010年开始,业务逐步尝试数据......
  • Oracle数据库入门第三课(函数)
    前面二白讲了一些简单的查询语句,仅仅知道查询语句的语法是不够的,要想实现更多的需求,更重要的是函数的使用,这节课我们简单说一下一些函数的使用。一、函数的分类什么叫做函数?函数就是用来实现某种功能的,提前声明好的代码块分类:•系统函数         ‣单行函数......
  • 【CMake】CMake从入门到实战系列(三)——CMake常用指令
    文章目录一、out-of-source构建二、指令详解1、add_library【1】基本语法【2】参数含义【3】示例2、target_link_libraries【1】基本语法【2】参数含义【3】示例3、link_directories【1】基本语法【2】参数含义【3】示例4、include_directories【1】基本语法【2】参......
  • ArcGIS Desktop使用入门(二)常用工具条——地理配准
    系列文章目录ArcGISDesktop使用入门(一)软件初认识ArcGISDesktop使用入门(二)常用工具条——标准工具ArcGISDesktop使用入门(二)常用工具条——编辑器ArcGISDesktop使用入门(二)常用工具条——数据驱动页面ArcGISDesktop使用入门(二)常用工具条——基础工具ArcGISDesktop......