题目链接

根据题意,d是两个点的最短距离,分析知,假设\(x_i\)<\(x_j\), 若\(v_i\)>\(v_j\),那么d(i,j)一定为0,因为i一定能追上j,否则,d(i,j)就为其初始距离

那我们就转化问题为一个二维偏序问题,求\(x_i\)<\(x_j\)且\(v_i\)<\(v_j\),满足这个条件的每个点对之间的距离

很容易想到定一序,另一序用树状数组维护的统计法,假设现在是\(x_i\),满足上述条件有k个,那么,对\(x_i\)的统计答案为:\(\sum_{j=i-k}^{i-1}(x_i-x_j)\),拆开,就是\(k*x_i-\sum_{j=i-k}^{i-1}x_j\)

那我们可以维护2个树状数组,分别维护上述的2个数,满足条件的个数与满足条件的这些数的x的和即可

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define lowbit(x) ((x)&(-x))
  4. typedef long long LL;
  5. typedef pair<int,int> pii;
  6. const int maxn = 2e5+5;
  7. struct Node {
  8. int x, v;
  9. } Nodes[maxn];
  10. int all_x[maxn];
  11. LL C1[maxn], C2[maxn];
  12. void add(LL val, int pos, int n) {
  13. for(; pos <= n; pos += lowbit(pos))
  14. C1[pos] += val, C2[pos]++;
  15. }
  16. pair<LL,LL> getsum(int pos) {
  17. LL ret1 = 0, ret2 = 0;
  18. for(;pos;pos-=lowbit(pos))
  19. ret1 += C1[pos], ret2 += C2[pos];
  20. return make_pair(ret1,ret2);
  21. }
  22. void run_case() {
  23. int n;
  24. cin >> n;
  25. for(int i = 1; i <= n; ++i) {
  26. cin >> Nodes[i].x;
  27. all_x[i] = Nodes[i].x;
  28. }
  29. for(int i = 1; i <= n; ++i) {
  30. cin >> Nodes[i].v;
  31. }
  32. sort(all_x+1, all_x+1+n);
  33. int len = unique(all_x+1, all_x+1+n) - all_x - 1;
  34. for(int i = 1; i <= n; ++i) {
  35. Nodes[i].x = lower_bound(all_x+1, all_x+1+len, Nodes[i].x) - all_x;
  36. }
  37. sort(Nodes+1, Nodes+1+n, [&](Node &a, Node&b) {
  38. return a.v < b.v || (a.v == b.v && a.x < b.x);
  39. });
  40. LL ans = 0;
  41. for(int i = 1; i <= n; ++i) {
  42. add(all_x[Nodes[i].x], Nodes[i].x, n);
  43. auto now = getsum(Nodes[i].x-1);
  44. ans += 1LL*now.second*all_x[Nodes[i].x] - now.first;
  45. }
  46. cout << ans;
  47. }
  48. int main() {
  49. ios::sync_with_stdio(false), cin.tie(0);
  50. cout.flags(ios::fixed);cout.precision(10);
  51. //int t; cin >> t;
  52. //while(t--)
  53. run_case();
  54. cout.flush();
  55. return 0;
  56. }

Codeforces 1311F Moving Points的更多相关文章

  1. HDOJ 4717 The Moving Points

    The Moving Points Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  2. HDU 4717The Moving Points warmup2 1002题(三分)

    The Moving Points Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  3. The Moving Points hdu4717

    The Moving Points Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  4. HDU 4717 The Moving Points (三分)

    The Moving Points Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  5. HDUOJ---The Moving Points

    The Moving Points Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  6. HDU-4717 The Moving Points(凸函数求极值)

    The Moving Points Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  7. F. Moving Points 解析(思維、離散化、BIT、前綴和)

    Codeforce 1311 F. Moving Points 解析(思維.離散化.BIT.前綴和) 今天我們來看看CF1311F 題目連結 題目 略,請直接看原題. 前言 最近寫1900的題目更容易 ...

  8. Codeforces Round #624 (Div. 3) F. Moving Points 题解

    第一次写博客 ,请多指教! 翻了翻前面的题解发现都是用树状数组来做,这里更新一个 线段树+离散化的做法: 其实这道题是没有必要用线段树的,树状数组就能够解决.但是个人感觉把线段树用熟了会比树状数组更有 ...

  9. 详细讲解Codeforces Round #624 (Div. 3) F. Moving Points

    题意:给定n个点的初始坐标x和速度v(保证n个点的初始坐标互不相同), d(i,j)是第i个和第j个点之间任意某个时刻的最小距离,求出n个点中任意一对点的d(i,j)的总和. 题解:可以理解,两个点中 ...

随机推荐

  1. Leetcode找三个数字的和满足xx条件的题目总结15➕16➕259

    双指针最基础的题目是一个区间里找两个数字的和等于Target.首先将区间从小到大排序.接下来只要一个le指针,一个ri指针,分别从区间左右边界往中间推进即可.复杂度是排序的nlogn. 下面几道题都是 ...

  2. leetcode 198 House Robber I

    function rob(nums) { if(!nums || nums.length === 0) { return 0; } else if(nums.length < 2){ retur ...

  3. VIM键盘映射 (Map)

    http://www.pythonclub.org/linux/vim/map VIM键盘映射 (Map) 设置键盘映射 使用:map命令,可以将键盘上的某个按键与Vim的命令绑定起来.例如使用以下命 ...

  4. 题解【洛谷P1407】 [国家集训队]稳定婚姻

    题面 题解 很好的\(Tarjan\)练习题. 主要讲一下如何建图. 先用\(STL \ map\)把每个人的名字映射成数字. 输入第\(i\)对夫妻时把女性映射成\(i\),把男性映射成\(i+n\ ...

  5. Codeforces Round #620 (Div. 2)D(LIS,构造)

    #define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using namespace std; ]; ]; int main(){ io ...

  6. centos7 sshpass 用法详解

    可以参考文章:https://www.cnblogs.com/kaishirenshi/p/7921308.html 安装方式直接通过yum 安装 yum -y install sshpass 常用的 ...

  7. VS调试工具

    F5--启动运行,跳到下一个断点 F10--逐步调试 F11--逐句调试 F10和F11的区别: method(); int a = 1; 当程序运行到如上面的method方法时,按F10会直接跳到下 ...

  8. leetcode 72.编辑距离(dp)

    链接:https://leetcode-cn.com/problems/edit-distance/submissions/ 设dp[i][j]表示串s1前i个字符变换成串s2前j个字符所需要的最小操 ...

  9. ThinkPhp5 中Volist标签的用法

    Volist标签一般是和内置方法assign()搭配使用,将值从后台传到前台,是当下比较流行的一种传值方法 本文实例讲述了ThinkPHP模板循环输出Volist标签用法.分享给大家供大家参考,具体如 ...

  10. javascript当中局部变量和全局变量

    2)局部变量和全局变量 马克-to-win:浏览器里面 window 就是 global,通常可以省.nodejs 里没有 window,但是有个叫 global 的.例 3.2.1<html& ...