BZOJ3956: Count
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相关推荐
- 【BZOJ3956】Count,单调栈+ST表维护区间最大值
Time:2016.08.11 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: TA爷眼中的水题 首先有个特别的结论 总共的点对数不会超过2n 因为对于元素i来说,如果只考虑与比它高 ...
- 【bzoj 1833】【codevs 1359】 [ZJOI2010]count 数字计数(数位dp)
1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec Memory Limit: 64 MB Submit: 2774 Solved: 1230 [Submit ...
- LeetCode刷题记录6——696. Count Binary Substrings(easy)
LeetCode刷题记录6--696. Count Binary Substrings(easy) 目录 LeetCode刷题记录6--696. Count Binary Substrings(eas ...
- c++关于map的find和count的使用
使用count,返回的是被查找元素的个数.如果有,返回1:否则,返回0.注意,map中不存在相同元素,所以返回值只能是1或0. 使用find,返回的是被查找元素的位置,没有则返回map.end(). ...
- 递归/归并:count of smaller numbers求逆序数
已知数组nums,求新数组count,count[i]代表了在nums[i]右侧且比 nums[i]小的元素个数. 例如: nums = [5, 2, 6, 1], count = [2, 1, 1, ...
- 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 ...
- 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 ...
- 1093 Count PAT‘s
这题出现在"活用递推"专题下面,所谓递推就是这一步的结果和上一步的结果有直接联系.对于本题来说,从左到右,记到当前位置,一共出现的P的个数,如果当前位置是P,则个数就是上一位的加1 ...
- Mybatis中Oracle和Mysql的Count字段问题
Mybatis中Oracle和Mysql的Count字段问题 我们在进行项目开发时经常会碰到查询总数的问题,所以我们直接是用select count(1) from table来进行查询.那么在Myb ...
- LINQ to SQL语句之 Count/Sum/Min/Max/Avg
Count/Sum/Min/Max/Avg操作符 适用场景:统计数据吧,比如统计一些数据的个数,求和,最小值,最大值,平均数. Count 说明:返回集合中的元素个数,返回INT类型:不延迟.生成SQ ...
最新文章
- idea +springMVC搭建项目,新建各种文件基础
- pycharm如何设置注释的字体颜色
- 【PC工具】更新速度最快最好用的文件内容搜索工具:searchmyfiles
- matlab设计译码器,基于MATLAB的循环码编译码器设计与仿真.doc
- Qt creator5.7 OpenCV249之双边滤波(含源码下载)
- Java常见OutOfMemoryError
- 有人抄袭微信红包和表情被罚了40万!这下“吹牛”可能牛不起来了
- AutoFDO自动反馈式优化
- NUAGENETWORKS第二代SDN方案推企业云服务
- 12.企业应用架构模式 --- 对象-关系结构模式
- 临床基因组分析相关数据库汇总
- 第九届山东理工大学ACM网络编程擂台赛 F题题解
- table表格实现第一列固定
- cordova的ios版本cordova-ios4.4.0已经不支持iOS8
- 网络共享计算机怎么连接,两台电脑连接成局域网如何设置_两台电脑连接局域网共享的设置步骤-win7之家...
- svn: E175003:The server at ‘https://XXX/!/#XXX/XXX‘ does not support the HTTP/DAV protocol解决方案
- Python基础笔记(二)整数缓存、字符串驻留机制、字符串格式化等
- flex是什么及flex布局语法
- 人员定位及轨迹管理方案
- 确认过眼神,地址不是对的人—— 权限验证错误 | 漏洞分析连载之五
热门文章
- 字符串类型:不能忽略的 COLLATION
- Hive导入json文件
- flume正则拦截器
- Linux编译Opencv3.4.7: relocation R_X86_64_PC32 against `ff_w_ff‘ can not be used when makin with -fPIC
- Linux内核开发_内核模块
- Windows核心编程_窗口透明组件不透明
- (二)GitHub使用随记
- 【剑指offer】之字形打印二叉树,C++实现
- pandas.DataFrame.rank
- mysql 5.7.15发布