NOI2024 集合 题解
给个链接:集合。
很神秘的题目。基本上看到之后就可以想到哈希。
首先想到一个比较神秘的暴力。就是对于每个询问,扫一遍所有 \(a\) 中的数出现的位置,把它弄成一个哈希值(具体怎么弄随意)存到 set 里,然后看看是不是和 \(b\) 中的数出现的位置这样操作后的集合完全相等。事实上就是判断是否对于所有在 \(a\) 中这个区间内出现的数 \(x\),都存在一个在 \(b\) 中出现的不同的数 \(y\),使得 \(x,y\) 出现的位置完全相同。这样做应该是有 \(70\) 分的,但是显然不够。
然后我们考虑一个事情,对于每一个 \(i\),\([i,j]\) 这个区间合法在 \(j\) 尽可能小的时候最有可能成立。换句话说有单调性,可以二分。
但是,二分是没有必要的,我们可以用双指针做的更好。因为,如果 \([i,j]\) 合法,\([i+1,j]\) 存在,那么 \([i+1,j]\) 合法。
所以我们对每个 \(i\) 找出最靠右的 \(j\) 且满足 \([i,j]\) 合法,然后就可以 \(O(1)\) 回答询问。时间复杂度 \(O(n+q)\)。
这里为了保险,把每个位置的值也做了哈希,用 \(p_i\) 存储。
给个代码:
#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define N 600005
using namespace std;
int n,m,q,a[N][3],b[N][3];
ull nowa[N],nowb[N],suma,sumb,p[N];
int ri[N];//使[i,j]合法的最靠右的j
ull get_rnd(ull x){
return x*x*x;//随便变换一下
}
void work(int id,int type){
for(int j=0;j<3;j++){
ull i=a[id][j];
suma-=get_rnd(nowa[i]);//把原来的值减掉
nowa[i]+=type*p[id];//看情况加上或减去这个位置的哈希值
suma+=get_rnd(nowa[i]);//加上现在的值
}
for(int j=0;j<3;j++){//这里同理
ull i=b[id][j];
sumb-=get_rnd(nowb[i]);
nowb[i]+=type*p[id];
sumb+=get_rnd(nowb[i]);
}
}
signed main(){
srand(time(0));
cin>>n>>m>>q;
for(int i=1;i<=n;i++){
for(int j=0;j<3;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=0;j<3;j++){
cin>>b[i][j];
}
}
for(int i=1;i<=n;i++){
ri[i]=n;
}
for(int i=1;i<=n;i++){
p[i]=rand()*rand()+923;
}
work(1,1);
for(int i=1,j=1;i<=n;i++){
while(j<=n&&suma==sumb){//如果当前仍然合法
j++;
if(j>n)break;
work(j,1);
}
ri[i]=min(ri[i],j-1);
work(i,-1);//i要右移,所以撤掉这一位的贡献
}
while(q--){
int l,r;
cin>>l>>r;
cout<<(ri[l]>=r?"Yes\n":"No\n");
}
return 0;
}
NOI2024 集合 题解的更多相关文章
- 牛客编程巅峰赛S1第11场 - 黄金&钻石 B.新集合 (DFS)
题意:有\([1,n]\)这\(n\)个数,构造集合,集合中不能包含\(u\)和\(v\),问最多能构造多少个集合. 题解:被这题卡了一整场.....以为是推公式,结果答案是暴搜? 首先我们先用一 ...
- [bzoj 3226]校门外的区间
题意 输出最后的集合 题解 校门外的树会做吧 区间知道是什么东西吧 校门外的区间会做了吧 昨天做个大线段树没做出来,今天做个小线段树压压惊 py一下输入数据,然后操作变成: U 区间涂1 I 两侧 ...
- POJ1112 Team Them Up!
Team them up! Input file teams.in Output file teams.out Your task is to divide a number of persons i ...
- poj-2524 ubiquitous religions(并查集)
Time limit5000 ms Memory limit65536 kB There are so many different religions in the world today that ...
- 牛客多校Round 5
Solved:3 rank:195 F. take 官方题解:小 A 在打开第 i 个箱子后会交换手中的钻石和第 i 个箱子中的钻石 当且仅当第 i个箱子的钻石是前 i 个箱子打开后出现的所有钻石里最 ...
- 「HNOI2015」亚瑟王
传送门 Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知,亚瑟 ...
- AtCoder Beginner Contest 177 D - Friends (并查集)
题意:有\(n\)个人,给你\(m\)对朋友关系,朋友的朋友也是朋友,现在你想要将他们拆散放到不同的集合中,且每个集合中的人没有任何一对朋友关系,问最少需要多少集合. 题解:首先用并查集将朋友关系维护 ...
- bzoj2839 集合计数 组合计数 容斥原理|题解
集合计数 题目描述 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数,答案模1000000007.(是 ...
- 【题解】LOJ2462完美的集合(树DP 魔改Lucas)
[题解]LOJ2462完美的集合(树DP 魔改Lucas) 省选模拟考这个??????????????????? 题目大意: 有一棵树,每个点有两个属性,一个是重量\(w_i\)一个是价值\(v_i\ ...
- 集合删数 (vijos 1545) 题解
[问题描述] 一个集合有如下元素:1是集合元素:若P是集合的元素,则2 * P +1,4*P+5也是集合的元素,取出此集合中最小的K个元素,按从小到大的顺序组合成一个多位数,现要求从中删除M个数位上的 ...
随机推荐
- #PowerBi 1分钟学会,用PowerBi获取数据库最近90天的数据(DATE_SUB)
在powerbi报表中,我们往往会对数据源进行日常刷新,powerbi链接了数据库的情况下,根据日期灵活取数是我们必须掌握的一个技能. 在本文中,我们将介绍如何使用 SQL 的 DATE_SUB 函数 ...
- redhat6.5 升级 openssl
上传版本包: openssl-1.0.1u.tar.gz 解压缩安装包: tar -xf openssl-1.0.1u.tar.gz 安装版本: ./config --prefix=/usr/loca ...
- Codeforces Round #243 (Div. 2) Problem B - Sereja and Mirroring 题解
http://codeforces.com/contest/426/problem/B 题意大概就是对称有关,要注意的是,当行数为奇数的时候,答案就是行数本身 #include<iostream ...
- Windows无法调节亮度
原因1:驱动问题 解决方式: 安装360驱动大师,一键安装. 也可以使用其他软件:如驱动精灵. 推荐使用电脑品牌本身的驱动软件:如联想:联想驱动管理 原因2:设备管理问题 解决方式: 计算机 -> ...
- 基于LoRA的RLHF
参考Github 开源模型LLM-Tuning 一.简介 (1)RLHF (基于人类反馈的强化学习) 分为三步: SFT (Supervised Fine-Tuning): 有监督的微调,使用正常的 ...
- mysql语句大全-工作中常用整理(欢迎大家在评论区继续补充)
1.NOT EXISTS 和 NOT IN SELECT COUNT(ca.aaa) FROM xx ca WHERE NOT EXISTS( SELECT label.* FROM xxx labe ...
- vulhub - INFOSEC PREP: OSCP
vulhub - INFOSEC PREP: OSCP 信息收集 nmap 192.168.157.0/24 nmap -sT --min-rate 10000 -p- 192.168.157.162 ...
- Linux 中 WIFI 和热点的使用
之前一直在 ubuntu 的图形界面中使用,突然需要在 ARM 板上打开热点,一时给弄蒙了,在此记录一下 一.网卡命令 显示所有网络信息 sudo ip link show 关闭或打开网络 sudo ...
- 学习笔记--Java构造方法
Java构造方法 关于构造方法 构造方法又被称作:构造函数/构造器/Constructor 语法结构: [修饰符列表] 构造方法名(形式参数列表){ 构造方法体; } 对比普通方法语法结构 [修饰符列 ...
- 顺序表之单链表(C实现)
// Code file created by C Code Develop #include "ccd.h"#include "stdio.h"#includ ...