【题解】 bzoj3956: Count (ST表+单调栈)
Solution
- 看了一点点题解,自己又刚了\(2h30min\),刚了出来qwq,我好菜啊qwq
- 貌似这道题是BZOJ 4826的弱化,弱化都不会qwq凉凉
- Solution
- 首先你可以考虑,找出\([l,r]\)的最大值(\(x\))后,你会发现这个好的点对,是不会跨过这最大值(\(x\))的,那么答案就是\([l,x]\)的所有点作为点对左端的方案数\(+\) \([x+1,r]\)所有点作为点对右端的方案数
- 求方案数我们就可以用单调栈\(O(n)\)求出来,然后做一次前缀和就好了
- 这个单调栈操作我觉得这个贼鸡儿难,调了很多特殊数据终于过了
- 具体操作:
相邻的两个值(a,b)不论怎样肯定是一个点对,如果单调栈处理,因为我们要处理出作为左端点的方案数和右端段的方案数,相邻的这种点对就会在\(a\)为左端点时加一次,在\(b\)为右端点的时候加一次,这样会有重复,比较麻烦,我们就不考虑这种相邻的情况(这样最后的答案就是\([l,x-1]\)的所有点作为点对左端的方案数加 \([x+1,r]\)所有点作为点对右端的方案数,因为\(x\)最大只会是与相邻两个成点对)
现在假定我们求每个点为点对左端点的方案数
后面的操作就是:我们维护一个单调上升的栈,每入队一个点,如果这个点比队尾大,队尾的这个点如果不是现在加入的点的相邻点,我们就把他的方案数\(+1\),然后弹出(因为你想,如果这个点不相邻,中间的全部被弹出,说明一定不会大于这两边的两个)
稍微特殊的情况就是,如果队尾的值(假设为\(a_1\))与现在加入的值(假设为\(a_2\))相等,那么我们就给队尾的方案数\(+1\),然后弹出,并且把这个新加入的点作为队尾。(\(*\)解释在后面)
(\(*\))解释:因为题目要求是大于,所以中间存在与两边等于的情况也是不行的,所以\(a_2\)不会对\(a_1\)之前的点有贡献,\(a_1\)不会对\(a_2\)之后的点有贡献。
然后弹完队尾后,我们把这个现在的队尾的方案数加一,原因同上,他们两之间的数一定小于两边,然后把点入队即可
最后没弹出队列的点不用管,因为他们单调递增,比如\(a,b,c\)(\(a<b<c\)),后面不会再有点与\(a\)形成点对,因为\(b,c\)一定大于\(a\)
右端点的反着来一边就好了
最后计算答案记得加上相邻的方案数即可
那个查询最大值可以用\(ST表\),也可以用线段树,(本来是要练习\(ST\)表的,结果调单调栈调了好久qwq
感觉这道题还是挺神的吧,把思路理了一边总算清楚很多了.
Code
- 调了好久,写的丑
//It is coded by ning_mew on 7.19
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int maxn=3e5+7,inf=1e9+7;
int n,m,Type;
LL sl[maxn],sr[maxn],two[25],lastans=0;
int team[maxn],s[maxn],tl=1,ST[maxn][25],Log[maxn];
int maxa(int x,int y){if(s[x]>s[y])return x;return y;}
int quary(int l,int r){
int k=Log[r-l+1];
return maxa(ST[l][k],ST[r-two[k]+1][k]);
}
void pre(){
two[0]=1;
for(int i=2;i<=n;i++)Log[i]=Log[i>>1]+1;
for(int i=1;i<=16;i++)two[i]=two[i-1]*2;
for(int j=1;j<=16;j++)
for(int i=1;i+two[j-1]<=n;i++){
ST[i][j]=maxa(ST[i][j-1],ST[i+two[j-1]][j-1]);
}
}
void work(int l,int r){
int k=quary(l,r);
lastans=sl[k-1]-sl[l-1]+sr[r]-sr[k]+r-l;
printf("%lld\n",lastans);
if(!Type)lastans=0;return;
}
int main(){
scanf("%d%d%d",&n,&m,&Type);
for(int i=1;i<=n;i++)scanf("%d",&s[i]),ST[i][0]=i;
pre();
for(int i=1;i<=n;i++){
while(tl>1){
if(s[ team[tl-1] ]<=s[i]){
if(team[tl-1]!=i-1)sl[team[tl-1]]++;
if(s[team[tl-1]]==s[i]){break;}
tl--;
}
else break;
}
if(s[team[tl-1]]==s[i]){team[tl-1]=i;continue;}
if(team[tl-1]!=i-1)sl[team[tl-1]]++;
team[tl]=i;tl++;
}
memset(team,0,sizeof(team));tl=1;
for(int i=n;i>=1;i--){
while(tl>1){
if(s[ team[tl-1] ]<=s[i]){
if(team[tl-1]!=i+1)sr[team[tl-1]]++;
if(s[team[tl-1]]==s[i]){break;}
tl--;
}
else break;
}
if(s[team[tl-1]]==s[i]){team[tl-1]=i;continue;}
if(team[tl-1]!=i+1)sr[team[tl-1]]++;
team[tl]=i;tl++;
}
sl[0]=sr[n+1]=0;
for(int i=1;i<=n;i++)sl[i]=sl[i]+sl[i-1],sr[i]=sr[i]+sr[i-1];
lastans=0;
for(int i=1;i<=m;i++){
LL l,r;scanf("%lld%lld",&l,&r);
l=(l+lastans-1)%n+1;r=(r+lastans-1)%n+1;if(l>r)swap(l,r);
work(l,r);
}return 0;
}
博主蒟蒻,随意转载。但必须附上原文链接:http://www.cnblogs.com/Ning-Mew/,否则你会场场比赛暴0!!!
【题解】 bzoj3956: Count (ST表+单调栈)的更多相关文章
- 【BZOJ-3956】Count ST表 + 单调栈
3956: Count Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 173 Solved: 99[Submit][Status][Discuss] ...
- [多校联考2019(Round 4 T2)][51nod 1288]汽油补给(ST表+单调栈)
[51nod 1288]汽油补给(ST表+单调栈) 题面 有(N+1)个城市,0是起点N是终点,开车从0 -> 1 - > 2...... -> N,车每走1个单位距离消耗1个单位的 ...
- BZOJ4540 [Hnoi2016]序列 【莫队 + ST表 + 单调栈】
题目 给定长度为n的序列:a1,a2,-,an,记为a[1:n].类似地,a[l:r](1≤l≤r≤N)是指序列:al,al+1,-,ar- 1,ar.若1≤l≤s≤t≤r≤n,则称a[s:t]是a[ ...
- 【BZOJ3611】[Heoi2014]大工程 欧拉序+ST表+单调栈
[BZOJ3611][Heoi2014]大工程 Description 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道. 我们这个国家位置非常特殊,可以看成是一个单位边权的树,城市位于顶 ...
- BZOJ 4453: cys就是要拿英魂![后缀数组 ST表 单调栈类似物]
4453: cys就是要拿英魂! Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 90 Solved: 46[Submit][Status][Discu ...
- bzoj千题计划313:bzoj3879: SvT(后缀数组+st表+单调栈)
https://www.lydsy.com/JudgeOnline/problem.php?id=3879 把所有的后缀取出,按rank排序 求出相邻两个后缀的lcp 每个后缀对答案的贡献就是 与在它 ...
- bzoj千题计划314:bzoj3238: [Ahoi2013]差异(后缀数组+st表+单调栈)
https://www.lydsy.com/JudgeOnline/problem.php?id=3238 跟 bzoj3879 差不多 #include<cstdio> #include ...
- Codeforces Round #278 (Div. 1) B - Strip dp+st表+单调队列
B - Strip 思路:简单dp,用st表+单调队列维护一下. #include<bits/stdc++.h> #define LL long long #define fi first ...
- 【BZOJ3956】Count 主席树+单调栈
[BZOJ3956]Count Description Input Output Sample Input 3 2 0 2 1 2 1 1 1 3 Sample Output 0 3 HINT M,N ...
随机推荐
- JVM调优——之CMS 常见参数解析
最近在学习使用CMS这个GC,这里记录下常用的参数. 1. UseCMSCompactAtFullCollection 与 CMSFullGCsBeforeCompaction 有一点需要注意的是:C ...
- 反射反射,程序员的快乐+反射案例:打印和Excel导出
还是那几句话: 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现在,学习代表你的将来 看过设计模式的童鞋都知道:反射反射,程序员的快乐!今天我们就利用反射来制作打印 ...
- 关于小程序登录时获取openId和unionId走过的坑
目前的项目是在做小程序这方面的,接触过的人应该都知道,同一个微信开放平台下的相同主体的App.公众号.小程序的unionid是相同的,这样就可以锁定是不是同一个用户.微信针对不同的用户在不同的应用下都 ...
- FreeRTOS 任务与调度器(1)
前言: Task.c和Task.h文件内是FreeRTOS的核心内容,所有任务和调度器相关的API函数都在这个文件中,它包括下图这些内容FreeRTOS文件如下: Task.c和Task.h文件内是F ...
- Apache之Rewrite和RewriteRule规则梳理以及http强转https的配置总结
一. 简单实例介绍一般来说,apache配置好http和https后,如果想要做http强转到https,需要设置url重定向规则,大致需要下面几个步骤即可完成配置: 1)在httpd.conf文件里 ...
- HAOI2016 找相同字符 后缀自动机
两个串,考虑一建一跑.枚举模式串的位置\(i\),考虑每次统计以\(i\)结尾的所有符合要求的串.在后缀自动机上走时记录当前匹配长度\(curlen\),则当前节点的贡献是\((curlen-len[ ...
- javaScript常用API合集
节点 1.1 节点属性 Node.nodeName //返回节点名称,只读 Node.nodeType //返回节点类型的常数值,只读 Node.nodeValue //返回Text或Com ...
- VS2015安装及单元测试
今天跟大家分享一下我的VS2015的安装过程以及对单元测试的操作步骤.VS2015是一款非常好用的编程软件,内容很多很广泛,是深受欢迎的一款软件,较之于VC++6.0有着一些好处,对VC6.0++来说 ...
- Linux内核分析第三章读书笔记
第三章 进程管理 3.1 进程 进程就是处于执行期的程序 进程就是正在执行的程序代码的实时结果 线程:在进程中活动的对象.每个线程都拥有一个独立的程序计数器.进程栈和一组进程寄存器. 内核调度的对象是 ...
- 五子棋游戏SRS
一.功能需求 1.绘制棋子 2.绘制界面 3.绘制棋盘 4.实现通过鼠标下棋并判断棋子是否落在棋盘上 6.判断胜负 二.用例图 玩家用例图: 1.落子:玩家鼠标点击最近的落子点落子.2.电脑先落子:选 ...