官方题解

看了题解才会做..

首先考虑如果所有询问的点都是[1,n]的做法,如果询问是[l,r]只需要把多余的去掉就好了

然后要把问题转化为一个点对其他附近的点的贡献

记$pre[i]$为第i个位置的数字上一次出现的位置,记$nxt[i]$为第i个位置上的数字下一次出现的位置,显然这些东西都能扫一遍求出来

然后对于一个点,它能做出贡献的区间是:$$[\frac{pre[i]+i}{2}+1,\frac{i+nxt[i]}{2}]$$

如果不在这个区间内的话,显然选择$pre[i]$或者$nxt[i]$更优秀

我们把这个区间分成两份$$[\frac{pre[i]+i}{2}+1,i] and [i,\frac{i+nxt[i]}{2}]$$

对于前一个区间这个点i对点j做出的贡献为$i-j$,对于后一个区间则为$j-i$

我们维护两个树状数组,一个记录自己点上的坐标被加/减了多少次,另一个记录这个点上被别的点贡献了多少权值即可

如果不是每次询问[1,n]的话,我们把询问记录下来,离线差分解决即可

 #include<bits/stdc++.h>
#define int long long
#define inf (0x3f3f3f3f)
#define writeln(x) write(x),puts("")
#define writep(x) write(x),putchar(' ')
using namespace std;
inline int read(){
int ans=,f=;char chr=getchar();
while(!isdigit(chr)){if(chr=='-') f=-;chr=getchar();}
while(isdigit(chr)){ans=(ans<<)+(ans<<)+chr-;chr=getchar();}
return ans*f;
}void write(int x){
if(x<) putchar('-'),x=-x;
if(x>) write(x/);
putchar(x%+'');
}const int M = 2e5+;
int n,nxt[M],pre[M],T,cnt[M],a[M],ans[M];
struct Que{int pos,opt,id;};
struct P{int s[M];
#define lowbit(x) (x&-x)
inline void Update(int x,int y){for(;x<=n;x+=lowbit(x))s[x]+=y;}
inline int Query(int x,int ans=){for(;x;x-=lowbit(x))ans+=s[x];return ans;}
inline void Update(int l,int r,int x){Update(l,x),Update(r+,-x);}
#undef lowbit
}T1,T2;vector<int>tp[M];vector<Que>Q[M];
inline void Update(int i){
int l=(pre[i]+i>>)+;if(l<)l=;
T1.Update(l,i,i),T2.Update(l,i,-);
int r=nxt[i]+i>>;if(r>n)r=n;
T1.Update(i,r,-i),T2.Update(i,r,);
}inline int Query(int pos){
return T2.Query(pos)*pos+T1.Query(pos);
}signed main(){
n=read(),T=read();
for(int i=;i<=n;i++){
a[i]=read();pre[i]=-inf,nxt[i]=inf;
if(tp[a[i]].size()) nxt[pre[i]=*tp[a[i]].rbegin()]=i;
tp[a[i]].push_back(i);
}for(int i=;i<=T;i++){
int pos=read(),l=read(),r=read();
Q[l-].push_back((Que){pos,-,i});
Q[r].push_back((Que){pos,,i});
}for(int i=;i<=n;i++){
for(int pos:tp[i])Update(pos);
for(Que now:Q[i]) ans[now.id]+=now.opt*Query(now.pos);
}for(int i=;i<=T;i++)printf("%lld\n",ans[i]);
return ;
}

