更好的阅读体验

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. Paid Roads POJ - 3411

    A network of m roads connects N cities (numbered from 1 to N). There may be more than one road conne ...

  2. 寻找子串位置<codevs>

    KMP板子题; 如果不会可以参考其他算法书 代码: #include<iostream> #include<stdio.h> #include<stdlib.h> ...

  3. SQL SERVER数据库基本语法汇总,仅代表个人整理,仅供参考

    以下SQL基本语法皆由本人整理,以下做一个汇总,关于游标,可作为了解,不要求掌握,其他查询.修改.删除操作等基本语法必须会使用.select * from [dbo].[TBICJE]select m ...

  4. Java 的基本程序设计结构

    从Hello Word入手 public class HelloWorld { /* 第一个Java程序 */ public static void main(String[] args) { Sys ...

  5. 理解numpy.dot()

    import numpy.matlib import numpy as np a = np.array([[1,2],[3,4]]) b = np.array([[11,12],[13,14]]) p ...

  6. C语言-查找一个元素在数组中的位置

    #include<stdio.h> #include <stdlib.h> #include <time.h> int search(int key, int a[ ...

  7. DJango错误日志生成

    DJango错误日志生成 setting.py设置 LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'formatters': ...

  8. Jmeter数据库测试参数化

    一.JDBC Request参数化 方法一.Jmeter参数化,在sql query中使用变量 Jmeter参数化,使用csv参数化 sql query中使用${变量名}引用 设置变量 输出结果: 方 ...

  9. 代码审计-phpcms9任意文件读取

    漏洞文件: /phpcms/modules/content/down.php download函数 这个函数开始几行代码的作用和init函数中的几乎一样,都是从parse_str 解析传入的a_k参数 ...

  10. 浏览器渗透框架BeEF使用笔记(二)

    0x03 常用模块 1-信息收集 可以收集到例如 浏览器名称版本 浏览器用户版本 插件(包括Java,ActiveX,VBS,Flash……) 窗口大小 1)details面板收集 (2)插件收集信息 ...