hdu 5289 rmp+二分+枚举后界 or单调队列 ****
好题~~
给你n个数和k,求有多少的区间使得区间内部任意两个数的差值小于k,输出符合要求的区间个数,枚举后界~~
又是一种没见过的方法,太弱了/(ㄒoㄒ)/~~
- #include <cstdio>
- #include <cstdlib>
- #include <cmath>
- #include <cstring>
- #include <iostream>
- #include <queue>
- #include <algorithm>
- #include <vector>
- #include <set>
- using namespace std;
- #define LL __int64
- #define INF 0x3f3f3f3f
- const int MAXN=;
- #define mod 1000000007
- int a[MAXN];
- LL ans;
- int dp1[MAXN][],dp2[MAXN][];
- void init(int n)
- {
- for(int i=;i<=n;i++)
- dp1[i][]=dp2[i][]=a[i];
- for(int j=;(<<j)<=n;j++)
- {
- for(int i=;i+(<<j)-<=n;i++)
- {
- dp1[i][j]=max(dp1[i][j-],dp1[i+(<<(j-))][j-]);
- dp2[i][j]=min(dp2[i][j-],dp2[i+(<<(j-))][j-]);
- }
- }
- }
- int RMQ(int L,int R)
- {
- int k=;
- while((<<(k+))<=R-L+)k++;
- return max(dp1[L][k],dp1[R-(<<k)+][k])-min(dp2[L][k],dp2[R-(<<k)+][k]);
- }
- int binarySearch(int L,int R,int n,int k)
- {
- int mid;
- int l=L,r=R;
- while(l<=r)
- {
- mid=(l+r)/;
- if(RMQ(mid,R)>=k)
- {
- l=mid+;
- }
- else
- {
- r=mid-;
- }
- }
- if(RMQ(mid,R)>=k)
- mid++;
- return mid;
- }
- int main()
- {
- int T,i,j,n,k,mi,ma,l,r;
- while(~scanf("%d",&T))
- {
- while(T--)
- {
- scanf("%d%d",&n,&k);
- for(i=;i<=n;i++)
- scanf("%d",&a[i]);
- if(!k)
- {
- printf("0\n");
- continue;
- }
- if(k==)
- {
- printf("%d\n",n);
- continue;
- }
- init(n);
- ans=;
- for(i=j=;i<=n;i++)
- {
- j=binarySearch(j,i,n,k);
- ans+=i-j+;
- }
- printf("%I64d\n",ans);
- }
- }
- return ;
- }
- #include <cstdio>
- #include <cstring>
- #include <queue>
- #include <algorithm>
- using namespace std ;
- #define LL __int64
- deque <LL> deq1 , deq2 ;
- //单调队列,deq1最大值,deq2最小值
- LL a[] ;
- int main() {
- int t , n , i , j ;
- LL k , ans ;
- #ifndef ONLINE_JUDGE
- freopen("1.in","r",stdin);
- #endif
- scanf("%d", &t) ;
- while( t-- ) {
- scanf("%d %I64d", &n, &k) ;
- for(i = ; i < n ; i++)
- scanf("%I64d", &a[i]) ;
- if(k == ) {
- printf("0\n") ;
- continue ;
- }
- while( !deq1.empty() ) deq1.pop_back() ;
- while( !deq2.empty() ) deq2.pop_back() ;
- for(i = , j = , ans = ; i < n ; i++) {//i在前,j在后
- while( !deq1.empty() && deq1.back() < a[i] ) deq1.pop_back() ;
- deq1.push_back(a[i]) ;
- while( !deq2.empty() && deq2.back() > a[i] ) deq2.pop_back() ;
- deq2.push_back(a[i]) ;
- while( !deq1.empty() && !deq2.empty() && deq1.front() - deq2.front() >= k ) {
- ans += (i-j) ;
- //printf("%d %d,%I64d %I64d\n", i , j, deq1.front() , deq2.front() ) ;
- if( deq1.front() == a[j] ) deq1.pop_front() ;
- if( deq2.front() == a[j] ) deq2.pop_front() ;
- j++ ;
- }
- }
- while( j < n ) {
- ans += (i-j) ;
- j++ ;
- }
- printf("%I64d\n", ans) ;
- }
- return ;
- }
hdu 5289 rmp+二分+枚举后界 or单调队列 ****的更多相关文章
- 【BZOJ2806】Cheat(后缀自动机,二分答案,动态规划,单调队列)
[BZOJ2806]Cheat(后缀自动机,二分答案,动态规划,单调队列) 题面 BZOJ 洛谷 题解 很有趣的一道题啊 对于在所有的串上面进行匹配? 很明显的后缀自动机 所以先构建出广义后缀自动机 ...
- HDU 5289 Assignment(多校2015 RMQ 单调(双端)队列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5289 Problem Description Tom owns a company and he is ...
- bzoj 1171 并查集优化顺序枚举 | 线段树套单调队列
详见vfleaking在discuss里的题解. 收获: 当我们要顺序枚举一个序列,并且跳过某些元素,那么我们可以用并查集将要跳过的元素合并到一起,这样当一长串元素需要跳过时,可以O(1)跳过. 暴力 ...
- hdu 6444 网络赛 Neko's loop(单调队列 + 裴蜀定理)题解
题意:有编号为0~n-1的n个游戏,每个活动都有一个价值(可为负),给你m,s和k,你可以从任意一个编号开始玩,但是下一个游戏必须是编号为(i + k)%n的游戏,你最多能玩m次游戏,问你如果最后你手 ...
- 无题II hdu 2236(二分枚举区间)
分析:只需要用二分找一个区间,然后不断枚举这个区间是否可以达到最大匹配,一直二分到答案为止. 代码: =============================================== ...
- hdu 3189(网络流+二分枚举)
Steady Cow Assignment Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6422 Accepted: ...
- HDU 4123 Bob’s Race 树的直径+单调队列
题意: 给定n个点的带边权树Q个询问. 以下n-1行给出树 以下Q行每行一个数字表示询问. 首先求出dp[N] :dp[i]表示i点距离树上最远点的距离 询问u, 表示求出 dp 数组中最长的连续序列 ...
- HDU 5380 Travel with candy (贪心,单调队列)
题意: 有n+1个城市按顺序分布在同一直线上,现在需从0号城市按顺序走到n号城市(保证可达),从0号城市到i号城市需要消耗ai个糖果,每个城市都可以通过买/卖糖果来赚取更多的钱,价格分别是buyi和s ...
- 【单调队列+尺取】HDU 3530 Subsequence
acm.hdu.edu.cn/showproblem.php?pid=3530 [题意] 给定一个长度为n的序列,问这个序列满足最大值和最小值的差在[m,k]的范围内的最长子区间是多长? [思路] 对 ...
随机推荐
- zend studio安装svn插件
进入zend->Help->Install New Software 输入如下地址: http://subclipse.tigris.org/update_1.8.x 选择subclips ...
- php preg_match($p, $str, $match)方法简介
方法作用:匹配指定的正则表达式并将结果放在$match数组中 代码示例: $p = '/name:([\\ws]+)/'; $str = "name:steven jobs"; p ...
- Python操作excel,及图表展示
学习:http://www.cnblogs.com/Lands-ljk/p/5444619.html
- 【GoLang】golang runtime 调度原理
参考资料: http://m.yl1001.com/group_article/3231471449287668.htm http://tieba.baidu.com/p/3542454435?sha ...
- java切换VPN让你像幽灵一样出现在全国各地
在很多情况下,有些网络应用的需求会要求模拟人在不同地区访问网站和应用.因而切换IP也就应运而生了,然而IP作为一种稀缺资源不是随便可以获得的.因而会想到应用程序切换VPN来达到全国不同地区访问网络.因 ...
- Android SDK打包
2015年6月18日 14:38:49 星期四 eclipse: 1. 将写好的代码上传版本库 2. 删除 /bin/* 3. eclipse->project->clean... 4. ...
- perl 从文件里读出变量无法使用解决办法
最近在写一个perl函数,把test case 放到配置文件里,读出来然后使用system运行. 我的本意是: 配置文件conf ping -c $count $ip #在主程序中定义$ip和$cou ...
- VS2013,asp.net网站转换为web应用程序
此功能已经不在右键菜单里了,而在主菜单中的“项目-->转换为WEB应用程序”
- Oracle 修改现有列的数据类型
如果表中有数据,Oracle是不能修改其数据类型的.但可以通过新建一个临时列,将要修改列的数据复制到临时列中,删除原列再修改临时列的名字.这样说好像有点拗口,分步解说一下. 表AC_REG中有列:is ...
- Luncence .Net 使用
public partial class Form1 : Form { public Form1() { InitializeComponent(); } //标准分词 private void bu ...