LOJ.#6468. 魔法[差分+树状数组]
题意
分析
将询问差分并不断加入颜色。
每种颜色,一个位置 \(p\) 都只会走到与之左右相邻的两个位置之一,分类讨论 \(\rm |A-B|\) 的符号。
实现可以使用树状数组。
总时间复杂度为 \(O(nlogn)\)。
代码
#include<bits/stdc++.h>
using namespace std;
#define go(u) for(int i=head[u],v=e[i].to;i;i=e[i].last,v=e[i].to)
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define pb push_back
typedef long long LL;
inline int gi() {
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch)) {
if(ch=='-') f=-1;
ch=getchar();
}
while(isdigit(ch)) {
x=(x<<3)+(x<<1)+ch-48;
ch=getchar();
}
return x*f;
}
template<typename T>inline bool Max(T &a,T b) {
return a<b?a=b,1:0;
}
template<typename T>inline bool Min(T &a,T b) {
return b<a?a=b,1:0;
}
const int N=2e5 + 7;
int n,Q;
LL ans[N];
struct querys{
int id,p,c;
querys(){}querys(int id,int p,int c):id(id),p(p),c(c){}
};
vector<int>G[N];
vector<querys>q[N];
struct BIT {
LL t1[N],t2[N];
int lowbit(int x) {
return x&-x;
}
void m1(int x,int y){for(int i=x;i<=n;i+=lowbit(i)) t1[i]+=y;}
void m2(int x,int y){for(int i=x;i<=n;i+=lowbit(i)) t2[i]+=y;}
pair<LL,int> query(int x){
LL r1=0;int r2=0;
for(int i=x; i; i-=lowbit(i)) r1+=t1[i],r2+=t2[i];
return make_pair(r1,r2);
}
void upd(int l,int r,int v) {
if(l>r) return;
m1(l,v),m1(r+1,-v);
m2(l,1),m2(r+1,-1);
}
} A,B;
int main(){
n=gi(),Q=gi();
rep(i,1,n) {
int c=gi();
G[c].pb(i);
}
rep(i,1,Q) {
int p=gi(),l=gi(),r=gi();
q[l-1].pb(querys(i,p,-1));
q[r].pb(querys(i,p,1));
}
rep(i,1,n) {
for(int j=0; j<G[i].size(); ++j) {
if(!j)
B.upd(1,G[i][j]-1,G[i][j]);
if(j==(int)G[i].size()-1)
A.upd(G[i][j],n,G[i][j]);
else{
int mid=(G[i][j]+G[i][j+1])/2;
A.upd(G[i][j],mid,G[i][j]);
B.upd(mid+1,G[i][j+1]-1,G[i][j+1]);
}
}
for(auto v:q[i]) {
pair<LL,int> ra=A.query(v.p),rb=B.query(v.p);
ans[v.id]+=v.c*(1ll*ra.second*v.p-ra.first);
ans[v.id]+=v.c*(rb.first-1ll*rb.second*v.p);
}
}
rep(i,1,Q) printf("%lld\n",ans[i]);
return 0;
}
LOJ.#6468. 魔法[差分+树状数组]的更多相关文章
- 差分+树状数组【p4868】Preprefix sum
Description 前缀和(prefix sum)\(S_i=\sum_{k=1}^i a_i\). 前前缀和(preprefix sum) 则把\(S_i\)作为原序列再进行前缀和.记再次求得前 ...
- 差分+树状数组 线段树【P2357】 守墓人
题目描述-->p2357 守墓人 敲了一遍线段树,水过. 树状数组分析 主要思路: 差分 简单介绍一下差分(详细概念太麻烦,看下面. 给定一个数组 7 8 6 5 1 8 18 20 35 // ...
- gym102220H 差分+树状数组(区间修改和输出)
这题目很有意思,让我学会了树状数组的差分,更加深刻理解了树状数组 树状数组的差分写法 void add(int x,int k) { for (int i = x;i <= n;i += low ...
- 洛谷P3246 [HNOI2016]序列(离线 差分 树状数组)
题意 题目链接 Sol 好像搞出了一个和题解不一样的做法(然而我考场上没写出来还是爆零0) 一个很显然的思路是考虑每个最小值的贡献. 预处理出每个数左边第一个比他小的数,右边第一个比他大的数. 那么\ ...
- ZZNU 2098 Drink coffee(差分+树状数组)
题目链接:http://acm.hi-54.com/problem.php?pid=2098 2098 : Drink coffee 时间限制:1 Sec 内存限制:256 MiB 提交:32 答案正 ...
- BZOJ3881 Coci2015Divljak(AC自动机+树上差分+树状数组)
建出AC自动机及其fail树,每次给新加入的串在AC自动机上经过的点染色,问题即转化为子树颜色数.显然可以用dfs序转成序列问题树状数组套权值线段树解决,显然过不掉.事实上直接树上差分,按dfs序排序 ...
- P5057 [CQOI2006]简单题 前缀异或差分/树状数组
好思路,好思路... 思路:前缀异或差分 提交:1次 题解:区间修改,单点查询,树状数组,如思路$qwq$ #include<cstdio> #include<iostream> ...
- P3250 [HNOI2016] 网络 (树剖+堆/整体二分+树上差分+树状数组)
解法1: 本题有插入路径和删除路径,在每个节点维护插入堆和删除堆,查询时两者top一样则一直弹出.如果每个节点维护的是经过他的路径,显然有些不好处理,正难则反,每个点维护不经过他的路径,那么x节点出了 ...
- luogu3250 网络 (整体二分+树上差分+树状数组)
首先整体二分,问题变成是否存在经过一个点的满足条件的路径 那么我对于每个路径(a,b,lca),在树状数组的dfn[a]++,dfn[b]++,dfn[lca]--,dfn[fa[lca]--] 然后 ...
随机推荐
- synchronized的四种用法
一 修饰方法 Synchronized修饰一个方法很简单,就是在方法的前面加synchronized,synchronized修饰方法和修饰一个代码块类似,只是作用范围不一样,修饰代码块是大括号括起 ...
- Windows 下的文件被占用问题解决
windows下,经常容易出现文件被其他程序占用的现象,令人十分头疼.更头疼的是,还看不到被谁占用. 实际上是有办法看到占用的进程的. 话不多说,以Win10为例: 1.打开资源监视器 a.直接程序栏 ...
- jQuery插件实例七:一棵Tree的生成史
在需要表示级联.层级的关系中,Tree作为最直观的表达方式常出现在组织架构.权限选择等层级关系中.典型的表现形试类似于: 一颗树的生成常常包括三个部分:1)数据库设计:2)后台程序:3)前端代码.那么 ...
- JDK5的新特性之 增强for
package cn.itcast.day19.foreach; import java.util.ArrayList; import java.util.Collection; import j ...
- October 20th 2017 Week 42nd Friday
My life is in these books. Read these and know my heart. 我的人生就在这些书中,读完他们就能读懂我的心. Some people say tha ...
- 张高兴的 .NET Core IoT 入门指南:(二)GPIO 的使用
什么是 GPIO GPIO 是 General Purpose Input Output 的缩写,即"通用输入输出". Raspberry Pi 有两行 GPIO 引脚, Rasp ...
- PyQt5--QSlide
# -*- coding:utf-8 -*- ''' Created on Sep 20, 2018 @author: SaShuangYiBing Comment: ''' import sys f ...
- ubuntu 视频播放问题
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/chang_xing/article/details/30976659 ...
- 【高德地图API】从零開始学高德JS API(四)搜索服务——POI搜索|自己主动完毕|输入提示|行政区域|交叉路口|自有数据检索
地图服务.大家能想到哪些?POI搜素,输入提示,地址解析,公交导航,驾车导航,步行导航,道路查询(交叉口),行政区划等等.假设说覆盖物Marker是地图的骨骼,那么服务,就是地图的气血. 有个各种各样 ...
- Kafka--基础知识