题目地址

题目链接

题解

由乃题还是毒瘤啊orz

显然的一个结论是,如果保证不重复,维护区间min,max然后判断max-min+1==r-l+1是否成立即可

但是有重复

于是就要orz题解区的各位大佬了

各种神奇的判重方法是怎么想出来的qwq

这里列举几种

1.维护区间平方和+对大质数取模防止爆

这种我写了但是不知道为什么取模了就挂

2.维护区间平方和

直接暴力维护...然后就过了..?我写的就是这种

这里大概说一下:

就是维护一下区间min,max,平方和,这些线段树都可以做到

然后首先判断一下是否\(max-min+1==r-l+1\)

这是第一重判定

然后第二重判定用公式和实际平方和判

\[\sum{i^2}==sum(sum为区间平方和)
\]

什么?你不知道公式?

\(\sum_{i=1}^{n}{i^2}=\frac{n(n+1)(2n+1)}{6}\)

但是公式只有70。这样子乘会爆

于是我们暴力枚举求平方和

然后就过了

(虽然很慢就是了)

#include <bits/stdc++.h>

#define ll long long
const ll inf = 5e18;
const ll mod = 1e9 + 7;
const ll inv6 = 166666668;
#define il inline namespace io { #define in(a) a=read()
#define out(a) write(a)
#define outn(a) out(a),putchar('\n') #define I_int ll
inline I_int read() {
I_int x = 0 , f = 1 ; char c = getchar() ;
while( c < '0' || c > '9' ) { if( c == '-' ) f = -1 ; c = getchar() ; }
while( c >= '0' && c <= '9' ) { x = x * 10 + c - '0' ; c = getchar() ; }
return x * f ;
}
char F[ 200 ] ;
inline void write( I_int x ) {
if( x == 0 ) { putchar( '0' ) ; return ; }
I_int tmp = x > 0 ? x : -x ;
if( x < 0 ) putchar( '-' ) ;
int cnt = 0 ;
while( tmp > 0 ) {
F[ cnt ++ ] = tmp % 10 + '0' ;
tmp /= 10 ;
}
while( cnt > 0 ) putchar( F[ -- cnt ] ) ;
}
#undef I_int }
using namespace io ; using namespace std ; #define N 500010 int n, m;
ll a[N]; namespace seg_tree {
struct tree {
int l, r;
ll mx, mn;
ll sum;
} t[N << 2];
#define lc (rt << 1)
#define rc (rt << 1 | 1)
#define mid ((l + r) >> 1)
void pushup(int rt) {
t[rt].mn = min(t[lc].mn, t[rc].mn);
t[rt].mx = max(t[lc].mx, t[rc].mx);
t[rt].sum = (t[lc].sum + t[rc].sum);
}
void build(int l, int r, int rt) {
t[rt].l = l; t[rt].r = r; if(l == r) {t[rt].mn = t[rt].mx = a[l]; t[rt].sum = a[l]*a[l]; return;}
build(l, mid, lc); build(mid + 1, r, rc); pushup(rt);
}
#define l t[rt].l
#define r t[rt].r
void upd(int L, ll c, int rt) {
if(l == r) { t[rt].mn = t[rt].mx = c; t[rt].sum = c * c; return; }
if(L <= mid) upd(L, c, lc); if(L > mid) upd(L, c, rc); pushup(rt);
}
ll query1(int L, int R, int rt) { ll ans = 0; //平方和
if(L <= l && r <= R) return t[rt].sum;
if(L <= mid) ans = (ans + query1(L, R, lc)); if(R > mid) ans = (ans + query1(L, R, rc));
return ans;
}
ll query2(int L, int R, int rt) { ll ans = inf; //最小
if(L <= l && r <= R) return t[rt].mn;
if(L <= mid) ans = min(ans, query2(L, R, lc)); if(R > mid) ans = min(ans, query2(L, R, rc));
return ans;
}
ll query3(int L, int R, int rt) { ll ans = -inf; //最大
if(L <= l && r <= R) return t[rt].mx;
if(L <= mid) ans = max(ans, query3(L, R, lc)); if(R > mid) ans = max(ans, query3(L, R, rc));
return ans;
} #undef l
#undef r
#undef mid
#undef lc
#undef rc
}using namespace seg_tree; ll calc(ll l, ll r) {
ll ans = 0;
for(ll i = l; i <= r; i ++) {
ans = ans + i * i;
}
return ans;
} int main() {
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
#endif
n = read(), m = read();
for(int i = 1; i <= n; i ++) a[i] = read();
build(1, n, 1);
for(int i = 1; i <= m; i ++) {
int opt = read(), l = read(), r = read();
if(opt == 1) upd(l, r, 1);
else {
ll mx = query3(l, r, 1), mn = query2(l, r, 1);
// printf("Case#%d:max=%lld,min=%lld\n",i,mx,mn);
if(mx - mn != (r - l)) {puts("yuanxing"); continue;}
if(query1(l, r, 1) == calc(mn, mx)) puts("damushen");
else puts("yuanxing");
}
}
return 0;
}

