更好的阅读体验

Portal

Portal1: Luogu

Description

给你一个序列\(a\)

每次两个操作:

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

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

Input

第一行两个数\(n, m\);

第二行\(n\)个数表示\(a[i]\);

后面m行每行三个数opt x y,或者opt l r,代表操作。

Output

如果可以,输出damushen

否则输出yuanxing

Sample Input

5 5
1 2 3 4 5
2 1 5
2 2 3
2 3 3
1 3 6
2 3 5

Sample Output

damushen
damushen
damushen
damushen

Hint

对于\(30\%\)的数据,\(n, m \le 500\);

对于\(60\%\)的数据,\(n, m \le 100000\);

对于\(100\%\)的数据,\(n, m \le 500000\)。

值域\(10 ^ 9\);

时限:\(2s\)

Solution

这题很明显用线段树解决。

题目要求的是更新一个点,查询一个区间是否能够一个等差数列,我们可以线段树维护最小值,最大值以及区间平方和,在查询的时候我们先询问出最小值与最大值,为等差数列的头与尾,那么我们可以算出这个数列的长度,与题目给出的是否一致,不一致就可以输出yuanxing

然后询问线段树的元素的平方和,与计算的头与尾构成的数列的平方和是否一致。

但由于long long自然溢出问题,计算时用暴力解决即可。

Code

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath> using namespace std; typedef long long LL;
const int INF = 0x7f7f7f7f, MAXN = 2000005, MAXM = 500005;
int n, m, l, r, opt, a[MAXM];
namespace Segtree {
#define lc rt << 1
#define rc rt << 1 | 1
struct node {
int Min, Max;
LL sum;
} tree[MAXN];
inline void pushup(int rt) {
tree[rt].sum = tree[lc].sum + tree[rc].sum;
tree[rt].Min = min(tree[lc].Min, tree[rc].Min);
tree[rt].Max = max(tree[lc].Max, tree[rc].Max);
}
inline void pushdown(int rt, int val) {
tree[rt].sum = val * val;
tree[rt].Min = val;
tree[rt].Max = val;
}
inline void build(int rt, int l, int r) {//建树
if (l == r) {
pushdown(rt, a[l]);
return ;
}
int mid = l + r >> 1;
build(lc, l, mid);
build(rc, mid + 1, r);
pushup(rt);
}
inline void update(int rt, int l, int r, int pos, int val) {//线段树更改
if (l == r) {
pushdown(rt, val);
return ;
}
int mid = l + r >> 1;
if (pos <= mid) update(lc, l, mid, pos, val); else update(rc, mid + 1, r, pos, val);
pushup(rt);
}
inline int query_min(int rt, int l, int r, int ansl, int ansr) {//线段树询问区间最小值
if (ansl <= l && r <= ansr) return tree[rt].Min;
int mid = l + r >> 1, ret = INF;
if (ansl <= mid) ret = min(ret, query_min(lc, l, mid, ansl, ansr));
if (mid < ansr) ret = min(ret, query_min(rc, mid + 1, r, ansl, ansr));
return ret;
}
inline int query_max(int rt, int l, int r, int ansl, int ansr) {//线段树询问区间最大值
if (ansl <= l && r <= ansr) return tree[rt].Max;
int mid = l + r >> 1, ret = -INF;
if (ansl <= mid) ret = max(ret, query_max(lc, l, mid, ansl, ansr));
if (mid < ansr) ret = max(ret, query_max(rc, mid + 1, r, ansl, ansr));
return ret;
}
inline LL query_sum(int rt, int l, int r, int ansl, int ansr) {//线段树询问区间平方和
if (ansl <= l && r <= ansr) return tree[rt].sum;
int mid = l + r >> 1;
LL ret = 0;
if (ansl <= mid) ret += query_sum(lc, l, mid, ansl, ansr);
if (mid < ansr) ret += query_sum(rc, mid + 1, r, ansl, ansr);
return ret;
}
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
Segtree :: build(1, 1, n);
for (int i = 1; i <= m; i++) {
scanf("%d", &opt);
if (opt == 1) {
scanf("%d%d", &l, &r);
Segtree :: update(1, 1, n, l, r);
} else {
scanf("%d%d", &l, &r);
int first = Segtree :: query_min(1, 1, n, l, r), last = Segtree :: query_max(1, 1, n, l, r);
if (r - l != last - first) {
printf("yuanxing\n");
continue;
}
LL ans = 0;
for (int i = first; i <= last; i++)
ans += (LL)(i * i);
if (ans == Segtree :: query_sum(1, 1, n, l, r)) printf("damushen\n"); else printf("yuanxing\n");
}
}
return 0;
}

