题意:给定数组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. 内存泄漏(Memory Leak)

    内存泄露检测工具Valgrind   内存泄露简介 回到顶部 什么是内存泄漏 内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因,程序未释放或无法释放,造成系统内存的浪费,导致 ...

  2. Docker在Windows上的初体验

    作为Docker的初学者,我有几个疑问,找到了答案,并实践了一下,希望对和我一样的初学者有帮助: 1.Docker是什么? 大家对虚拟机应该比较熟悉,虚拟机和docker都是为了实现隔离. 虚拟机隔离 ...

  3. day58——模板继承、组件、自定义标签和过滤器、inclusion_tag、静态文件配置、url别名和反向解析、url命名空间

    day58 模板相关 模板继承(母版继承) 1. 创建一个xx.html页面(作为母版,其他页面来继承它使用) 2. 在母版中定义block块(可以定义多个,整个页面任意位置) {% block co ...

  4. 简明 Java 错误处理机制

    用个最简单的例子来展示为什么需要错误处理,以及怎么用. import java.io.FileInputStream; import java.io.FileNotFoundException; pu ...

  5. Linux学习笔记之安装报错/lib/ld-linux.so.2: bad ELF interpreter

    0x00 64位系统中安装了32位程序解决办法 是因为64位系统中安装了32位程序 解决方法: yum install glibc.i686 0x01 解决交叉编译环境错误 yum install l ...

  6. mysql 中 and和or 一起使用和之间的优先级

    SELECT address,job_title,education,SUM(recruiting) FROM commerce_jobs WHERE education = '大专' and ( j ...

  7. jQuery中cookie的简单操作

    jQuery 可以通过 jquery.cookie.js 插件来操作 Cookie. 用NuGet安装:PM>Install-Package js-cookie -Version 官网:http ...

  8. 一张图看懂SharpCamera

    通过下面的图片,可以瞬间看懂整个类库的脉络.

  9. azure跨域问题(访问azure存储账户数据,blob)

    访问azure存储账户数据报错:405错误 解决方案 打开访问的存储账户--->CORS--->Blob服务 全部填写*就可以了,点击“保存”即可. iframe就可以展示blob中的pd ...

  10. Vertx的命令行

    IntelliJ----创建一个运行配置(Application), 用io.vertx.core.Launcher类作为主类,在程序参数输入:run your-verticle-fully-qual ...