题意

题目链接

分析

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

  • 每种颜色,一个位置 \(p\) 都只会走到与之左右相邻的两个位置之一,分类讨论 \(\rm |A-B|\) 的符号。

  • 实现可以使用树状数组。

  • 总时间复杂度为 \(O(nlogn)\)。

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define go(u) for(int i=head[u],v=e[i].to;i;i=e[i].last,v=e[i].to)
  4. #define rep(i,a,b) for(int i=a;i<=b;++i)
  5. #define pb push_back
  6. typedef long long LL;
  7. inline int gi() {
  8. int x=0,f=1;
  9. char ch=getchar();
  10. while(!isdigit(ch)) {
  11. if(ch=='-') f=-1;
  12. ch=getchar();
  13. }
  14. while(isdigit(ch)) {
  15. x=(x<<3)+(x<<1)+ch-48;
  16. ch=getchar();
  17. }
  18. return x*f;
  19. }
  20. template<typename T>inline bool Max(T &a,T b) {
  21. return a<b?a=b,1:0;
  22. }
  23. template<typename T>inline bool Min(T &a,T b) {
  24. return b<a?a=b,1:0;
  25. }
  26. const int N=2e5 + 7;
  27. int n,Q;
  28. LL ans[N];
  29. struct querys{
  30. int id,p,c;
  31. querys(){}querys(int id,int p,int c):id(id),p(p),c(c){}
  32. };
  33. vector<int>G[N];
  34. vector<querys>q[N];
  35. struct BIT {
  36. LL t1[N],t2[N];
  37. int lowbit(int x) {
  38. return x&-x;
  39. }
  40. void m1(int x,int y){for(int i=x;i<=n;i+=lowbit(i)) t1[i]+=y;}
  41. void m2(int x,int y){for(int i=x;i<=n;i+=lowbit(i)) t2[i]+=y;}
  42. pair<LL,int> query(int x){
  43. LL r1=0;int r2=0;
  44. for(int i=x; i; i-=lowbit(i)) r1+=t1[i],r2+=t2[i];
  45. return make_pair(r1,r2);
  46. }
  47. void upd(int l,int r,int v) {
  48. if(l>r) return;
  49. m1(l,v),m1(r+1,-v);
  50. m2(l,1),m2(r+1,-1);
  51. }
  52. } A,B;
  53. int main(){
  54. n=gi(),Q=gi();
  55. rep(i,1,n) {
  56. int c=gi();
  57. G[c].pb(i);
  58. }
  59. rep(i,1,Q) {
  60. int p=gi(),l=gi(),r=gi();
  61. q[l-1].pb(querys(i,p,-1));
  62. q[r].pb(querys(i,p,1));
  63. }
  64. rep(i,1,n) {
  65. for(int j=0; j<G[i].size(); ++j) {
  66. if(!j)
  67. B.upd(1,G[i][j]-1,G[i][j]);
  68. if(j==(int)G[i].size()-1)
  69. A.upd(G[i][j],n,G[i][j]);
  70. else{
  71. int mid=(G[i][j]+G[i][j+1])/2;
  72. A.upd(G[i][j],mid,G[i][j]);
  73. B.upd(mid+1,G[i][j+1]-1,G[i][j+1]);
  74. }
  75. }
  76. for(auto v:q[i]) {
  77. pair<LL,int> ra=A.query(v.p),rb=B.query(v.p);
  78. ans[v.id]+=v.c*(1ll*ra.second*v.p-ra.first);
  79. ans[v.id]+=v.c*(rb.first-1ll*rb.second*v.p);
  80. }
  81. }
  82. rep(i,1,Q) printf("%lld\n",ans[i]);
  83. return 0;
  84. }

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. HTTP host头

    前几天,将一个host误配置为https,导致对方服务解析异常,排查半天,才发现是host导致,故整理一下HTTP host作用. Host:指定请求服务器的域名/IP地址和端口号. 作用:同一台机器 ...

  2. aix rootvg镜像

    就一般生产系统而已,操作系统层面都要进行备份,而最常见的操作系统备份方式之一就是做镜像(mirror),而实践过程中,往往是把rootvg这个卷组做镜像操作.查看rootvg是否已经进行镜像方法: 1 ...

  3. 【转】Java学习---算法那些事

    [更多参考] LeetCode算法 每日一题 1: Two Sum ----> 更多参考[今日头条--松鼠游学] 史上最全的五大算法总结 Java学习---7大经典的排序算法总结实现 程序员都应 ...

  4. sql注入--基础

    什么是sql注入: 利用SQL语句 在外部 对数据库进行 查询,更新等 动作 sql注入的原理: 输入值可控且带入数据库执行(前提) 接受的变量传值未进行过滤(实质) sql注入的目的: 获取数据(网 ...

  5. Google常用脚本

    1.Tampermonkey 可下载常用脚本:https://greasyfork.org/zh-CN 2.常用FQSetupVPN 3.百度药丸屏蔽广告 4.百度文档可粘贴,下载 5.VIP视频可看

  6. 028、HTML 标签3表单标签插入组件

    内容:表单标签插入组件(经常使用)############################################################## form表单标签和input组件 < ...

  7. 9.算法之顺序、二分、hash查找

    一.查找/搜索 - 我们现在把注意力转向计算中经常出现的一些问题,即搜索或查找的问题.搜索是在元素集合中查找特定元素的算法过程.搜索通常对于元素是否存在返回 True 或 False.有时它可能返回元 ...

  8. P3324 [SDOI2015]星际战争

    传送门:https://www.luogu.org/problemnew/show/P3324 首先瞅一眼数据范围,发现m, n都很小,所以就可以初步断定这是一道网络流的题. 因为题中说每一个武器只能 ...

  9. Kafka学习之路 (二)Kafka的架构

    一.Kafka的架构 如上图所示,一个典型的Kafka集群中包含若干Producer(可以是web前端产生的Page View,或者是服务器日志,系统CPU.Memory等),若干broker(Kaf ...

  10. 2.2.3 TableLayout(表格布局)

    3.如何确定行数与列数 ①如果我们直接往TableLayout中添加组件的话,那么这个组件将占满一行!!! ②如果我们想一行上有多个组件的话,就要添加一个TableRow的容器,把组件都丢到里面! ③ ...