orz 出题人Gromah

这道题我的算法和他的标解完全不一样,目前在bzoj上是第一名,空间开销也是当前最小的(截个图纪念一下)

首先用单调栈$O(n)$地预处理出以每个点为左端点、右端点的可行点对个数。

然后对于每个询问$[l, r]$中,我们找到其中权值最大的点,假设它是$p$

然后可以发现一个性质,在$[l, r]$中的所有可行点对都不会穿过$p$,如果穿过的话因为$p$是权值最大的点所以不合法

于是我们只要统计$[l, p - 1]$的所有点作为左端点时的合法点对和$[p + 1, r]$的所有点作为右端点时的合法点对数量即可

用ST表维护区间最大值

时间复杂度$O(nlogn + m)$,空间复杂度$O(nlogn)$

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <map>
 7 using namespace std;
 8 #define rep(i, l, r) for (int i = l; i <= r; i++)
 9 #define drep(i, r, l) for (int i = r; i >= l; i--)
10 typedef long long ll;
11 const int N = 3e5 + 8;
12 int n, m, ty, logn, st[22][N], L[N], R[N], son[N], a[N], top, q[N];
13 ll sumL[N], sumR[N];
14 int getint()
15 {
16     char c; int num = 0, w = 1;
17     for (c = getchar(); !isdigit(c) && c != '-'; c = getchar());
18     if (c == '-') c = getchar(), w = -1;
19     for (;isdigit(c); c = getchar()) num = num * 10 + c - '0';
20     return num * w;
21 }
22 void init()
23 {
24     logn = (int)(log(n) / log(2.0));
25     rep(i, 1, n)
26     {
27         son[i] = son[i - 1];
28         if ((1 << son[i] + 1) <= i) son[i]++;
29     }
30     rep(i, 1, n) st[0][i] = i;
31     rep(i, 1, logn)
32         rep(j, 1, n)
33         {
34             int x = st[i - 1][j], y = st[i - 1][j + (1 << i - 1)];
35             if (a[x] > a[y]) st[i][j] = x;
36             else st[i][j] = y;
37         }
38     q[top = 1] = 1;
39     rep(i, 2, n)
40     {
41         while (top && a[i] > a[q[top]]) L[i]++, top--;
42         if (top) L[i]++;
43         while (top && a[i] >= a[q[top]]) top--;
44         q[++top] = i;
45     }
46     rep(i, 1, n) sumL[i] = sumL[i - 1] + L[i];
47     q[top = 1] = n;
48     drep(i, n - 1, 1)
49     {
50         while (top && a[i] > a[q[top]]) R[i]++, top--;
51         if (top) R[i]++;
52         while (top && a[i] >= a[q[top]]) top--;
53         q[++top] = i;
54     }
55     rep(i, 1, n) sumR[i] = sumR[i - 1] + R[i];
56 }
57 int query(int l, int r)
58 {
59     int k = son[r - l + 1];
60     int x = st[k][l], y = st[k][r - (1 << son[r - l + 1]) + 1];
61     if (a[x] > a[y]) return x;
62     return y;
63 }
64 ll solve(int l, int r)
65 {
66     int p = query(l, r);
67     ll ret = sumR[p - 1] - sumR[l - 1] + sumL[r] - sumL[p];
68     return ret;
69 }
70 int main()
71 {
72 #ifndef ONLINE_JUDGE
73     freopen("input.txt", "r", stdin);
74     //freopen("output.txt", "w", stdout);
75 #endif
76     scanf("%d%d%d", &n, &m, &ty);
77     rep(i, 1, n) a[i] = getint();
78     init();
79     ll ans = 0;
80     while (m--)
81     {
82         int l = getint(), r = getint();
83         if (ty == 1) l = (l + ans - 1) % n + 1, r = (r + ans - 1) % n + 1;
84         if (l > r) swap(l, r);
85         ans = solve(l, r);
86         printf("%lld\n", ans);
87     }
88 #ifndef ONLINE_JUDGE
89     fclose(stdin); fclose(stdout);
90 #endif
91     return 0;
92 }

BZOJ3956

转载于:https://www.cnblogs.com/Dyzerjet/p/4452549.html

