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]--] 然后 ...
随机推荐
- Python之聚类(KMeans,KMeans++)
# -*- coding: utf-8 -*- """ Created on Mon Sep 17 16:41:46 2018 @author: zhen "& ...
- 无法获取链接服务器 "XXX" 的 OLE DB 访问接口 "SQLNCLI10" 的架构行集 "DBSCHEMA_TABLES_INFO"。该访问接口支持该接口,但使用该接口时返回了失败代码。
1. SQL 2000 下载补丁 SQL2KSP4 ,进行安装 2.找到SQL2KSP4\install\instcat.sql 并在sql2000 中打开查询分析器中执行
- CSS| 解决子级用css float浮动 而父级div没高度不能自适应高度
解决子级用css float浮动 而父级div没高度不能自适应高度 解决子级对象使用css float浮动 而父级div不能自适应高度,不能被父级内容撑开解决方法,父级div没有高度解决方法. 最外层 ...
- [Spark Core] Spark Shell 实现 Word Count
0. 说明 在 Spark Shell 实现 Word Count RDD (Resilient Distributed dataset), 弹性分布式数据集. 示意图 1. 实现 1.1 分步实现 ...
- Java AWT
AWT是抽象窗口工具包,是API为Java 程序提供的建立图形用户界面GUI (Graphics User Interface)工具集,AWT可用于Java的applet和applications中. ...
- U-Mail:如何实现EDM的个性化和定制化?
设想一下,一个上班族一天要接到多少垃圾邮件?据媒体报道,目前来往的邮件中,高达95%以上的是垃圾邮件,而且有些垃圾邮件还会故意占据着邮箱的最前列.同时,随着人们接受资讯越来越快捷便利,渠道越来越多,也 ...
- 028、HTML 标签1列表、图片、表格
内容简单看一下理解就行了. HTML 是用来描述网页的一种语言.就是用来编写网页的语言 内容:换行.分割,标签属性,编码方式设置,字体标签,特殊符号,列表.图片.表格标签############### ...
- selenium3 浏览器驱动下载及验证
下载浏览器驱动 当selenium升级到3.0之后,对不同的浏览器驱动进行了规范.如果想使用selenium驱动不同的浏览器,必须单独下载并设置不同的浏览器驱动. 各浏览器下载地址: Firefox浏 ...
- Swift Package Manager(一)初探
一句话:Swift Package Manager(swift包管理器,简称:SPM)就是在swift开发中用来替代CocoaPod的:在swift开发中,SPM完全可以替代CocoaPod的功能,并 ...
- 把php session 会话保存到redis
php的session会话默认时以文件形式保存在php.ini配置文件设置的会话缓存目录,文件保存会话的效率很低,每当每个用户登录一次就会在服务器上生成一个唯一的session_id文件,当用户登录量 ...