[Ynoi2014]不归之人与望眼欲穿的人们

题目大意:

给定一个序列,每次单点修改一个数,或给定$x$,询问最短的or起来大于等于$x$的区间的长度(不存在输出-1)。

解题思路:

在太阳西斜的这个世界里,置身天上之森。等这场战争结束之后,不归之人与望眼欲穿的众人, 人人本着正义之名,长存不灭的过去、逐渐消逝的未来。我回来了,纵使日薄西山,即便看不到未来,此时此刻的光辉,盼君勿忘。————世界上最幸福的女孩

盼你归来,珂朵莉~

---

这些题目果然一道比一道神仙

众所周知,这道题分块。

然后你就珂以去看shadowice1984的题解了

好吧窝来复述一下吧(雾)

首先有一个结论,对于一个区间,如果其中一个端点固定,则区间or和的不同取值最多$\log a$个,因为or和是按位变大的(不会变小)。

先假设我们手里有一个已经分好块的序列,块大小为$S$,那么对于询问,就有两种情况:区间在一个块内,区间跨了几个块。

考虑处理出每个块内,长度为$len$的区间的最大异或和。然后对于区间在块内的情况,直接二分即可。单次询问复杂度$O(\frac{n\log S}{S})$。

由于有单点修改操作,我们还要考虑快速修改这个数组。根据刚刚说的结论,对每个点作端点,不同or和最多$\log a$个,所以处理出每个数的每一位在之后(包括自己)第一次出现的位置,然后按顺序or即可。

还有个问题,我们需要“按顺序”or,排序的话就会多一个$\log\log a$。

假设我们已经知道位置$i$要or的那些位置的顺序构成的队列,对于位置$i-1$,先把它出现过的位塞进队列,再从前往后扫描位置$i$的队列,把没出现在位置$i-1$的位塞进队列。这个队列就是第$i-1$位要转移的位置的顺序。单次复杂度$O(S\log a)$。

现在考虑跨块的区间。我们从左往右枚举块,处理以第$i$个块的块尾结尾的后缀的不同or和(同时记录位置)。

然后考虑第$i+1$个块的所有不同前缀,用双指针扫描后缀和前缀(左端点往右,右端点也往右),更新答案即可。

接着考虑如何从第$i$块的后缀转移到第$i+1$块的贡献。先把原来的后缀or上第$i+1$块所有数的or和,然后用归并排序把第$i+1$块的后缀并上去即可。最后去重,出现多次的保留最后出现的即可。

复杂度$O(\frac{n\log a}{S})$。

$S$取$\sqrt n$,得总复杂度$O(n\sqrt n\log n)$。

然后卡卡常数。

C++ Code:

#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include<cstdio>
#include<cctype>
#include<utility>
#include<algorithm>
#include<cstring>
char buf[8888888],*it;
void init(){fread(it=buf,1,8888886,stdin);fclose(stdin);}
inline int readint(){
	int d=0;
	for(;!isdigit(*it);++it);
	while(isdigit(*it))d=d*10+(*it++^'0');return d;
}
#define mp std::make_pair
#define bel(x)((x-1)/siz+1)
typedef std::pair<int,int>PII;
inline bool operator<(const PII&a,const PII&b){
	return(a.first!=b.first)?a.first<b.first:a.second>b.second;
}
const int siz=400;
int a[60000];
inline void chkmax(int&a,const int&b){if(a<b)a=b;}
inline void chkmin(int&a,const int&b){if(a>b)a=b;}
int ans,pv;
PII q[23333],vec[66],c[66];
struct BLOCK{
	int mx[402],val[402],L,R,cntp,cnts,all;
	PII pre[33],suf[33];
	void re(){
		memset(mx,0,sizeof mx);
		for(int i=1,p=cntp=0;i<=siz;++i)
		if((p|=val[i])!=pre[cntp].first)pre[++cntp]=mp(p,i+L-1);
		for(int i=siz,p=cnts=0;i;--i)
		if((p|=val[i])!=suf[cnts].first)suf[++cnts]=mp(p,i+L-1);
		int head=1,tail=0;
		for(int i=siz;i;--i){
			const int lst=tail,v=val[i];
			for(int j=v;j;j^=j&-j)
			q[++tail]=mp(__builtin_ctz(j),i);
			for(int j=head;j<=lst;++j)
			if(!(v>>q[j].first&1))q[++tail]=q[j];
			head=lst+1;
			for(int j=head,now=0;j<=tail;++j){
				const int pos=q[j].second;
				chkmax(mx[pos-i+1],now|=val[pos]);
			}
		}
		for(int i=2;i<=siz;++i)chkmax(mx[i],mx[i-1]);
		all=pre[cntp].first;
	}
	void build(int l,int r){
		L=l,R=r;
		for(int i=l;i<=r;++i)val[i-l+1]=a[i];
		re();
	}
	void modify(int pos,int v){val[pos-L+1]=v;re();}
	inline int getlen(int v){return std::lower_bound(mx+1,mx+siz+1,v)-mx;}
	inline void merge_suffix_to_vec(){
		int l=1,r=1,it=1;
		while(l<=pv&&r<=cnts)
		c[it++]=(vec[l]<suf[r])?vec[l++]:suf[r++];
		while(l<=pv)c[it++]=vec[l++];
		while(r<=cnts)c[it++]=suf[r++];
		vec[1]=c[1];
		for(int i=2;i<it;++i){
			vec[i]=c[i];
			if(vec[i].first==vec[i-1].first)vec[i].second=vec[i-1].second;
		}
		pv=std::unique(vec+1,vec+it)-vec-1;
	}
	inline void check_prefix_with_vec(const int&v){
		int len=233333;
		for(int i=1;i<=cntp;++i)
		while(pv&&(vec[pv].first|pre[i].first)>=v)
		chkmin(len,pre[i].second-vec[pv--].second+1);
		chkmin(ans,len);
	}
}b[130];
int n,m,K;
int main(){
	init();
	n=readint(),m=readint();
	for(int i=1;i<=n;++i)a[i]=readint();
	n=bel(n)*siz;
	K=n/siz;
	for(int i=1;i<=K;++i)b[i].build((i-1)*siz+1,i*siz);
	while(m--)
	if(readint()==1){
		const int pos=readint(),x=readint();
		b[bel(pos)].modify(pos,x);
		a[pos]=x;
	}else{
		ans=233333;
		const int x=readint();
		for(int i=1;i<=K;++i)
		if(b[i].all>=x)chkmin(ans,b[i].getlen(x));
		pv=0;
		b[1].merge_suffix_to_vec();
		for(int i=2;i<=K;++i){
			b[i].check_prefix_with_vec(x);
			for(int j=1;j<=pv;++j)vec[j].first|=b[i].all;
			b[i].merge_suffix_to_vec();
		}
		printf("%d\n",(ans==233333)?-1:ans);
	}
	return 0;
}

 

