题意:给定数组a[],求区间个数,满足区间的数各不同,而且满足maxval-len<=K;

思路:一看就可以分治做,对于当前的区间,从max位置分治。 对于这一层,需要高效的统计答案,那么对短的一边开始统计。

(这个过程很像启发式的逆过程,所以叫做启发式分治

1,对于数不同,这个可以预处理前缀和后缀的最大区间长度A[],B[]。

2,st表得到区间最大值位置,然后就可以搞了。

如果是第一次遇到,可以参考同一类的题目:

2019牛客暑期多校训练营(第三场)G: Removing Stones(启发式分治)

Non-boring sequences(启发式分治)

#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
int a[maxn],st[maxn][],lg[maxn],K,N; ll ans;
int A[maxn],B[maxn],vis[maxn];
int get(int L,int R)
{
int k=lg[R-L+];
return a[st[L][k]]>=a[st[R-(<<k)+][k]]?st[L][k]:st[R-(<<k)+][k];
}
void solve(int L,int R)
{
if(L>R) return ;
int pos=get(L,R);
if(pos-L<R-pos){
rep(i,L,pos){
int t=a[pos]-K,lR=i+t-;
int fcy=min(R,B[i]);
lR=max(lR,pos);
if(lR>fcy) continue;
ans+=fcy-lR+;
}
}
else {
rep(i,pos,R){
int t=a[pos]-K,rL=i-t+;
int fcy=max(L,A[i]);
rL=min(rL,pos);
if(rL<fcy) continue;
ans+=rL-fcy+;
}
}
solve(L,pos-); solve(pos+,R);
}
int main()
{
int T;
lg[]=-; rep(i,,maxn-) lg[i]=lg[i>>]+;
scanf("%d",&T);
while(T--){
scanf("%d%d",&N,&K); ans=;
rep(i,,N) scanf("%d",&a[i]);
rep(i,,N) st[i][]=i;
rep(i,,) {
rep(j,,N+-(<<i))
st[j][i]=a[st[j][i-]]>=a[st[j+(<<(i-))][i-]]?st[j][i-]:st[j+(<<(i-))][i-];
} rep(i,,N) vis[i]=; A[]=; vis[a[]]=;
rep(i,,N){
if(vis[a[i]]) A[i]=max(A[i-],vis[a[i]]+);
else A[i]=A[i-];
vis[a[i]]=i;
}
rep(i,,N) vis[i]=; B[N]=N; vis[a[N]]=N;
for(int i=N-;i>=;i--){
if(vis[a[i]]) B[i]=min(B[i+],vis[a[i]]-);
else B[i]=B[i+];
vis[a[i]]=i;
}
solve(,N);
printf("%lld\n",ans);
}
return ;
}

HDU6701:Make Rounddog Happy(启发式分治)的更多相关文章

  1. Make Rounddog Happy(2019年杭电多校第十场1011+HDU6701+启发式分治)

    目录 题目链接 题意 思路 代码 题目链接 传送门 题意 求有多少个子区间满足\(a_l,a_{l+1},\dots,a_r\)均不相同且\(max(a_l,a_{l+1},\dots,a_r)-(r ...

  2. hdu-6701 Make Rounddog Happy

    题目链接 Make Rounddog Happy Problem Description Rounddog always has an array a1,a2,⋯,an in his right po ...

  3. Removing Stones(2019年牛客多校第三场G+启发式分治)

    目录 题目链接 题意 思路 代码 题目链接 传送门 题意 初始时有\(n\)堆石子,每堆石子的石子个数为\(a_i\),然后进行游戏. 游戏规则为你可以选择任意两堆石子,然后从这两堆中移除一个石子,最 ...

  4. 2019牛客暑期多校训练营(第三场)G: Removing Stones(启发式分治)

    题意:给定N,表示N堆石子,每堆石子数为a[],问多少个区间,可以满足“石子总和若为偶数,那么可以两两取来自不同堆的石子,直到取完: 如果为奇数,那么排除其中一个,然后可以两两取来自不同堆的石子,直到 ...

  5. 启发式分治:2019牛客多校第三场 G题 Removing Stones

    问题可以转换为求有多少个区间数字的总和除2向下取整大于等于最大值.或者解释为有多少个区间数字的总和大于等于最大值的两倍(但是若区间数字总和为奇数,需要算作减1) 启发式分治: 首先按最大值位置分治,遍 ...

  6. BZOJ 4059 [Cerc2012]Non-boring sequences(启发式分治)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4059 [题目大意] 一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的 ...

  7. Non-boring sequences(启发式分治)

    题意:一个序列被称作是不无聊的,当且仅当,任意一个连续子区间,存在一个数字只出现了一次,问给定序列是否是不无聊的. 思路:每次找到一个只出现了一次的点,其位置的pos,那么继续分治[L,pos-1], ...

  8. BZOJ 4059: [Cerc2012]Non-boring sequences(启发式分治)

    传送门 解题思路 首先可以想到要预处理一个\(nxt_i\)和\(pre_i\),表示前后与当前位置权值相同的节点,那么这样可以迅速算出某个点在某段区间是否出现多次.然后这样的话就考虑分治,对于\([ ...

  9. 【题解】P4755 Beautiful Pair(启发式合并的思路+分治=启发式分治)

    [题解]P4755 Beautiful Pair upd: 之前一个first second烦了,现在AC了 由于之前是直接抄std写的,所以没有什么心得体会,今天自己写写发现 不知道为啥\(90\) ...

随机推荐

  1. SQL Server创建、更改和删除架构

    SQL Server创建架构 学习如何使用SQL Server CREATE SCHEMA在当前数据库中创建新架构. SQL Server中的架构是什么 架构是包括表,视图,触发器,存储过程,索引等在 ...

  2. Qt SDK Issue cstdlib: fatal error: stdlib.h: No such file or directory

    *To reproduce the issue, I've tried the following solutions which did not help:* *1) Globally remove ...

  3. SpringBoot扩展点之一:SpringApplicationRunListener

    三种监听器的关系 ApplicationListener.SpringApplicationRunListeners.SpringApplicationRunListener的关系: SpringAp ...

  4. deepin安装卡在deepin标志界面解决方案

    再次重启前将U盘插上,进系统前按快速选择启动装置F12(不同品牌电脑可能不同),选择从U盘启动: 进入第一个安装界面时一定要注意:在跳转前,按E进入grub设置界面,移动光标到倒数第二行的”quiet ...

  5. k8s Helm安装Prometheus Operator

    Ubuntu 18 Kubernetes集群的安装和部署 以及Helm的安装完成了k8s的集群和helm的安装,今天我们来看看Prometheus的监控怎么搞.Prometheus Operator ...

  6. vue截取字符串

    1.vue中截取前11位字符串 <li> <span>立案时间:</span> <p>{{jsyd.TIME.substring(0,10)}}< ...

  7. Java学习:常量和变量 的定义和注意事项

    常量:在程序运行期间,固定不变的量. 常量的分类:1.字符串常量:凡是用双引号引起来的部分,叫做字符串常量. 例如:"abc","Hello","12 ...

  8. 设置$.post,$.get,$.ajax 全局同异步

    $.ajaxSetup({ async: false//or true });

  9. fail fast和fail safe策略

    优先考虑出现异常的场景,当程序出现异常的时候,直接抛出异常,随后程序终止 import java.util.ArrayList; import java.util.Collections; impor ...

  10. .net Dapper 实践系列(6) ---事务删除(Layui+Ajax+Dapper+MySQL)

    目录 写在前面 实现步骤 写在最后 写在前面 上一小节,总结了事务多表更新的两种方法.一个是只更新原来的数据,一个是先删除原来的数据再往里面添加新的数据.而这一小节,说的是事务的多表删除. 实现步骤 ...