首页 > 编程语言 >P1955 [NOI2015] 程序自动分析

P1955 [NOI2015] 程序自动分析

时间:2024-08-28 20:37:07浏览次数:9  
标签:P1955 cnt int 查集 离散 NOI2015 book 自动 数组

算法1

(离散化+并查集)

没想到的点:

由于数据范围很大1e9,因此需要采用离散化,从而降低时间复杂度

主要思想

1.约束条件有相等/不相等,不难发现,相等的约束条件是属于一个集合的 -- 因此需要用到并查集思想

我们按照e的大小进行排序,从而完成先处理 e = 1 的所有情况

3.并查集:

初始化:一开始所有数都是一个独立的集合

合并集合:当e = 1时,我们合并两个集合;

4.矛盾式: 当e = 0 时,两个数属于同一个集合,则矛盾,输出“NO”;

离散化:

由于我们处理的数<=le9,显然这个数很大,如果直接开le9个集合,那么会爆内存/超时

因此我们采用离散化的思想,从而降低复杂度

离散化的三步骤:

1.对所有待离散化的值进行排序

2.去重

3.二分查找离散化后的值;

这里我们把一个很大的数,映射到下标为1~N的离散化数组当中

注意:

离散化数组的大小至少需要开2倍,因为一开始我们存放两个数,我这里比较安全的开了4倍;

C++ 代码

#include <bits/stdc++.h>
using namespace std;

const int N = 1e6+10;

int T,n;
int p[N]; //并查集
int book[4*N];  //离散化后的值 ,数组的大小至少要开两倍 
//约束条件
struct node{
	int x,y,e;
}a[N];
//按照升序进行排序 
bool cmp(node u,node v){
	return u.e > v.e;
}
int init(int x){
	for(int i=1;i<=x;i++) p[i] = i;
}
int find(int x){
	if(x != p[x]) p[x] = find(p[x]);
	return p[x];
}
int main(){
	cin >> T;
	
	while(T--){
		
		int cnt = 0;  //映射到下标从0-N的数组 
		memset(a,0,sizeof a); 
		memset(p,0,sizeof p);
		memset(book,0,sizeof book);
		
		bool flag = 1;   //满足条件的情况 
		cin >> n;
		for(int i=1;i<=n;i++){
			cin >> a[i].x >> a[i].y >> a[i].e;
			
			//待离散化的值全部放入book 数组当中 
			book[++cnt] = a[i].x;
			book[++cnt] = a[i].y; 
		}
	
		//离散化三步骤
		//1.排序 
		sort(book+1,book+1+cnt);
		//2.去重 
		int re = unique(book+1,book+1+cnt) - book; //返回不重复的元素个数 
	
		//3.二分查找-离散化后的值在新数组的下标 
		for(int i = 1;i <= n;i++){
			//返回x,y 在book中的下标 - 达到离散化的目的 
			a[i].x = lower_bound(book+1,book+1+re,a[i].x) - book;   //返回的是下标 
			a[i].y = lower_bound(book+1,book+1+re,a[i].y) - book;
		} 
		
//		for(int i=1;i<=n;i++){
//			cout << a[i].x <<a[i].y << a[i].e<<endl;
//		} 
		
		//按照e的情况进行排序 ,先处理所有1的情况 
		init(re);
		sort(a+1,a+1+n,cmp);
		for(int i=1;i<=n;i++){
			int f1 = find(a[i].x), f2 = find(a[i].y);
			if(a[i].e){
				p[f1] = f2;
			}
			else if(f1 == f2){  //属于一个集合 ,成为矛盾式 
				flag = 0;
				break;
			}
		} 
		if(flag) cout << "YES" << endl;
		else cout << "NO" << endl;
	}
	return 0;
} 

标签:P1955,cnt,int,查集,离散,NOI2015,book,自动,数组
From: https://www.cnblogs.com/ltphy-/p/18385510

