[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为关 ...
随机推荐
- Lock中使用Condition实现等待通知
Condition类有很好的灵活性,可以实现多路通知功能,一个Lock对象中可以创建多个Condition对象实例,线程对象可以注册在指定的Condition中,进而有选择的进行线程通知,在调度线程上 ...
- bat批处理----set
转载自 https://www.cnblogs.com/Braveliu/p/5081084.html [1]set命令简介 set,设置. [2]set命令使用 1. 打印系统环境变量.set ...
- 【外】001-python3之zip函数
zip函数语法格式zip(可迭代对象1, 可迭代对象2, ... ,可迭代对象n) 函数接收任意个可迭代对象作为参数, 将所有对象中对应位置上的元素分别打包在一起组成一个tuple, 并将所有的tup ...
- rest framework的框架实现之 (版本,解析器,序列化,分页)
一版本 版本实现根据访问的的方式有以下几种 a : https://127.0.0.1:8000/users?version=v1 ---->基于url的get方式 #settings.pyR ...
- 【算法】BitMap
转自:https://www.seoxiehui.cn/article-45186-1.html 需求: 为满足用户标签的统计需求,小灰利用Mysql设计了如下的表结构,每一个维度的标签都对应着Mys ...
- 高级运维(六):源码安装Redis缓存服务、常用Redis数据库操作指令、配置Redis主从服务器
一.源码安装Redis缓存服务 目标: 本案例要求先快速搭建好一台Redis服务器,并测试该缓存服务器: 1> 设置变量test,值为123 2> 查看变量test的值 3> 设置计 ...
- springboot设置静态资源缓存一年
由于本人所在项目组,所用的项目是前后端分离的,前端是React 的SPA,每次打包都会新版本的静态文件. 然而,在有些时候,这些静态资源是不变的,故可以将资源缓存至用户本地,提升性能. 写法如下,需要 ...
- Codeforces Round #568 (Div. 2) G1. Playlist for Polycarp (easy version) (状压dp)
题目:http://codeforces.com/contest/1185/problem/G1 题意:给你n给选项,每个选项有个类型和价值,让你选择一个序列,价值和为m,要求连续的不能有两个相同的类 ...
- NX二次开发-Block UI C++界面Face Collector(面收集器)控件的获取(持续补充 )
Face Collector(面收集器)控件的获取 NX9+VS2012 #include <uf.h> #include <uf_obj.h> UF_initialize() ...
- Ext 面板(Panel)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...