P3792 由乃与大母神原型和偶像崇拜

devtools/2024/10/22 8:16:55/

原题链接

不愧是 lxl,硬控我一个半小时。最终也是极限卡过了。

这道题题解区有许多用哈希思想做的,可能实现方式略有不同。而我还是喜欢写保证了正确性的做法。具体说,就是用线段树维护区间最大最小值,因为是一段连续的数,区间极差肯定与区间长度相等。再就是确保区间内无重复数字。

所以问题关键是如何判断区间内是否有重复数字。这里有一个常用的 trick,我们可以维护每个数前驱(一个数的前驱就是与它相等的最近的那个位置),然后只需要查询区间中前驱最大值即可。若前驱最大值在左端点外,则区间内无重复数字,你可以画图手玩一下,原因其实很好理解。

但是又有新问题了,因为题中带单点修改,所以我们还要考虑修改对前驱的影响。自然可以想到先离散化,然后对每个数都建一个 set,维护这个数出现的所有下标,接下来就很好维护了。

大常数 5 e 5 , O ( n l o g n ) 5e5,O(nlogn) 5e5,O(nlogn),lxl 只给 1 s 1s 1s。不过勉强还能过,下面是我的最劣解代码qwq

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int read(){int x=0,f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();return x*f;
}
int n,m,a[N],tot,pre[N];
set<int> s[N];set<int>::iterator it;map<int,int> mp;
struct node{int l,r,Mn,Mx,mx;
}tr[N*4];
struct question{int opt,x,y;
}q[N];
void pushup(int u){tr[u].mx=max(tr[u<<1].mx,tr[u<<1|1].mx);tr[u].Mx=max(tr[u<<1].Mx,tr[u<<1|1].Mx);tr[u].Mn=min(tr[u<<1].Mn,tr[u<<1|1].Mn);
}
void build(int u,int l,int r){if(l==r) tr[u]={l,r,a[l],a[l],pre[l]};else{tr[u].l=l,tr[u].r=r;int mid=(l+r)>>1;build(u<<1,l,mid),build(u<<1|1,mid+1,r);pushup(u);}
}
void modify(int u,int x,int v){if(tr[u].l==x&&tr[u].r==x) tr[u].mx=v;else{int mid=(tr[u].l+tr[u].r)>>1;if(x<=mid) modify(u<<1,x,v);else modify(u<<1|1,x,v);pushup(u);}
}
void modify_val(int u,int x,int v){if(tr[u].l==x&&tr[u].r==x) tr[u].Mn=tr[u].Mx=v;else{int mid=(tr[u].l+tr[u].r)>>1;if(x<=mid) modify(u<<1,x,v);else modify(u<<1|1,x,v);pushup(u);}
}
int query(int u,int l,int r){if(tr[u].l>=l&&tr[u].r<=r) return tr[u].mx;int mid=(tr[u].l+tr[u].r)>>1,ans=0;if(l<=mid) ans=max(ans,query(u<<1,l,r));if(r>mid) ans=max(ans,query(u<<1|1,l,r));return ans;
}
int query_mx(int u,int l,int r){if(tr[u].l>=l&&tr[u].r<=r) return tr[u].Mx;int mid=(tr[u].l+tr[u].r)>>1,ans=0;if(l<=mid) ans=max(ans,query_mx(u<<1,l,r));if(r>mid) ans=max(ans,query_mx(u<<1|1,l,r));return ans;	
}
int query_mn(int u,int l,int r){if(tr[u].l>=l&&tr[u].r<=r) return tr[u].Mn;int mid=(tr[u].l+tr[u].r)>>1,ans=1e9;if(l<=mid) ans=min(ans,query_mn(u<<1,l,r));if(r>mid) ans=min(ans,query_mn(u<<1|1,l,r));return ans;	
}
void Modify(int i,int y){//a[i]<-yint x=mp[a[i]];it=s[x].find(i);it++;if(it!=s[x].end()){pre[*it]=pre[i];modify(1,*it,pre[*it]);}it--;s[x].erase(it);a[i]=y;x=mp[y],s[x].insert(i);it=s[x].find(i);it--;pre[i]=*it;it++,it++;if(it!=s[x].end()){pre[*it]=i;modify(1,*it,pre[*it]);}modify(1,i,pre[i]),modify_val(1,i,a[i]);
}
int main(){n=read(),m=read();for(int i=1;i<=n;i++){a[i]=read();if(!mp[a[i]]) mp[a[i]]=++tot,s[tot].insert(0);pre[i]=*(--s[mp[a[i]]].end());s[mp[a[i]]].insert(i);}build(1,1,n);for(int i=1;i<=m;i++){int opt=read(),x=read(),y=read();if(opt==1){if(!mp[y]) mp[y]=++tot,s[y].insert(0);Modify(x,y);}else{int res=query(1,x,y),mn=query_mn(1,x,y),mx=query_mx(1,x,y);if(mx-mn==y-x&&res<x) puts("damushen");else puts("yuanxing");}}return 0;
}