3.平衡树+线段树

orz数据结构爷,不过貌似会爆空间

这里放个链接

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

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

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

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

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

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

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

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

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

  5. 「Luogu 3792」由乃与大母神原型和偶像崇拜

    更好的阅读体验 Portal Portal1: Luogu Description 给你一个序列\(a\) 每次两个操作: 修改\(x\)位置的值为\(y\): 查询区间\([l, r]\)是否可以重 ...

  6. 強大的javascrpt原型链學習

    一个自带隐式的 __proto__ 属性[implicit __proto__ property],指向foo的原型 這有點類似實現C# 繼承作用 a類的公共東西,給b和c類共用 var a = { ...

  7. Cocos引擎现身 IndiePrize 全球游戏开发者大会!Cocos的两大男神成为压轴嘉宾

    2019全球游戏开发者大会今天11月10日,在深圳南山海上世界文化艺术中心拉开帷幕.除了号称精品游戏"奥斯卡"的IndiePrize将在现场展开最终角逐,更有来自美国.俄罗斯.澳大 ...

  8. 《Xenogears》(异度装甲)隐含的原型与密码

    <Xenogears>(异度装甲)隐含的原型与密码 X 彩虹按:一种高次元的“生命体”,因“事故”被抓来当成“超能源”,其实那不只是“无限的能源”而已,“它”是有意志的!在我们眼里看来,这 ...

  9. 十大Intellij IDEA快捷键

    转载:http://blog.csdn.net/dc_726/article/details/42784275 Intellij IDEA中有很多快捷键让人爱不释手,stackoverflow上也有一 ...

随机推荐

  1. Game (思维)

    #include<bits/stdc++.h> using namespace std; ; char str[maxn][maxn]; int cntx[maxn], cnty[maxn ...

  2. Quick-Cocos2d-x文件结构分析

    在上一章我们讲过了Quick-Cocos2d-x中的环境搭建,这章我们分析下quick中的文件结构吧!打开quick的文件夹,可以看到如下的这些目录和文件: bin:存放各种与引擎相关的脚本 comp ...

  3. windows下配置lua环境

    1.进入lua官网http://www.lua.org/ 2.点击download 3.点击get a binary 4.点击[Lua - joedf's Builds] 5.选择适合自己的版本下载, ...

  4. 设计模式之模板方法模式:实现可扩展性设计(Java示例)

    概述 在实际开发中,常常会遇到一项基本功能需要支撑不同业务的情况.比如订单发货,有普通的整包发货,有分销单的发货,采购单的发货,有多商品的整包或拆包发货等.要想支持这些业务的发货,显然不能在一个通用流 ...

  5. Log4J基础详解及示例大全(转)

    log4j可以通过使用配置文件的方式进行配置. 配置步骤如下: 1.定义日志组件logger 每个logger都可以拥有一个或者多个appender,每个appender表示一个日志的输出目的地,比如 ...

  6. Linux基础命令---arping

    arping arping指令用于发送arp请求到一个相邻的主机,在指定网卡上发送arp请求指定地址,源地址使用-s指定.该指令可以直径ping MAC地址,找出哪些地址被哪些电脑使用了. 此命令的适 ...

  7. 目标检测论文阅读:Deformable Convolutional Networks

    https://blog.csdn.net/qq_21949357/article/details/80538255 这篇论文其实读起来还是比较难懂的,主要是细节部分很需要推敲,尤其是deformab ...

  8. 2019/3/20 wen 流程控制

  9. Prometheus监控学习笔记之PromQL 内置函数

    概述 Prometheus 提供了其它大量的内置函数,可以对时序数据进行丰富的处理.某些函数有默认的参数,例如:year(v=vector(time()) instant-vector).其中参数 v ...

  10. SVN更新无数次后仍显示Out of date

    理器相集成的TortoiseSVN更是方便. 但有时候在提交修改后的文件时,却莫名其妙的出现out of date错误,导致工程无法commit,即使将新文件删了重新update,然后再在旧文件上作修 ...