官方题解

看了题解才会做..

首先考虑如果所有询问的点都是[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. neo4j简单学习

    阅读更多 背景 最近在一些论坛或者新闻里看到了neo4j,一种擅长处理图形的数据库. 据说非常适合做一些join关系型的查询,所以抽空也看了下相关文档,给自己做个技术储备. 过程 深入学习之前,先在网 ...

  2. 移动端mintUI mt-datetime-picker 组件使用详解

    <mt-datetime-picker v-model="pickerVisible" //绑定的数据值 ref="pickerData" // 点击触发 ...

  3. im开发总结:netty的使用

    最近公司在做一个im群聊的开发,技术使用得非常多,各种代码封装得也是十分优美,使用到了netty,zookeeper,redis,线程池·,mongdb,lua,等系列的技术 netty是对nio的一 ...

  4. vue组件库的基本开发步骤

    市面上目前已有各种各样的UI组件库,比如 Element 和 iView,他们的强大毋庸置疑.但是我们面临的情况是需求越来越复杂,当它们不能再满足我们需求的时候,这个时候就有必要开发一套属于自己团队的 ...

  5. tinkphp5.0目录结构说明

    tinkphp5.0目录结构说明 project 应用部署目录 ├─application 应用目录(可设置) │ ├─common 公共模块目录(可更改) │ ├─index 模块目录(可更改) │ ...

  6. node.js提供的服务器live-server的使用

    安装node.js的版本控制工具nvm,在终端中执行 curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/instal ...

  7. ElasticSearch---初识

    1.概述 1.1 ElasticSearch是一个   基于Lucene   的  搜索服务器: 1.2 ElasticSearch 提供了一个分布式多用户能力的全文搜索引擎,基于  RESTful ...

  8. Python爬虫实战——反爬策略之代理IP【无忧代理】

    一般情况下,我并不建议使用自己的IP来爬取网站,而是会使用代理IP. 原因很简单:爬虫一般都有很高的访问频率,当服务器监测到某个IP以过高的访问频率在进行访问,它便会认为这个IP是一只"爬虫 ...

  9. leetcode-第14周双周赛-1271-十六进制魔术数字

    自己的提交: class Solution: def toHexspeak(self, num: str) -> str: num = hex(int(num)) num = str(num)[ ...

  10. c++之初始化列表

    #include<iostream> using namespace std; class Person{ public: int m_a; int m_b; int m_c; Perso ...