相关文章

  • Cloudflare Workers 每日免费限制 超出流量自动关闭 - 失败模式 改为 失败时自动关闭
    cloudflareworkers每日免费限制超出流量自动关闭-失败模式改为失败时自动关闭(阻止)位置在Workers和Pages-相应的workers-设置-函数-更改失败模式改为失败时自动关闭(阻止)这个设置,网上竟然没有人说,这么重要的事情,应该要设置,必须要设置!!注意:设置后记得从新部署......
  • 【学术会议征稿】第六届国际科技创新学术交流大会暨机械工程与自动化国际学术会议(MEA
    第六届国际科技创新学术交流大会暨机械工程与自动化国际学术会议(MEA2024)20246th InternationalConferenceonMechanicalEngineeringandAutomation  “机械工程与自动化国际学术会议(MEA2024)”将作为第六届国际科技创新学术交流大会(IAECST2024)的重要分会场,于......
  • 实践项目-模拟公司自动化运维
    (20240828,准备更新PostgreSQL部分)大纲环境配置系统:Debian12.06环境:阿里云ECS以及虚拟机序号IP地址域名主机名1192.168.100.12k8s-master.yourname.comk8s-master2192.168.100.15k8s-node1.yourname.comk8s-node13192.168.100.16k8s-node2.yourn......
  • 【Shell脚本】iptables 自动屏蔽访问网站频繁的IP
    场景恶意访问,安全防范1)屏蔽每分钟访问超过200的IP方法1:根据访问日志(Nginx为例)#!/bin/bashDATE=$(date+%d/%b/%Y:%H:%M)ABNORMAL_IP=$(tail-n5000access.log|grep$DATE|awk'{a[$1]++}END{for(iina)if(a[i]>100)printi}')#先tail防止文件过大,读取慢,数字可......
  • 怎么永久禁止win10系统自动更新,想关闭电脑更新怎么办呢
    永久禁止Windows10系统自动更新的方法有多种,以下是几种常见且有效的办法:通过服务管理器禁用WindowsUpdate服务步骤:按下Win+R键,输入services.msc,然后按Enter键打开服务管理器。在服务列表中滚动查找“WindowsUpdate”服务。右键点击“WindowsUpdate”服务,选择“属性......
  • win10的自动更新在哪,怎么打开电脑更新设置
    在Windows10系统中,自动更新的设置位置相对直观,用户可以按照以下步骤找到并配置自动更新设置:一、通过设置界面找到自动更新1.打开设置:点击屏幕左下角的“开始”按钮,然后选择“设置”(齿轮形状的图标)或者直接按下Win+I快捷键打开设置应用。2.进入更新和安全:在设置窗口中,找到并......
  • windows开机不自动挂载磁盘的方法-切记不要使用中文名称
    本人的电脑系统为win11 开机不挂载某块磁盘的理由1.本人电脑上有个仓库盘是机械硬盘,并不是每次开机都要用到,开机不挂载也许有利于增加数据盘的寿命2.挂载了数据盘,有时候打开文件页面会比较慢,不够丝滑3.通过本文的方法实现了:开机不自动挂载,使用中挂载和卸载足够方便步骤一:......
  • .net core使用jwt自动续期
    .netcore使用jwt自动续期       小弟不C才,最近看了下网上的jwt方案,于是自己写了一个简单的jwt方案和大家分享下,希望大家给点意见!      假如有一个读书网站,可以不用登陆就访问,当需要自己写文章的时候就必须登录,并且登录之后如果一段时间内没有访问,则......
  • 关于shadow-root影子控件的selenium ui自动化
    首先这个控件和iframe有异曲同工之妙,也是嵌套的一个html,所以定位不能像普通定位一样下面实践一下首先准备一个root.html<!DOCTYPEhtml><html><head><title>带有shadow-root的页面</title></head><body><h1class="test">带有shadow-root的页面</h1>......
  • 如何使用 Bittly 实现 UDP 请求自动响应与处理
    在开发基于UDP的应用时,如果通信目标未就绪或者临时不可用时,可以使用Bittly的模拟服务虚拟一个支持UDP通讯的通讯终端。本文将介绍如何使用Bittly工具,实现对UDP请求的自动响应、动态数据处理、数据分帧以及数据转发。我们将从服务的准备工作开始,逐步讲解每一个步骤,帮......