ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

#zkw线段树#洛谷 3792 由乃与大母神原型和偶像崇拜

2021-08-11 11:01:40  阅读:170  来源: 互联网

标签:洛谷 rr min int mn 3792 ans 大母 mx


题目

给你一个长为 \(n\) 的序列 \(a\)

每次两个操作:

修改 \(x\) 位置的值为 \(y\)

查询区间 \([l,r]\) 是否可以重排为值域上连续的一段


分析

直接维护区间最大值和最小值,
若\(\sum p^x=\sum p^{a_i}\),
那么可以重排,此题卡常,要用zkw线段树


代码

#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
const int N=25000011,M=500011,mod=998244353;
int n,s[N],c[M],a[M],m;
inline signed iut(){
	rr int ans=0; rr char c=getchar();
	while (!isdigit(c)) c=getchar();
	while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
	return ans;
}
inline signed mo(int x,int y){return x+y>=mod?x+y-mod:x+y;}
inline signed min(int a,int b){return a<b?a:b;}
inline signed max(int a,int b){return a>b?a:b;}
struct zkw{
	int w[2][M<<2],bas;
	inline void build(int n){
		for (bas=1;(bas<<=1)<n+2;);
		for (rr int i=1;i<bas*2;++i) w[0][i]=N;
		for (rr int i=bas+1;i<=bas+n;++i)
		    w[0][i]=a[i-bas],w[1][i]=a[i-bas];
		for (rr int i=bas;i;--i)
		    w[0][i]=min(w[0][i<<1],w[0][i<<1|1]),
		    w[1][i]=max(w[1][i<<1],w[1][i<<1|1]);
	}
	inline void update(int x){
		for (w[0][x+bas]=a[x],x+=bas,x>>=1;x;x>>=1)
		    w[0][x]=min(w[0][x<<1],w[0][x<<1|1]);
		for (w[1][x+bas]=a[x],x+=bas,x>>=1;x;x>>=1)
		    w[1][x]=max(w[1][x<<1],w[1][x<<1|1]);
	}
	inline void query(int x,int y,int &mn,int &mx){
		for (x+=bas-1,y+=bas+1;x^y^1;x>>=1,y>>=1){
			if (!(x&1)) mn=min(mn,w[0][x^1]);
			if (!(x&1)) mx=max(mx,w[1][x^1]);
			if (y&1) mn=min(mn,w[0][y^1]);
			if (y&1) mx=max(mx,w[1][y^1]);
		}
	}
}Tre;
inline void Update(int x,int y){
	for (;x<=n;x+=-x&x) c[x]=mo(c[x],y);
}
inline signed Query(int x){
	rr int ans=0;
	for (;x;x-=-x&x) ans=mo(ans,c[x]);
	return ans;
}
signed main(){
	n=iut(),m=iut(),s[0]=1;
	for (rr int i=1;i<N;++i) s[i]=331ll*s[i-1]%mod;
	for (rr int i=1;i<N;++i) s[i]=mo(s[i-1],s[i]);
	for (rr int i=1;i<=n;++i) a[i]=iut()+1;
	for (rr int i=1;i<=n;++i) c[i]=mo(c[i-1],mo(s[a[i]],mod-s[a[i]-1]));
	for (rr int i=n;i;--i) c[i]=mo(c[i],mod-c[i&(i-1)]);
	Tre.build(n);
	for (rr int i=1;i<=m;++i){
		rr int opt=iut(),x=iut(),y=iut();
		if (opt==1){
			++y,Update(x,mo(mo(s[y],mod-s[y-1]),mod-mo(s[a[x]-1],mod-s[a[x]]))),
			a[x]=y,Tre.update(x);
		}else{
			rr int mn=N,mx=0; Tre.query(x,y,mn,mx);
			puts((mo(s[mx],Query(x-1))==mo(Query(y),s[mn-1]))?"damushen":"yuanxing");
		}
	}
	return 0;
}

标签:洛谷,rr,min,int,mn,3792,ans,大母,mx
来源: https://www.cnblogs.com/Spare-No-Effort/p/15127240.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有