题意

题目链接

分析

  • 将询问差分并不断加入颜色。

  • 每种颜色,一个位置 \(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. 魔法[差分+树状数组]的更多相关文章

  1. 差分+树状数组【p4868】Preprefix sum

    Description 前缀和(prefix sum)\(S_i=\sum_{k=1}^i a_i\). 前前缀和(preprefix sum) 则把\(S_i\)作为原序列再进行前缀和.记再次求得前 ...

  2. 差分+树状数组 线段树【P2357】 守墓人

    题目描述-->p2357 守墓人 敲了一遍线段树,水过. 树状数组分析 主要思路: 差分 简单介绍一下差分(详细概念太麻烦,看下面. 给定一个数组 7 8 6 5 1 8 18 20 35 // ...

  3. gym102220H 差分+树状数组(区间修改和输出)

    这题目很有意思,让我学会了树状数组的差分,更加深刻理解了树状数组 树状数组的差分写法 void add(int x,int k) { for (int i = x;i <= n;i += low ...

  4. 洛谷P3246 [HNOI2016]序列(离线 差分 树状数组)

    题意 题目链接 Sol 好像搞出了一个和题解不一样的做法(然而我考场上没写出来还是爆零0) 一个很显然的思路是考虑每个最小值的贡献. 预处理出每个数左边第一个比他小的数,右边第一个比他大的数. 那么\ ...

  5. ZZNU 2098 Drink coffee(差分+树状数组)

    题目链接:http://acm.hi-54.com/problem.php?pid=2098 2098 : Drink coffee 时间限制:1 Sec 内存限制:256 MiB 提交:32 答案正 ...

  6. BZOJ3881 Coci2015Divljak(AC自动机+树上差分+树状数组)

    建出AC自动机及其fail树,每次给新加入的串在AC自动机上经过的点染色,问题即转化为子树颜色数.显然可以用dfs序转成序列问题树状数组套权值线段树解决,显然过不掉.事实上直接树上差分,按dfs序排序 ...

  7. P5057 [CQOI2006]简单题 前缀异或差分/树状数组

    好思路,好思路... 思路:前缀异或差分 提交:1次 题解:区间修改,单点查询,树状数组,如思路$qwq$ #include<cstdio> #include<iostream> ...

  8. P3250 [HNOI2016] 网络 (树剖+堆/整体二分+树上差分+树状数组)

    解法1: 本题有插入路径和删除路径,在每个节点维护插入堆和删除堆,查询时两者top一样则一直弹出.如果每个节点维护的是经过他的路径,显然有些不好处理,正难则反,每个点维护不经过他的路径,那么x节点出了 ...

  9. luogu3250 网络 (整体二分+树上差分+树状数组)

    首先整体二分,问题变成是否存在经过一个点的满足条件的路径 那么我对于每个路径(a,b,lca),在树状数组的dfn[a]++,dfn[b]++,dfn[lca]--,dfn[fa[lca]--] 然后 ...

随机推荐

  1. centos安装pip3

    安装pip3 1:安装依赖 yum install openssl-devel -y yum install zlib-devel -y 2:安装setuptools wget --no-check- ...

  2. Mongodb集群——master/slave

    集群的配置 (本测试放于同一台机器进行配置,所以IP地址一样,如果是在不同的服务器上更换IP便可以)   1.目录结构       拷贝两份mongodb到/home/scotte.ye/mongo1 ...

  3. rsync 故障排查整理

    Rsync服务常见问题汇总 ================================================================== 1 客户端的错误现象:No route ...

  4. C++设计模式 ==> 策略模式与简单工厂模式结合

    简介 策略模式相较之于简单工厂模式适用于生产方法经常变化且方法较为繁多的情况,因为生产方法时常变化就会需要频繁修改工厂类,违背了开闭原则,这时就可以用策略选择类由客户端根据需求动态切换策略.且策略模式 ...

  5. mysql 5.7.16 忘记root 密码 如何修改root密码

    今天在电脑上安装  mysql5.7.16 (压缩包)时,在初始化data文件夹之后,没有记住密码,DOS框没有显示,没办法,为了学习一下怎么修改密码,在网上找了好多方法去解决,最终还是解决了,下面来 ...

  6. elasticsearch报错之 memory locking requested for elasticsearch process but memory is not locked

    安装elasticsearch报错如下: [2019-01-14T03:57:16,453][ERROR][o.e.b.Bootstrap ] [ip-172-31-30-62.ec2.interna ...

  7. T4学习- 3、创建运行时模板

    使用 Visual Studio 预处理过的文本模板,可以在运行时在应用程序中生成文本字符串. 执行应用程序的计算机不必具有 Visual Studio. 预处理过的模板有时称为"运行时文本 ...

  8. leetcode 486 预测赢家

    题目描述 给定一个表示分数的非负整数数组. 玩家1从数组任意一端拿取一个分数,随后玩家2继续从剩余数组任意一端拿取分数,然后玩家1拿,--.每次一个玩家只能拿取一个分数,分数被拿取之后不再可取.直到没 ...

  9. How to display values with in piechart using Jfreechart(values in sector )

    I am using Jfreechart to create pie charts. Values are displayed outside pie chart as labels. I want ...

  10. js面对对象编程(二):属性和闭包

    上篇博客中解说了一些js对象的基本概念和使用方法.这篇博客解说一下js属性方面的:公有属性.私有属性,特权方法. 假设学过java.公有属性.私有属性,特权方法(即能够訪问和设置私有属性的方法)一定非 ...