题目大意:维护一个序列,支持单点修改和查询一段区间能不能组成连续的一段数。

题解:查询区间能不能组成一段连续的数这个操作较为复杂,很难在较小时间复杂度内直接维护。这里采用线段树维护区间哈希的策略,即:维护一些其他的值间接地去逼近正解。在这里维护区间最大值、最小值、区间和、区间平方和、区间立方和即可。另外,由于数据范围 1e9,需要进行取模操作。

(脸黑,交了好几次才过。。QAQ

代码如下

#include <bits/stdc++.h>
using namespace std;
const int maxn=5e5+10;
const long long inf=1e18;
const int mod=1e9+7; inline int read(){
int x=0,f=1;char ch;
do{ch=getchar();if(ch=='-')f=-1;}while(!isdigit(ch));
do{x=x*10+ch-'0';ch=getchar();}while(isdigit(ch));
return f*x;
} int n,m;
long long a[maxn],s1,s2,s3,mi,mx;
struct node{
#define ls(x) t[x].lc
#define rs(x) t[x].rc
int lc,rc;
long long sum,sum2,sum3,mi,mx;
}t[maxn<<1];
int tot,root;
inline void pushup(int x){
t[x].mi=min(t[ls(x)].mi,t[rs(x)].mi);
t[x].mx=max(t[ls(x)].mx,t[rs(x)].mx);
t[x].sum=t[ls(x)].sum+t[rs(x)].sum;
t[x].sum2=(t[ls(x)].sum2+t[rs(x)].sum2)%mod;
t[x].sum3=(t[ls(x)].sum3+t[rs(x)].sum3)%mod;
}
int build(int l,int r){
int x=++tot;
if(l==r){t[x].mi=t[x].mx=t[x].sum=a[l],t[x].sum2=a[l]*a[l]%mod,t[x].sum3=t[x].sum2*a[l]%mod;return x;}
int mid=l+r>>1;
ls(x)=build(l,mid),rs(x)=build(mid+1,r);
return pushup(x),x;
}
void modify(int x,int l,int r,int pos,long long val){
if(l==r){t[x].mi=t[x].mx=val,t[x].sum=val,t[x].sum2=val*val%mod,t[x].sum3=t[x].sum2*val%mod;return;}
int mid=l+r>>1;
if(pos<=mid)modify(ls(x),l,mid,pos,val);
else modify(rs(x),mid+1,r,pos,val);
pushup(x);
}
void query(int o,int l,int r,int x,int y){
if(l==x&&r==y){
mi=min(mi,t[o].mi),mx=max(mx,t[o].mx);
s1+=t[o].sum,s2=(s2+t[o].sum2)%mod,s3=(s3+t[o].sum3)%mod;
return;
}
int mid=l+r>>1;
if(y<=mid)query(ls(o),l,mid,x,y);
else if(x>mid)query(rs(o),mid+1,r,x,y);
else query(ls(o),l,mid,x,mid),query(rs(o),mid+1,r,mid+1,y);
} void read_and_parse(){
n=read(),m=read();
for(int i=1;i<=n;i++)a[i]=read();
root=build(1,n);
} long long qs2(long long x){return x*(x+1)%mod*(2*x+1)%mod;}
long long qs3(long long x){return x*(x+1)%mod*x%mod*(x+1)%mod;} void solve(){
while(m--){
int opt=read();
if(opt==1){
int pos=read(),val=read();
modify(root,1,n,pos,val);
}else if(opt==2){
mi=inf,mx=-inf,s1=s2=s3=0;
int l=read(),r=read();
query(root,1,n,l,r);
if(mx-mi!=r-l)puts("yuanxing");
else if((mi+mx)*(r-l+1)/2!=s1)puts("yuanxing");
else if(s2*6%mod!=((qs2(mx)-qs2(mi-1))%mod+mod)%mod)puts("yuanxing");
else if(s3*4%mod!=((qs3(mx)-qs3(mi-1))%mod+mod)%mod)puts("yuanxing");
else puts("damushen");
}
}
} int main(){
read_and_parse();
solve();
return 0;
}

【洛谷P3792】由乃与大母神原型和偶像崇拜的更多相关文章

  1. 洛谷P3792 由乃与大母神原型和偶像崇拜

    P3792 由乃与大母神原型和偶像崇拜 题目背景 由乃最近没事干,去研究轻拍学去了 就是一个叫做flip flappers,轻拍翻转小膜女的番 然后研究的过程中她看到了一个叫做大母神原型的东西 大母神 ...

  2. p3792 由乃与大母神原型和偶像崇拜(思维+线段树)

    要求 1.修改x位置的值为y 2.查询区间l,r是否可以重排为值域上连续的一段 可以,很lxl 然后一开始思考合并区间,但是发现可以重排序,GG 然后想了特殊性质,比如求和,但是显然可以被叉 这时候我 ...

  3. AC日记——由乃与大母神原型和偶像崇拜 洛谷 P3792

    由乃与大母神原型和偶像崇拜 思路: 逆元+线段树维护和+线段树维护平方和+线段树维护最大最小值: 代码: #include <bits/stdc++.h> using namespace ...

  4. LuoguP3792 由乃与大母神原型和偶像崇拜

    题目地址 题目链接 题解 由乃题还是毒瘤啊orz 显然的一个结论是,如果保证不重复,维护区间min,max然后判断max-min+1==r-l+1是否成立即可 但是有重复 于是就要orz题解区的各位大 ...

  5. 「Luogu 3792」由乃与大母神原型和偶像崇拜

    更好的阅读体验 Portal Portal1: Luogu Description 给你一个序列\(a\) 每次两个操作: 修改\(x\)位置的值为\(y\): 查询区间\([l, r]\)是否可以重 ...

  6. 洛谷P4014 分配问题【最小/大费用流】题解+AC代码

    洛谷P4014 分配问题[最小/大费用流]题解+AC代码 题目描述 有 n 件工作要分配给 n 个人做.第 i 个人做第 j 件工作产生的效益为c ij. 试设计一个将 n 件工作分配给 n 个人做的 ...

  7. 洛谷——P1966 火柴排队&&P1774 最接近神的人_NOI导刊2010提高(02)

    P1966 火柴排队 这题贪心显然,即将两序列中第k大的数的位置保持一致,证明略: 树状数组求逆序对啦 浅谈树状数组求逆序对及离散化的几种方式及应用 方法:从前向后每次将数插入到bit(树状数组)中, ...

  8. 洛谷 P1373 小a和uim之大逃离

    2016-05-30 12:31:59 题目链接: P1373 小a和uim之大逃离 题目大意: 一个N*M的带权矩阵,以任意起点开始向右或者向下走,使得奇数步所得权值和与偶数步所得权值和关于K的余数 ...

  9. 洛谷1373 小a和uim之大逃离

    洛谷1373 小a和uim之大逃离 本题地址:http://www.luogu.org/problem/show?pid=1373 题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北 ...

随机推荐

  1. 《RabbitMQ Tutorial》译文 第 1 章 简介

    原文来自 RabbitMQ 英文官网的教程(1.Introduction),其示例代码采用了 .NET C# 语言. RabbitMQ is a message broker: it accepts ...

  2. 阿里云centos内docker的搭建

    由于docker在17之后的版本分成了docker EE(企业版)和docker CE(社区版),那么我们在安装的时候就要开始纠结的选择了,这里我推荐了docker CE(社区版). 实际上这两个版本 ...

  3. Linux ugo 权限

    Linux 系统中文件的 ugo 权限是 Linux 进行权限管理的基本方式.本文将介绍 ugo 权限的基本概念.说明:本文的演示环境为 ubuntu 16.04. 文件的所有者和组 Linux 文件 ...

  4. Ionic 2 官方示例程序 Super Starter

    原文发表于我的技术博客 本文分享了 Ionic 2 官方示例程序 Super Starter 的简要介绍与安装运行的方法,最好的学习示例代码,项目共包含了 14 个通用的页面设计,如:引导页.主页面详 ...

  5. HTML 5 拖放

    拖放(Drag 和 drop)是 HTML5 标准的组成部分. 拖放 拖放是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放. 拖放事件 1. ...

  6. 牛客多校第三场-A-PACM Team-多维背包的01变种

    题目我就不贴了...说不定被查到要GG... 题意就是我们需要在P,A,C,M四个属性的限制下,找到符合条件的最优解... 这样我们就需要按照0/1背包的思路,建立一个五维度数组dp[i][j][k] ...

  7. <a>标签中href="javascript:;"** 为什么 style不用src**

    &src/href <!--href 用于标示资源和文档关系,src 用于替换标签内容--> <img src="xxx.jpg"/> <sc ...

  8. 读《移山之道——VSTS软件开发指南》

    读<移山之道>这本书差不多用了一个星期的时间,感觉还是收获了一些知识的,以前只是会简单地编个小程序(虽然现在也是这样),但看过这本书之后我对软件开发这个概念的认识度有了从一片模糊到了解大体 ...

  9. 团队作业 week 14

    0. 在吹牛之前,先回答这个问题: 如果你的团队来了一个新队员,有一台全新的机器, 你们是否有一个文档,只要设置了相应的权限,她就可以根据文档,从头开始搭建环境,并成功地把最新.最稳定版本的软件编译出 ...

  10. Linux内核分析第三周学习总结

    Linux内核源码简介 arch/ 该目录中包含和硬件体系结构相关的代码,每种平台占一个相应的目录. 和32位PC相关的代码存放在x86目录下. 每种平台至少包含3个子目录:kernel(存放支持体系 ...