题目链接:https://www.luogu.org/problemnew/show/P3608

乍一看很容易想到O(N^2)的暴力。

对于每个H[i]从ii-1找L[i]再从i+1n找R[i],然后比较。

60分(数据够水)

但是这个思路就是很直白的模拟,让人不容易想到如何去优化。

然后我们换一个也是差不多O(N^2)的思路:

我们设法把H[i]所对应的第k大的k求出来。

for example:

H 34 6 23 0 5 99 2

Kth 2 4 3 7 5 1 6

那么我们就能发现,对于第一个思路从ii-1找一遍再从i+1n找一遍这样两遍的遍历可以变成:

从1~i遍历,计数比当前Kth[i]小的作为L[i],那么R[i] = Kth[i] - L[i] - 1.

这个思路是有优化空间的。

到目前为止,我们需要的是快速的求出L[i]。

设想我们有一个初始全为0的长度为n的序列,从Kthx开始每次在这个序列的第Kth[x]的位置上加1,这样维护到当前第i个Kth时,前i-1Kth是维护过的,如果有比当前第Kth[i]小的就一定会提前处理过(在序列位置上加1)。

于是我们保证了答案的顺序不会出现问题。

就可以采用树状数组维护:

变成一个单点修改,查询0~i的和的问题。

code:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. using namespace std;
  6. const int maxn = 1e5 + 10;
  7. struct cow{
  8. int val, pos;
  9. }a[maxn];
  10. bool cmp(cow a, cow b)
  11. {
  12. return a.val > b.val;
  13. }
  14. int n, answer, b[maxn];
  15. class BIT{
  16. public:
  17. int tree[maxn<<2];
  18. void update(int pos, int val)
  19. {
  20. while(pos <= n)
  21. {
  22. tree[pos] += val;
  23. pos += lowbit(pos);
  24. }
  25. }
  26. int query(int pos)
  27. {
  28. int res = 0;
  29. while(pos)
  30. {
  31. res += tree[pos];
  32. pos -= lowbit(pos);
  33. }
  34. return res;
  35. }
  36. private:
  37. int lowbit(int x)
  38. {
  39. return x & -x;
  40. }
  41. }T;
  42. int main()
  43. {
  44. scanf("%d",&n);
  45. for(int i = 1; i <= n; i++)
  46. {
  47. scanf("%d",&a[i].val);
  48. a[i].pos = i;
  49. }
  50. sort(a + 1, a + 1 + n, cmp);
  51. for(int i = 1; i <= n; i++) b[a[i].pos] = i;
  52. for(int i = 1; i <= n; i++)
  53. {
  54. int L = T.query(b[i]);
  55. int R = b[i] - L - 1;
  56. if(L < R) swap(L, R);
  57. if(L > R + R) answer++;
  58. T.update(b[i], 1);
  59. }
  60. printf("%d",answer);
  61. }

后记:

小trick:

求一个数列的Kth方法。

