bzoj 3956: Count
3956: Count
Description
Input
Output
Sample Input
2 1 2
1 1
1 3
Sample Output
3
HINT
M,N<=3*10^5,Ai<=10^9
Source
CH Round#64 MFOI杯水题欢乐赛day1 By Gromah
题解:
性质很妙的一道题。
首先可以发现这个所有的点队数是很小的,考虑以把一个点作为两个端点中较小的一个,那么另一个端点肯定是向左向右第一个大于等于它的点,这是很显然的。。。。
我们可以先用单调栈把这些点对都预处理出来。
再考虑如何求区间[L,R]内的答案。
设x为[L,R]中最大值的位置。
显然某个端点在区间内的点对是不可能跨越这个点的。
然后就可以前缀和计算答案了。。
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
const int N=300005;
struct node
{
int a,b;
}p[N<<1];
int n,m,T,i,j,x,y,ans,l,r,k,cnt,a[N],g[N],L[N],R[N],Log[N],f[N][25],F[N][25];
inline int Max(int l,int r)
{
int x=Log[r-l+1];
if(f[l][x]>f[r-(1<<x)+1][x]) return F[l][x];else return F[r-(1<<x)+1][x];
}
inline void read(int&v)
{
char c=getchar();v=0;
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') v=v*10+c-'0',c=getchar();
}
int main()
{
scanf("%d%d%d",&n,&m,&T);
for(i=1;i<=n;i++) Log[i]=log2(i);
for(i=1;i<=n;i++) scanf("%d",&a[i]),f[i][0]=a[i],F[i][0]=i;
for(j=1;(1<<j)<=n;j++)
for(i=1;i+(1<<j)-1<=n;i++)
if(f[i][j-1]>f[i+(1<<j-1)][j-1])
{
f[i][j]=f[i][j-1];
F[i][j]=F[i][j-1];
} else
{
f[i][j]=f[i+(1<<j-1)][j-1];
F[i][j]=F[i+(1<<j-1)][j-1];
}
for(i=1;i<=n;i++)
{
while(k>0&&a[i]>a[g[k]]) k--;
if(g[k]>0)
{
p[++cnt].a=g[k];
p[cnt].b=i;
}
g[++k]=i;
}
k=0;
for(i=n;i>=1;i--)
{
while(k>0&&a[i]>a[g[k]]) k--;
if(g[k]>0&&a[i]!=a[g[k]])
{
p[++cnt].a=i;
p[cnt].b=g[k];
}
g[++k]=i;
}
for(i=1;i<=cnt;i++) L[p[i].a]++,R[p[i].b]++;
for(i=1;i<=n;i++) L[i]+=L[i-1],R[i]+=R[i-1];
while(m--)
{
read(x),read(y);
if(T==1) l=(x+ans-1)%n+1,r=(y+ans-1)%n+1;else l=x,r=y;
if(l>r) swap(l,r);
int id=Max(l,r);
ans=L[id-1]-L[l-1]+R[r]-R[id];
printf("%d\n",ans);
}
return 0;
}
bzoj 3956: Count的更多相关文章
- BZOJ 3956: Count 主席树 可持久化线段树 单调栈
https://www.lydsy.com/JudgeOnline/problem.php?id=3956 从描述可以得到性质: 每个好点对 ( 除了差值为1的好点对 ) 中间的数 ( i , j ) ...
- BZOJ 3956 Count 解题报告
好点对的个数是\(O(n)\)的,而且我们可以 \(O(n)\) 地求出所有好点对. 我们把这些点对以右端点为关键字从小到大排序,再弄个扫描线,每次把右端点在扫描线上的点对的左端点加入线段树,于是我们 ...
- bzoj 4664: Count
这道题和bzoj上一道叫魔法碰撞的题很像,只不过做法更加巧妙了. 一开始的想法是$f[i][j][k][0/1/2]$表示后i个数有j段当前混乱程度为k的方案,最后一维表示边界还能放几个. 转移的时候 ...
- bzoj 2588 Count on a tree 解题报告
Count on a tree 题目描述 给定一棵\(N\)个节点的树,每个点有一个权值,对于\(M\)个询问\((u,v,k)\),你需要回答\(u\) \(xor\) \(lastans\)和\( ...
- BZOJ 1833 count 数字计数
sb数位dp. #include<iostream> #include<cstdio> #include<cstring> #include<algorith ...
- BZOJ 1452 Count(二维树状数组)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1452 题意:给出一个数字矩阵(矩阵中任何时候的数字均为[1,100]),两种操作:(1) ...
- BZOJ 1452 Count
长知识啦..二维BIT. #include<iostream> #include<cstdio> #include<cstring> #include<alg ...
- BZOJ 2588 Count on a tree (COT) 是持久的段树
标题效果:两棵树之间的首次查询k大点的权利. 思维:树木覆盖树,事实上,它是正常的树木覆盖了持久段树. 由于使用权值段树可以寻求区间k大,然后应用到持久段树思想,间隔可以做减法.详见代码. CODE: ...
- bzoj 2588 Count on a tree
Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始 ...
随机推荐
- 安裝HA服務
**************************************************************************************************** ...
- ip分片重组 ip_defrag
在ip_local_deliver中,如果检测到是分片包,则需要进行分片重组: ip_local_deliver |-->ip_is_fragment //判断是否为分片包 |-->ip_ ...
- /dev/mem可没那么简单【转】
转自:http://blog.csdn.net/skyflying2012/article/details/47611399 这几天研究了下/dev/mem,发现功能很神奇,通过mmap可以将物理地址 ...
- linux文件管理 -> 系统目录结构
几乎所有的计算机操作系统都是用目录结构组织文件.具体来说就是在一个目录中存放子目录和文件, 而在子目录中又会进一步存放子目录和文件,以此类推形成一个树状的文件结构,由于其结构很像一棵树的分支, 所以该 ...
- Scrapy项目之User timeout caused connection failure(异常记录)
Windows 10家庭中文版,Python 3.6.4,Scrapy 1.5.0, 提示:此文存在问题,真正测试, 请勿阅读, 07-14 14:26更新: 经过两个多小时的测试,发现此问题的原因是 ...
- Mysql Limit操作
oracle : || mysql: contact contact_ws 拼接 Font Size: Large | Medium | Small select * from tabl ...
- J2V8 For Android
J2V8是基于Google的JavaScript引擎V8的Java开源项目,实现Java和JavaScript的相互调用.并对Android平台提供支持,最新版本提供了aar格式的类库包方便Andro ...
- 经典面试题:js继承方式下
上一篇讲解了构造函数的继承方式,今天来讲非构造函数的继承模式. 一.object()方法 json格式的发明人Douglas Crockford,提出了一个object()函数,可以做到这一点. fu ...
- 使用插件实现Jenkins参数化构建
一.插件安装 1.打开插件管理,在此界面可以安装插件 二.参数化 1.在“可选插件”中查找如下两个插件然后安装,安装后重启Jenkins Build With Parameters 输入框式的参数 P ...
- dede导航栏目调用
1.基础调用 {dede:channel row='5' type ='top' } <li><a href="[field:typelink/]">[fi ...