http://www.ppmy.cn/devtools/122156.html

相关文章

Async-Validator——表单验证的艺术

在现代 web 应用开发中&#xff0c;表单验证是一个不可或缺的部分。它确保了用户输入的数据符合预期的格式和规则&#xff0c;从而提高了数据的质量和用户体验。async-validator 是一个强大的 JavaScript 库&#xff0c;它专门用于异步表单验证&#xff0c;被广泛应用于主流 UI…

java中有两个list列表,尽量少的去循环

java中有两个list列表&#xff0c;一个list列表是paymentRecord&#xff0c;另外一个list是listApplyBase&#xff0c;paymentRecord中的lendCode字段值跟listApplyBase中的repaymentCode字段值是对应的&#xff0c;用stream流去循环paymentRecord列表&#xff0c;然后判断当pa…

Oracle bbed编译安装及配置

1. 什么是bbed &#xff1f; Oracle Block Brower and EDitor Tool,是一个可以对oracle data block进行查看&#xff0c;编辑修改的内置工具。对于bbed&#xff0c;oracle本身是不提供支持的。 2. 如何编译bbed环境&#xff1f; 10g版本&#xff1a; 1) 编译bbed cd $ORACL…

基于imdb数据集的情感分析个人的所有博客汇总

1. IMDB 数据集下载 Imdb影评的数据集介绍与下载_imdb已整理数据集-CSDN博客 2. RNN 或 LSTM 模型 [深度学习]-基于tensorflow的CNN和RNN-LSTM文本情感分析对比-CSDN博客 [深度学习TF2][RNN-LSTM]文本情感分析包含&#xff08;数据预处理-训练-预测&#xff09;_lstm预测模…

CMake所学

向大佬lyf学习&#xff0c;先把其8服务器中所授fine 文章目录 前言一、CMakeList.txt 命令1.1 最外层CMakeLists1.1.1 cmake_minimum_required&#xff08;&#xff09;1.1.2 project&#xff08;&#xff09;1.1.3 set&#xff08;&#xff09;1.1.4 add_subdirectory&#xf…

鸿蒙OpenHarmony

开源鸿蒙系统编译指南 Ubuntu编译环境配置第一步&#xff1a;Shell 改 Bash第二步&#xff1a;安装Git和安装pip3工具第三步&#xff1a;远程仓配置第四步&#xff1a;拉取代码第五步&#xff1a;安装编译环境第六步&#xff1a;本地编译源码 Windows开发环境配置第一步&#x…

使用Qt进行TCP和UDP网络编程

使用Qt进行TCP和UDP网络编程 Qt 提供了强大的网络模块&#xff0c;用于支持基于TCP和UDP协议的网络通信。在Qt中&#xff0c;TCP 和 UDP 的实现分别使用 QTcpSocket、QTcpServer 和 QUdpSocket 类。TCP 提供了可靠的面向连接的通信方式&#xff0c;而 UDP 则提供了快速的、无连…

面试题3-JDBC操作数据库的步骤

使用 JDBC&#xff08;Java Database Connectivity&#xff09;操作数据库的基本步骤可以总结为以下几个关键步骤。JDBC 是 Java 语言中与数据库交互的 API&#xff0c;允许开发人员通过标准的接口操作数据库。 1.加载数据库驱动程序 在使用 JDBC 操作数据库之前&#xff0c;首…