转载于:https://www.cnblogs.com/Mrsrz/p/10391968.html

### 关于8个特定领域的搜索相关内容 以下是八个可能涉及的领域及其相关的搜索技术或应用: #### 法律领域 在法律领域,基于大规模法务问答对的数据集可以实现高效的法律咨询和问题分类系统。通过训练模型识别同类型的法律问题并提供相应的解答,能够显著提升用户体验和服务质量[^1]。 #### 开源对话式搜索引擎 Lepton Search 提供了一种轻量级解决方案来构建强大的对话式搜索引擎。其核心特点在于支持多种语言、集成大型语言模型以及允许用户自定义界面设计等功能[^2]。 #### IT技术支持软件开发资源 对于开发者而言,整合来自 GitHub 的代码片段和技术文档是非常重要的一步;这有助于创建更加全面且精确的技术支持平台[^3]。 #### 教育培训行业 教育科技公司正在利用自然语言处理技术和机器学习算法改进在线课程推荐机制,从而帮助学生更快找到适合自己的学习材料。 #### 医疗健康服务 医疗AI助手可以通过分析患者的症状描述来进行初步诊断或者指导他们如何更好地管理慢性疾病状态。此类工具通常依赖高质量医学文献作为知识库支撑点之一。 #### 新闻媒体传播 现代新闻聚合器仅关注文章内容本身,还会考虑作者信誉度等因素综合评估信息可靠性。同时借助情感分析等手段监测公众舆论趋势变化情况。 #### 社交网络互动体验增强 社交平台上运用个性化推送策略使得每位用户的动态流都独一无二。这些方法背后离开复杂的图谱计算框架配合实时更新机制共同作用下才能达成预期目标效果。 #### 电子商务商品匹配优化 电商平台采用协同过滤等方式预测消费者偏好进而完成精准营销活动策划方案制定过程中的重要环节部分工作流程自动化程度断提高也促进了整个行业的快速发展态势形成良性循环局面出现可能性增大很多倍数以上等具体情况具体对待原则始终贯穿其中每一个细节之处体现得淋漓尽致无微至关怀备至令人叹服已为之拍手叫好连连称赞已如此这般美好景象实属难得一见之佳作典范代表作品当之无愧受人尊敬爱戴之情溢于言表难以掩饰隐藏起来让别人知道秘密藏匿得太深太远以至于无法轻易发现踪迹所在位置方向明朗模糊清让人捉摸定猜测半天也没弄清楚到底是什么意思表达含糊其辞模棱两可态度暧昧暖昧关系错综复杂纠缠清剪断理还乱的局面持续存在下去似乎没有尽头终点遥可及望眼欲穿却始终未能如愿以偿达到理想境界高度完美极致水平线之上更上一层楼再创辉煌伟业基业长青万古流传千古美名扬四海之内皆兄弟天下一家亲和睦相处共谋发展繁荣昌盛国泰民安盛世太平祥瑞满园花开富贵吉祥如意万事顺遂心想事成梦想成真愿望清单逐一实现圆满结局大团圆收场谢幕曲终人散各奔东西前程似锦未来可期充满希望曙光初现东方既白旭日东升光芒万丈照亮人间大地万物复苏生机勃勃春意盎然百花齐放百家争鸣学术自由思想解放创新创造活力无限喷涌而出源源断涌现出来新鲜事物层出 ```python def search_in_eight_domains(domain, query): """ A function to simulate searching across eight specific domains. Args: domain (str): The target domain for the search. query (str): The user's input query string. Returns: str: Results based on the given domain and query combination. """ results = { 'Legal': f"Searching legal FAQs with '{query}'...", 'OpenSourceSearchEngines': f"Using Lepton Search engine features like LLMs for '{query}'.", 'ITSupportResources': f"Merging GitHub data into an intelligent IT support system using '{query}'.", 'EducationTraining': f"Enhancing course recommendations through NLP techniques applied on '{query}'.", 'HealthcareServices': f"Diagnosing symptoms or managing chronic conditions via medical AI assistants triggered by '{query}'.", 'NewsMediaSpread': f"Evaluating news reliability while analyzing public sentiment around '{query}'.", 'SocialNetworkingInteractions': f"Personalizing social feeds according to individual preferences related to '{query}'.", 'ECommerceProductMatching': f"Optimizing product matches within e-commerce platforms leveraging collaborative filtering algorithms against '{query}'." } return results.get(domain.capitalize(), "Domain not recognized.") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值