【luogu P3608 [USACO17JAN]Balanced Photo平衡的照片】 题解的更多相关文章

  1. 洛谷P3608 [USACO17JAN]Balanced Photo平衡的照片

    P3608 [USACO17JAN]Balanced Photo平衡的照片 题目描述 Farmer John is arranging his NN cows in a line to take a ...

  2. [luoguP3608] [USACO17JAN]Balanced Photo平衡的照片(树状数组 + 离散化)

    传送门 树状数组裸题 #include <cstdio> #include <cstring> #include <iostream> #include <a ...

  3. [USACO17JAN]Balanced Photo平衡的照片 (树状数组)

    题目链接 Solution 先离散化,然后开一个大小为 \(100000\) 的树状数组记录前面出现过的数. 然后查询 \((h[i],n]\) 即可. 还要前后各做一遍. Code #include ...

  4. 【题解】[USACO17JAN]Balanced Photo G

    题目链接:https://www.luogu.com.cn/problem/P3608 方法一 用树状数组求逆序对先后扫两遍,一次从前往后,一次从后往前,算出每头奶牛左右两边比她高的数量. 最后统计一 ...

  5. 1702: [Usaco2007 Mar]Gold Balanced Lineup 平衡的队列

    1702: [Usaco2007 Mar]Gold Balanced Lineup 平衡的队列 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 510  S ...

  6. 线段树合并 || 树状数组 || 离散化 || BZOJ 4756: [Usaco2017 Jan]Promotion Counting || Luogu P3605 [USACO17JAN]Promotion Counting晋升者计数

    题面:P3605 [USACO17JAN]Promotion Counting晋升者计数 题解:这是一道万能题,树状数组 || 主席树 || 线段树合并 || 莫队套分块 || 线段树 都可以写..记 ...

  7. 【树状数组】【P3608】平衡的照片

    传送门 Description FJ正在安排他的N头奶牛站成一排来拍照.(1<=N<=100,000)序列中的第i头奶牛的高度是h[i],且序列中所有的奶牛的身高都不同. 就像他的所有牛的 ...

  8. hdu 3709 Balanced Number(平衡数)--数位dp

    Balanced Number Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) ...

  9. luogu P3605 [USACO17JAN]Promotion Counting晋升者计数

    题目链接 luogu 思路 可以说是线段树合并的练手题目吧 也没啥说的,就是dfs,然后合并... 看代码吧 错误 和写主席树错的差不多 都是变量写错.... 代码 #include <bits ...

随机推荐

  1. 我的省选 Day -9

    Day -9 不知不觉,日子已经变成一位数了,已经到了最后关头了. 早上班主任在上数学课时告诉我们,高校自招的降分政策已经没有以前那么优惠了(这我知道啊) 于是老师间接的暗示了奥赛如果没拿到省一就没什 ...

  2. ubuntu命令错误集

    1.在ubuntu命令行使用rz从windows传输文件时出现乱码 解决方法:使用 rz -e    选项进行传输,一般小文件传输不用加 -e 选项,大文件传输需要.

  3. AT2402 Dam

    传送门 考虑到一个很显然的事实:水是逃不掉的,一定要接的 所以我们就可以得到一个结论:如果当前的水温比上次低,就混合起来(因为水是逃不掉的),如果高就保留(因为我可以将前面的全部抛弃,只取这个高的) ...

  4. Linux服务之 Nginx安装

    安装包下载: 链接:https://pan.baidu.com/s/1yna9nvT_9iYw4_0uVQRgFw 提取码:nurm yum -y install gcc automake autoc ...

  5. Shape Number (最小表示法)

    题目链接 一个字符串,这个字符串的首尾是连在一起的,要求寻找一个位置,以该位置为起点的字符串的字典序在所有的字符串中中最小. #include <bits/stdc++.h> using ...

  6. Problem D. Dwarf Tower spfa

    http://codeforces.com/gym/100269/attachments 首先建图,然后图中每条边的权值是会变化的,是由dis[x] + dis[y]  --->   dis[m ...

  7. (转)Linux 文件和目录的属性

    linux 文件属性与权限 原文:https://www.cnblogs.com/kzloser/articles/2673790.html https://www.cnblogs.com/danh/ ...

  8. Zookeeper崩溃恢复过程(Leader选举)

    1. 崩溃恢复 a). leader选择过程可以保证新leader是ZXID最大的节点 b). ZAB协议确保丢弃那些只在leader上被提出的事务,场景 leader发出PROPOSAL收到ACK, ...

  9. wamp 下运行Drupal慢的解决方法

    1.Editing your php.ini and make realpath_cache_size=2M, 2.uncomment skip innodb in your my.cnf(my.in ...

  10. 每天学一点ubuntu指令

    2017-03-06apt-get | dpkg -i | apt-cache | add-apt-repository ppa源 | dpkg -S一.apt 给Ubuntu安装软件的一种命令方式a ...