loj #6468. 魔法

题目大意还是比较清楚的吧
先考虑l=1,r=nl = 1, r = nl=1,r=n怎么做
可以考虑每个魔法球对每个位置的贡献
假设当前位置为aaa,下一个和它种类相同的魔法球位置为bbb
设mid=a+b2mid = \frac{a+b}{2}mid=2a+b​
那么对于[a,mid][a,mid][a,mid]这个区间都用aaa来贡献(选a), [mid+1,b][mid + 1, b][mid+1,b]用bbb来贡献

因为求的是 ∣p−pos∣|p - pos|∣p−pos∣
就分两种情况,p > pos 和 p <= pos
然后可以用几个树状数组维护一下

考虑100分怎么做
先把对于颜色[l,r][l,r][l,r]可以拆分成[1,r]−[1,l−1][1, r] - [1, l - 1][1,r]−[1,l−1],然后把每个询问拆分成两个前缀和,再按照颜色从小到大排序
然后每次就把一种颜色插入序列中,再算对每个询问的贡献就好了
具体看代码吧
code:

#include<bits/stdc++.h>
#define int long long
#define N 2000005
#define lowbit(x) (x & -x)
using namespace std;
struct BIT{int tree[N];void update(int x, int y){for(;x < N; x += lowbit(x)) tree[x] += y;}int query(int x){int ret = 0;for(; x; x -= lowbit(x)) ret += tree[x];return ret;}void add(int l, int r, int x){if(l > r) return;update(l, x), update(r + 1,  - x);}
}L, R, Ls, Rs;//L 表示贡献点在当前点的左边, Ls 表示有几个贡献点  R,Rs同理
struct A{int pos, col, id, o;
}q[N];
int cmp(A x, A y){return x.col < y.col;
}
int n, Q, m, ANS[N];
vector<int> a[N];
signed main(){scanf("%lld%lld", &n, &Q);for(int i = 1; i <= n; i ++){int x;scanf("%lld", &x);a[x].push_back(i);//把每个颜色出现的位置记录下来,方便插入颜色}for(int i = 1; i <= Q; i ++){int p, l, r;scanf("%lld%lld%lld", &p, &l, &r);q[++ m].pos = p, q[m].col = l - 1, q[m].id = i, q[m].o = - 1;q[++ m].pos = p, q[m].col = r, q[m].id = i, q[m].o = 1;//拆分成前缀和的形式}sort(q + 1, q + 1 + m, cmp);int pos = 0;for(int col = 1; col <= n; col ++){int mm = a[col].size();if(mm){//如果有颜色就插入R.add(1, a[col][0], a[col][0]), Rs.add(1, a[col][0], 1);//考虑第一个以前的for(int j = 0; j < mm - 1; j ++){//中间的int mid = (a[col][j] + a[col][j + 1]) / 2;L.add(a[col][j] + 1, mid, a[col][j]), Ls.add(a[col][j] + 1, mid, 1);R.add(mid + 1, a[col][j + 1], a[col][j + 1]), Rs.add(mid + 1, a[col][j + 1], 1);}L.add(a[col][mm - 1] + 1, n, a[col][mm - 1]), Ls.add(a[col][mm - 1] + 1, n, 1);//最后一个往后的}while(pos + 1 <= m && q[pos + 1].col <= col){pos ++;int p = q[pos].pos;if(q[pos].col == col) ANS[q[pos].id] += q[pos].o * (R.query(p) - Rs.query(p) * p), ANS[q[pos].id] += q[pos].o * (Ls.query(p) * p - L.query(p));//计算贡献}}for(int i = 1; i <= Q; i ++) printf("%lld\n", ANS[i]);return 0;
}

离线大法吼哇

loj #6468. 魔法相关推荐

  1. loj2245 [NOI2014]魔法森林 LCT

    [NOI2014]魔法森林 链接 loj 思路 a排序,b做动态最小生成树. 把边拆成点就可以了. uoj98.也许lct复杂度写假了..越卡常,越慢 代码 #include <bits/std ...

  2. Loj#6223 Luogu P4009 汽车加油行驶 分层图最短路

    这是本蒟蒻博客的第一篇文章,不规范之处敬请各位大佬指正和谅解orz Loj#6223+Luogu P4009 文章目录 前言 一.建模 二.代码实现 1.节点在图中的编号(分层图的存储) 2.建边 对 ...

  3. Loj #3089. 「BJOI2019」奥术神杖

    Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...

  4. Loj #6503. 「雅礼集训 2018 Day4」Magic

    Loj #6503. 「雅礼集训 2018 Day4」Magic 题目描述 前进!前进!不择手段地前进!--托马斯 · 维德 魔法纪元元年. 1453 年 5 月 3 日 16 时,高维碎片接触地球. ...

  5. python常用魔法函数

    1.__init__(): 所有类的超类object,有一个默认包含pass的__init__()实现,这个函数会在对象初始化的时候调用,我们可以选择实现,也可以选择不实现,一般建议是实现的,不实现对 ...

  6. [JS]题解 | #魔法数字#

    题解 | #魔法数字# 题目链接 魔法数字 题目描述 牛妹给牛牛写了一个数字n,然后又给自己写了一个数字m,她希望牛牛能执行最少的操作将他的数字转化成自己的. 操作共有三种,如下: 在当前数字的基础上 ...

  7. 喵哈哈村的魔法考试 Round #1 (Div.2) 题解源码(A.水+暴力,B.dp+栈)

    A.喵哈哈村的魔法石 发布时间: 2017年2月21日 20:05   最后更新: 2017年2月21日 20:06   时间限制: 1000ms   内存限制: 128M 描述 传说喵哈哈村有三种神 ...

  8. Houdini魔法特效制作学习教程

    大小解压后:12.1G 1920X1080 mp4 语言:英语+中英文字幕 Houdini已经成为特效行业的热门工具. 谁运用它的力量,谁就势不可挡. 魔法咒语.科幻盾牌和电磁脉冲冲击波.掌握特效的艺 ...

  9. 魔法引用函数magic_quotes_gpc和magic_quotes_runtime的区别和用法

    PHP提供两个方便我们引用数据的魔法引用函数magic_quotes_gpc和magic_quotes_runtime, 这两个函数如果在php.ini设置为ON的时候,就会为我们引用的数据碰到单引号 ...

最新文章

  1. python:多线程
  2. python strip() 函数探究
  3. viewer.js实现预览效果
  4. 高途发布2020年经德勤审计年报 CFO:16次做空已成谣言
  5. c++调用子进程捕获输出(windows,linux)
  6. 【Vue】v-if与v-show的区别
  7. 正点原子以太网转串口模块 调试和使用方法(实战详解)
  8. 气球java游戏_团队游戏 气球
  9. deb ipa pxl
  10. Supplier和Vendor的区别
  11. rtb中的win_广告:RTB
  12. Dwz点击左侧菜单动态添加Tab标签图标
  13. 微信公众号开发(四)——点击菜单回复图片和语音
  14. 基于html家具装饰网站设计毕业设计.rar(含论文毕设+项目源码+答辩设计+成绩评分表+评定表)
  15. 微信 拒绝共享位置服务器,微信共享位置结束不了怎么办?如何解决问题?
  16. 84岁老爷爷技术博客
  17. threejs-绘制剖切面
  18. 芯片无忧 V1.5(ChipEasy)U盘固态硬盘检测工具 量产必备
  19. c++的几个刷题网站(不只有c++)
  20. python 文件批量复制,批量改名

热门文章

  1. nginx的配置文件中的server里面localhost后面的~什么意思
  2. 上富股份闯关IPO,募资6亿元背后的智能汽车产业逻辑
  3. 最小二乘法曲线拟合程序matlab,最小二乘法曲线拟合(代码环境:matlab)
  4. 自定义PopupWindow全解
  5. SOME/IP与SOME/IP SD规范介绍
  6. 使用定义判断函数的奇偶性
  7. Azure Kinect DK的一些驱动问题
  8. leaf 源码分析01 segment
  9. 原来这就是Java中的异常(abnormal),小白看完也懂了,学习总结①
  10. Adobe Photoshop CC for Mac 2019 中文免费版软件在线安装教程