首页 > 其他分享 >P10785 [NOI2024] 集合

P10785 [NOI2024] 集合

时间:2024-08-28 16:37:51浏览次数:11  
标签:Hash P10785 int s2 s1 NOI2024 集合 id define

思路:

容易发现,区间 \([l,r]\) 中 \(A\) 与 \(B\) 等价的充分必要条为:

  • 两个序列中所有元素对于在区间 \([l,r]\) 内的出现集合组成的集合相等。

  • 这样才可以使得存在一种对应的映射方案使得等价。

考虑哈希判定。

设 \(S_i\) 表示 \(i\) 出现的位置的集合,则设 \(\operatorname{Hash}(S_x) = \sum\limits_{i \in S_x} base^i\),\(\operatorname{Hash}(A/B) = \sum\limits_{i=1}^m \operatorname{Hash}(S_i)\)。

固定左端点 \(l\) 时,容易发现 \(r\) 具有单调性,考虑求出 \(len_l\) 表示以 \(l\) 为左端点的最长等价区间,使用双指针算法;

设当前加入的数为 \(a_i\),则重新计算下 \(\operatorname{Hash}(S_{a_i})\) 即可,删除同理。

因为当前是单哈希,且基本都是加法哈希,可以双哈希 \(\operatorname{Hash}(S_i)\) 稳固一下。

时间复杂度为 \(O(N+Q)\)。

完整代码:

#include<bits/stdc++.h>
#define Add(x,y) (x+y>=mod)?(x+y-mod):(x+y)
#define lowbit(x) x&(-x)
#define pi pair<ll,ll>
#define pii pair<ll,pair<ll,ll>>
#define iip pair<pair<ll,ll>,ll>
#define ppii pair<pair<ll,ll>,pair<ll,ll>>
#define fi first
#define se second
#define full(l,r,x) for(auto it=l;it!=r;it++) (*it)=x
#define Full(a) memset(a,0,sizeof(a))
#define open(s1,s2) freopen(s1,"r",stdin),freopen(s2,"w",stdout);
#define For(i,l,r) for(int i=l;i<=r;i++)
#define _For(i,l,r) for(int i=r;i>=l;i--)
using namespace std;
typedef long double lb;
typedef double db;
typedef unsigned long long ull;
typedef long long ll;
bool Begin;
const ll N=2e5+10,M=6e5+10;
const ull base=127;
inline ll read(){
    ll x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-')
          f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9'){
        x=(x<<1)+(x<<3)+(c^48);
        c=getchar();
    }
    return x*f;
}
inline void write(ll x){
	if(x<0){
		putchar('-');
		x=-x;
	}
	if(x>9)
	  write(x/10);
	putchar(x%10+'0');
}
mt19937_64 R(time(0));
ull h1,h2;
int n,m,q,p,l,r;
int len[N],a[N][3],b[N][3];
ull f[N],s1[M],s2[M];
inline ull Hash(ull x){
	return x*f[x%(N-1)+1];	
}
inline void insert1(int x,int id){
	h1-=Hash(s1[x]);
	s1[x]+=f[id];
	h1+=Hash(s1[x]);
}
inline void insert2(int x,int id){
	h2-=Hash(s2[x]);
	s2[x]+=f[id];
	h2+=Hash(s2[x]);
}
inline void del1(int x,int id){
	h1-=Hash(s1[x]);
	s1[x]-=f[id];
	h1+=Hash(s1[x]);
}
inline void del2(int x,int id){
	h2-=Hash(s2[x]);
	s2[x]-=f[id];
	h2+=Hash(s2[x]);
}
inline void insert(int x){
	For(i,0,2){
		insert1(a[x][i],x);
		insert2(b[x][i],x);
	}
}
inline void del(int x){
	For(i,0,2){
		del1(a[x][i],x);
		del2(b[x][i],x);
	}
}
bool End;
int main(){
	//open("A.in","A.out");
	n=read(),m=read(),q=read();
	f[0]=1;	
	For(i,1,N-1)
	  f[i]=f[i-1]*base;
	For(i,1,n)
	  For(j,0,2)
	    a[i][j]=read();
	For(i,1,n)
	  For(j,0,2)
	    b[i][j]=read();
	for(int l=1,r=0;l<=n;){
		while(r<l){
			++r;
			insert(r);
		}
		while(r<=n&&h1==h2){
			r++;
			insert(r);
		}
		del(r--);
		len[l]=r;
		del(l++);
	}
	while(q--){
		l=read(),r=read();
		if(r>len[l])
		  puts("No");
		else
		  puts("Yes");
	}
	cerr<<'\n'<<abs(&Begin-&End)/1048576<<"MB";
	return 0;
}

