【做题笔记】洛谷P1955[NOI2015]程序自动分析
第一道蓝题祭~
注意到本题中判断的是下标,即,并不是真的判断 \(i\) 是否等于 \(j\)
显然考虑并查集,把所有标记为“相等”的数放在一个集合里,然后最后扫一遍每个数,如果有两个数标记为“不等”但是在一个集合里那么说明不合法,输出 NO ,否则输出 YES。
接下来考虑一些细节
注意到在所有数据输入完后才需要输出判定结果,所以每次询问是离线的。也就是说,我们只关心这些条件是否冲突,而不关心它们出现的先后次序
所以将所有标记为“相等”的数先处理,相当于对于每一组标记为“相等”的数据,合并各自所在的并查集
注意到 \(1\ \leq\ i,j\ \leq\ 10^9\) ,数据范围很大,所以需要离散化。
离散化时注意:由于待会在用 lower_bound 查找每个数出现的位置时用的是二分查找,所以必须保证离散数组要排好序
为什么可以离散化?
注意到本题只关心每个数被标记为 \(1\) 还是 \(0\) ,不关心每个数具体的值,也不需要对一段区间(形如 \([l,r]\))进行操作,满足离散化的充要条件
每次记得把所有数组清空
需要快读
需要路径压缩
参考代码,本题细节较多,稍有不慎就会收获大红大紫大蓝,,
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define ull unsigned long long
//这题需要unsigned long long
using namespace std;
int t;
struct q
{
ull i,j,e;
};
q a[10000010];
ull b[1000010*3];
//要开 3 倍!!!
ull f[1000010];
int cmp(q x,q y)
{
return x.e>y.e;
}
int get(ull x)
{
if(x==f[x]) return x;
return f[x]=get(f[x]);
}
void merge(ull x,ull y)
{
f[get(x)]=get(y);
}
inline int read()
{
int w=1,s=0;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9')s=s*10+ch-'0',ch=getchar();
return s*w;
}
int main()
{
t=read();
while(t--)
{
int n,ra=0;
n=read();
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(f,0,sizeof(f));
for(int i=1;i<=n;i++)
{
a[i].i=read(),a[i].j=read(),a[i].e=read();
b[++ra]=a[i].i;
b[++ra]=a[i].j;
//离散数组 b 存放的实际上是下标(题目中的)
}
sort(b+1,b+ra+1);
int cnt=unique(b+1,b+1+ra)-b; //去重
for(int i=1;i<=n;i++)
{
a[i].i=lower_bound(b+1,b+1+cnt,a[i].i)-b;
a[i].j=lower_bound(b+1,b+1+cnt,a[i].j)-b;
}
for(int i=1;i<=cnt;i++) f[i]=i;
sort(a+1,a+n+1,cmp); //以是否被标记为相等排序,使待会先处理可以合并的操作
bool flag=true;
for(int i=1;i<=n;i++)
{
if(a[i].e) merge(a[i].i,a[i].j);
else if(get(a[i].i)==get(a[i].j))
{
printf("NO\n");
flag=false;
break;
}
}
if(flag) printf("YES\n");
}
return 0;
}
【做题笔记】洛谷P1955[NOI2015]程序自动分析的更多相关文章
- 洛谷p1955[NOI2015]程序自动分析
题目: 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3...代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变量 ...
- 洛谷P1955 [NOI2015] 程序自动分析 [并查集,离散化]
题目传送门 题目描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3...代表程序中出现的变量,给定n个形如xi=xj或x ...
- 洛谷 P1955 [NOI2015]程序自动分析 题解
每日一题 day22 打卡 Analysis 离散化+并查集 先离散化所有的约束条件,再处理所有e=1的条件,将i的祖先和j的祖先合并到一个集合中:e=0时,如果i的祖先与j的祖先在同一个集合中,说明 ...
- P1955 [NOI2015]程序自动分析
题目描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3...代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变 ...
- 【luogu P1955 [NOI2015]程序自动分析】 题解
题目链接:https://www.luogu.org/problemnew/show/P1955 并查集操作,1e9要离散化,数组要开大一些,操作前先执行合并操作 样例好毒啊(全是排好序的) #inc ...
- Luogu P1955 [NOI2015]程序自动分析
又一次做了这道题,感慨万千. 记得寒假时,被cmd2001点起来讲这道题,胡言乱语..受尽鄙视(现在也是好吗)..后来下课想A掉,可是3天下来总是错...后来抄了分题解就咕咕了... 今天老师留了这道 ...
- P1955 [NOI2015]程序自动分析[离散化+并查集]
大水题一道,不明白为什么你谷评了个蓝.一看就是离散化,先去满足相等的条件,相等即为两点联通,或者说在同一个集合内.再看不相等,只有两元素在同一集合才不满足.裸的disjoint-set直接上,常数巨大 ...
- codevs4600 [NOI2015]程序自动分析==洛谷P1955 程序自动分析
4600 [NOI2015]程序自动分析 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 在实现 ...
- C语言程序设计做题笔记之C语言基础知识(下)
C 语言是一种功能强大.简洁的计算机语言,通过它可以编写程序,指挥计算机完成指定的任务.我们可以利用C语言创建程序(即一组指令),并让计算机依指令行 事.并且C是相当灵活的,用于执行计算机程序能完成的 ...
随机推荐
- php 爬虫采集
概述 现在爬虫技术算是一个普遍的技术了,各个语言的爬虫百家争鸣,但是根据笔者自己的感觉还是python是主流.爬虫涉及到太多的东西,笔者并不是专业的爬虫工程师,只不过个人兴趣分享一下.由于笔者是php ...
- ZedGraph怎样在双击图形后添加箭头标记
场景 在ZedGraph的曲线图上,双击图时会在图形上生成箭头符号标记. 效果 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的 ...
- jQuery---城市选择案例
城市选择案例 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UT ...
- jeecgboot数据字典使用
jeecgboot数据字典使用 input页面下拉框使用 效果展示 实现 定义数据字典 引用并调用JDictSelectTag组件 import JDictSelectTag from '@/comp ...
- Failed to restart docker.service: Unit not found 镜像加速
解决方案 以前的安装残留 重新安装 find / -name "docker*" centos8 添加软件源信息 yum-config-manager --add-repo htt ...
- MySQL 中like的使用对于索引的影响
今天看了一篇对于like使用对索引的影响的文章,发现自己实践的跟文章得出结论不大一样.所以还是建议自己再看别人文章的时候自己亲自动手实践一下.以免学到不全面的知识. 列子: 先建立一张表: -- 创建 ...
- 温故知新的错题训练:Coin game
传送门:http://192.168.173.163/JudgeOnline/problem.php?cid=1244&pid=1 输赢规则:无法再放下硬币的人就输. 博弈论的基本假定:他俩都 ...
- AE创建组件失败,项目中已存在对esri.arcgis.***的引用
AE创建组件失败,项目中已存在对esri.arcgis.***的引用 解决办法:在解决方案资源管理器的引用中把错误提示中的引用删掉,再创建组件就没问题了.
- Jmeter-基础实战
一.测试需求:测试20个用户访问web网站在负载达到30QPS时的平均响应时间 QPS:Query Per Second 每秒查询率.是一台查询服务器每秒能够处理的查询次数.在因特网上,作为域名系统服 ...
- Codeforces Round #614 (Div. 2) C - NEKO's Maze Game
题目链接:http://codeforces.com/contest/1293/problem/C 题目:给定一个 2*n的地图,初始地图没有岩浆,都可以走, 给定q个询问,每个询问给定一个点(x,y ...