BZOJ3956: Count相关推荐

  1. 【BZOJ3956】Count,单调栈+ST表维护区间最大值

    Time:2016.08.11 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: TA爷眼中的水题 首先有个特别的结论 总共的点对数不会超过2n 因为对于元素i来说,如果只考虑与比它高 ...

  2. 【bzoj 1833】【codevs 1359】 [ZJOI2010]count 数字计数(数位dp)

    1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec  Memory Limit: 64 MB Submit: 2774  Solved: 1230 [Submit ...

  3. LeetCode刷题记录6——696. Count Binary Substrings(easy)

    LeetCode刷题记录6--696. Count Binary Substrings(easy) 目录 LeetCode刷题记录6--696. Count Binary Substrings(eas ...

  4. c++关于map的find和count的使用

    使用count,返回的是被查找元素的个数.如果有,返回1:否则,返回0.注意,map中不存在相同元素,所以返回值只能是1或0. 使用find,返回的是被查找元素的位置,没有则返回map.end(). ...

  5. 递归/归并:count of smaller numbers求逆序数

    已知数组nums,求新数组count,count[i]代表了在nums[i]右侧且比 nums[i]小的元素个数. 例如: nums = [5, 2, 6, 1], count = [2, 1, 1, ...

  6. bzoj 2588 Spoj 10628. Count on a tree (可持久化线段树)

    Spoj 10628. Count on a tree Time Limit: 12 Sec  Memory Limit: 128 MB Submit: 7669  Solved: 1894 [Sub ...

  7. windows7下解决caffe check failed registry.count(type) == 1(0 vs. 1) unknown layer type问题

    在Windows7下调用vs2013生成的Caffe静态库时经常会提示Check failed: registry.count(type) == 1 (0 vs. 1) Unknown layer t ...

  8. 1093 Count PAT‘s

    这题出现在"活用递推"专题下面,所谓递推就是这一步的结果和上一步的结果有直接联系.对于本题来说,从左到右,记到当前位置,一共出现的P的个数,如果当前位置是P,则个数就是上一位的加1 ...

  9. Mybatis中Oracle和Mysql的Count字段问题

    Mybatis中Oracle和Mysql的Count字段问题 我们在进行项目开发时经常会碰到查询总数的问题,所以我们直接是用select count(1) from table来进行查询.那么在Myb ...

  10. LINQ to SQL语句之 Count/Sum/Min/Max/Avg

    Count/Sum/Min/Max/Avg操作符 适用场景:统计数据吧,比如统计一些数据的个数,求和,最小值,最大值,平均数. Count 说明:返回集合中的元素个数,返回INT类型:不延迟.生成SQ ...

最新文章

  1. idea +springMVC搭建项目,新建各种文件基础
  2. pycharm如何设置注释的字体颜色
  3. 【PC工具】更新速度最快最好用的文件内容搜索工具:searchmyfiles
  4. matlab设计译码器,基于MATLAB的循环码编译码器设计与仿真.doc
  5. Qt creator5.7 OpenCV249之双边滤波(含源码下载)
  6. Java常见OutOfMemoryError
  7. 有人抄袭微信红包和表情被罚了40万!这下“吹牛”可能牛不起来了
  8. AutoFDO自动反馈式优化
  9. NUAGENETWORKS第二代SDN方案推企业云服务
  10. 12.企业应用架构模式 --- 对象-关系结构模式
  11. 临床基因组分析相关数据库汇总
  12. 第九届山东理工大学ACM网络编程擂台赛 F题题解
  13. table表格实现第一列固定
  14. cordova的ios版本cordova-ios4.4.0已经不支持iOS8
  15. 网络共享计算机怎么连接,两台电脑连接成局域网如何设置_两台电脑连接局域网共享的设置步骤-win7之家...
  16. svn: E175003:The server at ‘https://XXX/!/#XXX/XXX‘ does not support the HTTP/DAV protocol解决方案
  17. Python基础笔记(二)整数缓存、字符串驻留机制、字符串格式化等
  18. flex是什么及flex布局语法
  19. 人员定位及轨迹管理方案
  20. 确认过眼神,地址不是对的人—— 权限验证错误 | 漏洞分析连载之五

热门文章

  1. 字符串类型:不能忽略的 COLLATION
  2. Hive导入json文件
  3. flume正则拦截器
  4. Linux编译Opencv3.4.7: relocation R_X86_64_PC32 against `ff_w_ff‘ can not be used when makin with -fPIC
  5. Linux内核开发_内核模块
  6. Windows核心编程_窗口透明组件不透明
  7. (二)GitHub使用随记
  8. 【剑指offer】之字形打印二叉树,C++实现
  9. pandas.DataFrame.rank
  10. mysql 5.7.15发布