[LOJ#6468.] 魔法
看了题解才会做..
首先考虑如果所有询问的点都是[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.] 魔法的更多相关文章
- LOJ.#6468. 魔法[差分+树状数组]
题意 题目链接 分析 将询问差分并不断加入颜色. 每种颜色,一个位置 \(p\) 都只会走到与之左右相邻的两个位置之一,分类讨论 \(\rm |A-B|\) 的符号. 实现可以使用树状数组. 总时间复 ...
- LOJ#2245 魔法森林
这道题以前zbtrs大佬给我讲过.但是我只知道思想,不知道要lct维护... 这个套路很常见. 题意:给你一个无向图,每条边有a,b两个权值.求1到n号点的一条路径,路径的权值是每条边的最大a与最大b ...
- Loj #3089. 「BJOI2019」奥术神杖
Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...
- Loj #6503. 「雅礼集训 2018 Day4」Magic
Loj #6503. 「雅礼集训 2018 Day4」Magic 题目描述 前进!前进!不择手段地前进!--托马斯 · 维德 魔法纪元元年. 1453 年 5 月 3 日 16 时,高维碎片接触地球. ...
- loj2245 [NOI2014]魔法森林 LCT
[NOI2014]魔法森林 链接 loj 思路 a排序,b做动态最小生成树. 把边拆成点就可以了. uoj98.也许lct复杂度写假了..越卡常,越慢 代码 #include <bits/std ...
- 【转】【译】JavaScript魔法揭秘--探索当前流行框架中部分功能的处理机制
推荐语: 今天推荐一篇华为同事的同事翻译的一篇文章,推荐的主要原因是作为一个华为员工居然晚上还能写文章,由不得小钗不佩服!!! 其中的jQuery.angular.react皆是十分优秀的框架,各有特 ...
- BZOJ 3343: 教主的魔法 [分块]【学习笔记】
3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1172 Solved: 526[Submit][Status][Discus ...
- PHP的魔法方法__set() __get()
php的魔法方法__set()与__get() Tags: PHP 我们先来看看官方的文档如何定义他们的: public void __set(string $name, mixed $value); ...
- 【BZOJ3669】[Noi2014]魔法森林 LCT
终于不是裸的LCT了...然而一开始一眼看上去这是kruskal..不对,题目要求1->n的路径上的每个点的两个最大权值和最小,这样便可以用LCT来维护一个最小生成路(瞎编的...),先以a为关 ...
随机推荐
- Python之向函数传递元组和字典
也可以在函数定义时加上这两个参数用以接收多余的参数哦~
- vue provide/inject 父组件如何给孙子组件传值
一般情况下我们父子组件之间的传值用的是props,这个就不多说了,但是如果想让父组件给子组件的组件传值怎么办呢,如果还用props的话肯能会比较复杂,这里我们就可以用到 provide 和 injec ...
- Android——谷歌官方下拉刷新控件SwipeRefreshLayout(转)
转自:http://blog.csdn.net/zouzhigang96/article/details/50476402 版权声明:本文为博主原创文章,未经博主允许不得转载. 前言: 如今谷歌推出了 ...
- Linux 操作系统介绍
应用软件——操作系统——硬件 操作系统的作用 是现代计算机系统中最基本和最重要的系统软件 是配置在计算机硬件上的第一层软件,是对硬件系统的首次扩展 主要作用是管理好硬件设备,并为用户和应用程序提供一个 ...
- 非关系型数据库MongoDB入门
本文分为以下四块简单介绍非关系型数据库MongoDB:1.MongoDB简介.2.MongoDB和关系数据库对比.3.MongoDB基本概念.4.mongo shell的使用以及对MongoDB的增删 ...
- leetcode-回溯②-难题
题10: 回溯:另:动态规划复杂度更低 class Solution: def isMatch(self, s: str, p: str) -> bool: def helper(s,p): i ...
- js关闭当前窗口的几种方法
第一种:不带任何提示关闭窗口的js代码 <a href="javascript:window.opener=null;window.open('','_self');window.cl ...
- Java——main()方法
3.1 main()方法 由于java虚拟机需要调用类的main()方法,所以该方法的访问权限必须是public,又因为java虚拟机在执行main()方法时不必创建对象,所以该方法必须是static ...
- psecurity配置
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...
- mongodb副本集的内部机制(借鉴lanceyan.com)
针对mongodb的内部机制提出以下几个引导性的问题: 副本集故障转移,主节点是如何选举的?能否手动干涉下架某一台主节点. 官方说副本集数量最好是奇数,为什么? mongodb副本集是如何同步的?如果 ...