「Luogu 3792」由乃与大母神原型和偶像崇拜
Portal
Portal1: Luogu
Description
给你一个序列\(a\)
每次两个操作:
- 修改\(x\)位置的值为\(y\); 
- 查询区间\([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」由乃与大母神原型和偶像崇拜的更多相关文章
- AC日记——由乃与大母神原型和偶像崇拜 洛谷 P3792
		由乃与大母神原型和偶像崇拜 思路: 逆元+线段树维护和+线段树维护平方和+线段树维护最大最小值: 代码: #include <bits/stdc++.h> using namespace ... 
- 洛谷P3792 由乃与大母神原型和偶像崇拜
		P3792 由乃与大母神原型和偶像崇拜 题目背景 由乃最近没事干,去研究轻拍学去了 就是一个叫做flip flappers,轻拍翻转小膜女的番 然后研究的过程中她看到了一个叫做大母神原型的东西 大母神 ... 
- LuoguP3792 由乃与大母神原型和偶像崇拜
		题目地址 题目链接 题解 由乃题还是毒瘤啊orz 显然的一个结论是,如果保证不重复,维护区间min,max然后判断max-min+1==r-l+1是否成立即可 但是有重复 于是就要orz题解区的各位大 ... 
- 【洛谷P3792】由乃与大母神原型和偶像崇拜
		题目大意:维护一个序列,支持单点修改和查询一段区间能不能组成连续的一段数. 题解:查询区间能不能组成一段连续的数这个操作较为复杂,很难在较小时间复杂度内直接维护.这里采用线段树维护区间哈希的策略,即: ... 
- p3792 由乃与大母神原型和偶像崇拜(思维+线段树)
		要求 1.修改x位置的值为y 2.查询区间l,r是否可以重排为值域上连续的一段 可以,很lxl 然后一开始思考合并区间,但是发现可以重排序,GG 然后想了特殊性质,比如求和,但是显然可以被叉 这时候我 ... 
- 「 Luogu P1231 」 教辅的组成
		题目大意 有 $\text{N1}$ 本书 $\text{N2}$本练习册 $\text{N3}$本答案,一本书只能和一本练习册和一本答案配对.给你一些书和练习册,书和答案的可能的配对关系.问你最多可 ... 
- 「Luogu 1525」关押罪犯
		更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Description \(S\)城现有两座监狱,一共关押着\(N\)名罪犯,编号分别为\(1 - N\) ... 
- 「Luogu P2201」数列编辑器 解题报告
		数列编辑器,在线IDE 本期的主题是洛谷的在线IDE 小学生?!小学生虐我 
- 「 Luogu P1850 」  换教室
		解题思路 很明显的是个期望 $dp$. 先前想到 $dp[i][j]$ 表示第决策到第 $i$ 个时间段,已经进行了 $j$ 次申请,然后就没有然后了,因为这根本就没法转移啊,你又不知道前 $i-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 ... 
- 寻找子串位置<codevs>
			KMP板子题; 如果不会可以参考其他算法书 代码: #include<iostream> #include<stdio.h> #include<stdlib.h> ... 
- SQL SERVER数据库基本语法汇总,仅代表个人整理,仅供参考
			以下SQL基本语法皆由本人整理,以下做一个汇总,关于游标,可作为了解,不要求掌握,其他查询.修改.删除操作等基本语法必须会使用.select * from [dbo].[TBICJE]select m ... 
- Java 的基本程序设计结构
			从Hello Word入手 public class HelloWorld { /* 第一个Java程序 */ public static void main(String[] args) { Sys ... 
- 理解numpy.dot()
			import numpy.matlib import numpy as np a = np.array([[1,2],[3,4]]) b = np.array([[11,12],[13,14]]) p ... 
- C语言-查找一个元素在数组中的位置
			#include<stdio.h> #include <stdlib.h> #include <time.h> int search(int key, int a[ ... 
- DJango错误日志生成
			DJango错误日志生成 setting.py设置 LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'formatters': ... 
- Jmeter数据库测试参数化
			一.JDBC Request参数化 方法一.Jmeter参数化,在sql query中使用变量 Jmeter参数化,使用csv参数化 sql query中使用${变量名}引用 设置变量 输出结果: 方 ... 
- 代码审计-phpcms9任意文件读取
			漏洞文件: /phpcms/modules/content/down.php download函数 这个函数开始几行代码的作用和init函数中的几乎一样,都是从parse_str 解析传入的a_k参数 ... 
- 浏览器渗透框架BeEF使用笔记(二)
			0x03 常用模块 1-信息收集 可以收集到例如 浏览器名称版本 浏览器用户版本 插件(包括Java,ActiveX,VBS,Flash……) 窗口大小 1)details面板收集 (2)插件收集信息 ... 
