更好的阅读体验

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. e课表项目第二次冲刺周期第二天

    昨天干了什么? 昨天与我们小组的成员商量了一个重大的决定,确定了我们转型发展的主题,简要的设计了我们软件要实现的功能,并且完成了首导航栏的设计,和一部分框架的内容填充. 今天干了什么? 我们组今天通过 ...

  2. JVM之内存结构详解

    对于开发人员来说,如果不了解Java的JVM,那真的是很难写得一手好代码,很难查得一手好bug.同时,JVM也是面试环节的中重灾区.今天开始,<JVM详解>系列开启,带大家深入了解JVM相 ...

  3. CH3803扑克牌

    Description 背景 lqhsr生日那天,Rainbow来找lqhsr玩扑克牌-- 玩着玩着Rainbow觉得太没意思了,于是决定给lqhsr一个考验~~~ 描述 Rainbow把一副扑克牌( ...

  4. 再谈Transaction——MySQL事务处理分析

    MySQL 事务基础概念/Definition of Transaction 事务(Transaction)是访问和更新数据库的程序执行单元;事务中可能包含一个或多个 sql 语句,这些语句要么都执行 ...

  5. 经典的Redis的主从复制搭建

    ##### 配置服务器   1).打开redis.conf文件修改 bind 指定的ip地址: ![image](https://img2018.cnblogs.com/blog/1334966/20 ...

  6. jQuery v1.10.2如何判断checkbox(复选框)是否被选中

    做项目时,我们经常会用到jquery来做一些判断,今天自己遇上判断复选框是否选中,然后搜索查看,发现现在网上的都是错误的,下面罗列错误的: 1.$("#id").attr(&quo ...

  7. plSql使用流程

    1. 下载PLSQL developer.instantclient_11_2, 下载地址:https://pan.baidu.com/s/1_MjmIT4nUzsQ7Hi8MCrs1A, 备注:此安 ...

  8. veil-Evasion免杀使用

    Veil-Evasion 是 Veil-Framework 框架的一部分,也是其主要的项目.利用它我们可以生成绕过杀软的 payload   kali 上并未安装,下面我们来进行简单的安装.我们直接从 ...

  9. 下载达 10 万次的 IDEA 插件,K8s 一键部署了解一下?

    作者 | 铃儿响叮当 导读:涉及开发的技术人员,永远绕不开的就是将应用部署到相应服务器上,本文将给大家讲解:对于容器服务 ACK,怎么实现真正"一键部署",提高开发部署效率,在 K ...

  10. 解决 IDEA 创建 Gradle 项目没有src目录

    第一次写博客,前几天遇到一个问题,就是使用ider创建gradle项目后,src目录没有自动生成出来,今天就给大家分享一下怎么解决. 目录: 1.创建Gradle项目 2.解决没有生成src目录问题 ...