[LOJ#6468.] 魔法的更多相关文章

  1. LOJ.#6468. 魔法[差分+树状数组]

    题意 题目链接 分析 将询问差分并不断加入颜色. 每种颜色,一个位置 \(p\) 都只会走到与之左右相邻的两个位置之一,分类讨论 \(\rm |A-B|\) 的符号. 实现可以使用树状数组. 总时间复 ...

  2. LOJ#2245 魔法森林

    这道题以前zbtrs大佬给我讲过.但是我只知道思想,不知道要lct维护... 这个套路很常见. 题意:给你一个无向图,每条边有a,b两个权值.求1到n号点的一条路径,路径的权值是每条边的最大a与最大b ...

  3. Loj #3089. 「BJOI2019」奥术神杖

    Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...

  4. Loj #6503. 「雅礼集训 2018 Day4」Magic

    Loj #6503. 「雅礼集训 2018 Day4」Magic 题目描述 前进!前进!不择手段地前进!--托马斯 · 维德 魔法纪元元年. 1453 年 5 月 3 日 16 时,高维碎片接触地球. ...

  5. loj2245 [NOI2014]魔法森林 LCT

    [NOI2014]魔法森林 链接 loj 思路 a排序,b做动态最小生成树. 把边拆成点就可以了. uoj98.也许lct复杂度写假了..越卡常,越慢 代码 #include <bits/std ...

  6. 【转】【译】JavaScript魔法揭秘--探索当前流行框架中部分功能的处理机制

    推荐语: 今天推荐一篇华为同事的同事翻译的一篇文章,推荐的主要原因是作为一个华为员工居然晚上还能写文章,由不得小钗不佩服!!! 其中的jQuery.angular.react皆是十分优秀的框架,各有特 ...

  7. BZOJ 3343: 教主的魔法 [分块]【学习笔记】

    3343: 教主的魔法 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1172  Solved: 526[Submit][Status][Discus ...

  8. PHP的魔法方法__set() __get()

    php的魔法方法__set()与__get() Tags: PHP 我们先来看看官方的文档如何定义他们的: public void __set(string $name, mixed $value); ...

  9. 【BZOJ3669】[Noi2014]魔法森林 LCT

    终于不是裸的LCT了...然而一开始一眼看上去这是kruskal..不对,题目要求1->n的路径上的每个点的两个最大权值和最小,这样便可以用LCT来维护一个最小生成路(瞎编的...),先以a为关 ...

随机推荐

  1. [机器学习][face recognition] 一个视频人脸识别实现

    开发环境和用到的库: Ubuntu jupyter notebook(python3.6) OpenCV Dlib face_recognition 实现效果如下(视频截图): #coding=utf ...

  2. 在Ubuntu下安装source Insight

    在ubuntu中,安装windows程序用wine,然后用wine安装windows软件即可. 安装wine sudo apt-get install wine 下载sourceinsight的exe ...

  3. teb教程4

    障碍物避障以及机器人足迹模型 简介:障碍物避障的实现,以及必要参数的设置对于机器人足迹模型和其对应的影响 1.障碍物避障是怎样工作的 1.1 惩罚项 障碍物避障作为整个路径优化的一部分.显然,优化是找 ...

  4. QMap的key也可以是一个结构体类吗?

    QMap<usbsnvidpid, QVector<QString>> USBVIDPIDTIME; USBVIDPIDTIME.insert(m_vidpidsn, time ...

  5. java反射技术主要实现类有哪些,作用分别是什么

    Java反射技术主要实现类有哪些,作用分别是什么? 在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中 1)Class类:代表一个类 2)Field 类 ...

  6. hdu 5792 树状数组+离散化+思维

    题目大意: Given a sequence A with length n,count how many quadruple (a,b,c,d) satisfies: a≠b≠c≠d,1≤a< ...

  7. JavaWeb开发中遇到的错误:org.apache.catalina.core.StandardWrapperValve invoke

    org.apache.catalina.core.StandardWrapperValve invoke 今天写代码,竟然接连遇到这个异常好几次.debug几个小时才弄明白,晕. 上网找了些拼凑下做个 ...

  8. spring boot基于DRUID数据源密码加密及数据源监控实现

    前言 随着需求和技术的日益革新,spring boot框架是越来越流行,她也越来越多地出现在我们的项目中,当然最主要的原因还是因为spring boot构建项目实在是太爽了,构建方便,开发简单,而且效 ...

  9. web服务nginx和php的相互关系

    nginx和php有什么关系?很多新手可能有这个疑问,我之前学php也没注意这些问题,只管着按文档配置操作,完成php项目就不管了,最近特意总结了一下. php是一门编程语言,讲究说学逗唱...呃,不 ...

  10. idea 中使用dataBase插件

    最近一段时间重新开始学习Java 使用IntelliJ 发现有个链接数据库插件挺好用的,并且反应速度还挺快的记录下. 点击步骤:View → Tool Windows → data 进行数据库链接 发 ...