标签:Hash,P10785,int,s2,s1,NOI2024,集合,id,define
From: https://www.cnblogs.com/rgw2010/p/18385044

相关文章

  • 量化交易资料集合
    最近整理了下收集的量化交易学习资料,包含了优秀博客、学习课程和学习书籍,还是比较全面的,在这里推荐给大家。请大家点赞收藏!学习平台1、BigQuantBigQuant是一个基于大数据和人工智能的量化交易平台,提供便捷的策略创建、回测与优化工具。用户可以利用平台上的机器学习与自然......
  • Unity 3D学习资料集合
    本文包含了unity3D游戏开发相关的学习资料,包含了入门、进阶、性能优化、面试和书籍等学习资料,含金量非常高,在这里分享给大家,欢迎收藏。学习社区1.Unity3D开发者Unity3D开发者论坛是一个专注于Unity引擎的开发者社区。在这个论坛上,开发者们可以分享自己的项目经验、技术问......
  • iOS面试资料集合
    本文主要收集了一些iOS面试资料,包含面试课程(5门)、面试题(158题)、面试书籍(3本)。希望对大家有用。一、课程集合1、解决面试摩擦透析iOS的Runtime机制这门课程主要深入讲解iOS的Runtime机制,包括Objective-C的消息发送、动态方法解析、类和对象的内部结构等内容。通过系统地解析R......
  • NOI2024 D1T3 口胡题解
    NOI2024D1T3口胡题解题目条件其实就是说对于点对\((a,b)\),从\(a\)到\(b\)的路径上至少要有一条从\(b\)指向\(a\)​的边。将初始状态记作\((T,S)\)​,其中\(T\)​是树,\(S\)​是二元组\((a,b)\)​的集合。注意到特殊性质A蕴含了:如果对于所有二元组\((a,b)\),\(a......
  • Java10 集合
    集合集合集合接口等级:Collection:单例集合接口,将数据一个一个存储,存储的是值。ArrayList类:泛型集合Linkedlist集合:Vector集合:Stack集合:Vetor的子类Set接口:存储是无序的,且集合中的元素不可重复Hashset集合:Linkedhashset:是有序不重复的set集合,继承于hashsetTreeset:排序,去......
  • 【29期】Java集合框架 10 连问,你有被问过吗?
    1.HashMap和HashTable的区别?HashMap不是线程安全的HashMap是map接口的实现类,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。HashMap允许nullkey和nullvalue,而HashTable不允许。HashTable是线程安全CollectionHashMap是HashTa......
  • 人工智能学习资料集合
    机器学习是一个相对来说技术含量比较高的领域,需要通过多种途径结合才能高效的学习。首先介绍几个比较有用的社区,包含了丰富的学习资料。学习社区1. 神力AI(MANA)神力AI是一个聚焦于人工智能技术应用与研究的社区。它旨在为开发者和研究人员提供一个资源丰富的平台,成员可......
  • 前端学习资料集合
    针对前端的学习,不同阶段采用的方式是不一样的。本文把前端的学习分为入门、实战、进阶三个阶段。下面分开来说一、入门阶段入门阶段的目标是学会前端的基本语法和知识,能够解决一些简单的问题。这个阶段不建议看书学习,效率太慢。这个阶段不追求知识广度,只要求能够快速上手就行......
  • JAVA学习之集合
    1.集合的概念    将若干用途、性质相同或相近的“数据”组合而成的一个整体。    Java集合只能保存引用类型的数据,不能保存基本类型数据。Java常用集合:Set(集):集合中的对象不按特定方式排序,并且没有重复对象。List(列表):集合中的对象按照索引位置排序,可以有重......
  • 【故障识别与诊断】基于EEMD-MPE-KPCA-BILSTM(集合经验模态分解-多尺度排列嫡-核主元
      ......