「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$ ...
随机推荐
- uniapp 用户拒绝授权再次调起授权-语音识别、微信地址、附近地址
小程序重构,采用 uniapp 框架.记录一下踩过的坑.关于用户拒绝再次调起授权,及如何识别语音识别.微信地址.附近地址的处理. 语音识别 组件 语音识别,小程序只有录音功能,若要识别录音文件,常规做 ...
- Web页面解析过程(浅)
web页面流程 域名解析DNS 域名解析:把域名指向网络空间IP,让人们通过简单的域名访问Web网站的服务. DNS:域名系统 DNS服务器:记录着域名及其对应的IP地址 解析域名: 浏览器中输入 ...
- 网络游戏开发-客户端1(开始Hello world)
打开Egret Launcher ,新建一个EUI项目,起名为 EQiPai 这里需要勾选的是socket网络库,game游戏库.如果要面向海外用户的话,建议勾上Facebook的小游戏sdk. 然后 ...
- 02-05 scikit-learn库之线性回归
目录 scikit-learn库之线性回归 一.LinearRegression 1.1 使用场景 1.2 代码 1.3 参数详解 1.4 属性 1.5 方法 1.5.1 报告决定系数 二.ARDRe ...
- ES三节点重启后报错no known master node
问题 一直在研究ES的监控怎么做,想偷点懒,不去通过API获取然后计算,就想找个现成的插件或者监控软件,只要装个agent就可以,然后就找到了x-pack,插件装好了之后,需要重启ES集群,线上的ES ...
- C++简单程序设计
计算机的最基本功能是数据处理 l C++支持的基本数据类型: n 整数.实数.字符.布尔数据 l C++支持的基本运算 n 算术运算.关系运算.逻辑运算.位运算.逗号运算.条件运算 程序要能够 ...
- PHP 组件注册的例子
<?php namespace Test; abstract class Plugin { protected $pluginName = null; abstract public funct ...
- opencv::轮廓发现(find contour in your image)
轮廓发现(find contour) 轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法. 所以边缘提取的阈值选定会影响最终轮廓发现结果 //发现轮廓 cv::findContours( InputO ...
- Go语言系列开发之延迟调用和作用域
Hello,各位小伙伴大家好,我是小栈君,最近一段时间我们将继续分享关于go语言基础系列,当然后期小栈君已经在筹划关于java.Python,数据分析.人工智能和大数据等相关系列文章.希望能和大家一起 ...
- 3、Struts2的API访问和数据封装
一.API的访问 在使用Struts2的框架的过程中,发现Struts2和Servlet的API是解耦合的.在实际开发中,经常使用到Servlet的API,比如进行登录,将用户的信息保存到Sessio ...