「Luogu 3792」由乃与大母神原型和偶像崇拜的更多相关文章

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

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

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

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

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

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

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

    题目大意:维护一个序列,支持单点修改和查询一段区间能不能组成连续的一段数. 题解:查询区间能不能组成一段连续的数这个操作较为复杂,很难在较小时间复杂度内直接维护.这里采用线段树维护区间哈希的策略,即: ...

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

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

  6. 「 Luogu P1231 」 教辅的组成

    题目大意 有 $\text{N1}$ 本书 $\text{N2}$本练习册 $\text{N3}$本答案,一本书只能和一本练习册和一本答案配对.给你一些书和练习册,书和答案的可能的配对关系.问你最多可 ...

  7. 「Luogu 1525」关押罪犯

    更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Description \(S\)城现有两座监狱,一共关押着\(N\)名罪犯,编号分别为\(1 - N\) ...

  8. 「Luogu P2201」数列编辑器 解题报告

    数列编辑器,在线IDE 本期的主题是洛谷的在线IDE 小学生?!小学生虐我

  9. 「 Luogu P1850 」 换教室

    解题思路 很明显的是个期望 $dp$. 先前想到 $dp[i][j]$ 表示第决策到第 $i$ 个时间段,已经进行了 $j$ 次申请,然后就没有然后了,因为这根本就没法转移啊,你又不知道前 $i-1$ ...

随机推荐

  1. C# 创建自定义配置节点1

    转载:http://www.educity.cn/develop/495003.html 在.Net应用程序中我们经常看到VS为我们生成的项目工程中都会含有app.config或者web.connfi ...

  2. 记录一次Metaspace扩容引发FGC的调优总结

    开始之前 在开始之前先记录一个我碰到的jvm调优的坑.那就是… 为啥我配置到idea64exe.vmoptions中的参数没有生效??? 由于之前一直是在mac上开发,本地开发时当需要优化jvm参数的 ...

  3. net core WebApi——使用NPOI导入导出操作

    目录 前言 NPOI 测试 小结 @ 前言 时间过得好快,在之前升级到3.0之后,就感觉好久没再动过啥东西了,之前有问到Swagger的中文汉化,虽说我觉得这种操作的意义不是太大,也是多少鼓捣了下,其 ...

  4. Python分布式爬虫必学框架Scrapy打造搜索引擎 ✌✌

    Python分布式爬虫必学框架Scrapy打造搜索引擎  ✌✌ (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌) 第1章 课程介绍 介绍课程目标.通过课程能学习到 ...

  5. .net工作流引擎ccflow开发平台属性功能的隐藏显示介绍

    关键字: 工作流程管理系统 工作流引擎 asp.net工作流引擎 java工作流引擎. 表单引擎 工作流功能说明  工作流设计 工作流快速开发平台   业务流程管理   bpm工作流系统  java工 ...

  6. Debian更新源加安装Metespolit&&Cobalt Strike

    首先更新下源 修改/etc/apt/sources.list文件 再apt-get update deb http://mirrors..com/debian/ stretch main non-fr ...

  7. ESP8266开发之旅 进阶篇⑥ ESP-specific APIs说明

    1.前言     在介绍Arduino Core For ESP8266的时候,博主着重讲解了WIFI库的使用,但是并没有涉及到ESP8266硬件本身的一些特有API.所以,这一章我们将讲解ESP82 ...

  8. 百万年薪python之路 -- 函数初始

    1.函数 1.1 认识函数 定义一个事情或者是功能,等到需要的时候直接去用就好了.那么这里定义东西就是一个函数 函数:对代码块和功能的封装和定义 函数的好处: 减少代码的重复性 代码可读性高 将功能进 ...

  9. 6G仅仅是比5G多1G吗??

    第六代移动通信系统(6th generation mobile networks,或6th generation wireless systems),简称6G,是指第六代移动通信技术,是5G系统后的延 ...

  10. 设计模式(四)Factory Method模式

    简单来说,用Template Method模式来构建生成实例的工厂,就是Factory Method模式.在这个模式中,父类决定实例的生成方式,但不决定所要生成的具体的类,具体的处理全部交给子类负责. ...