题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1084

题解:不妨设dp[i] 表示考虑到第i个点时最少有几组那么

if a[i]-a[i-j]<=2*k (j>=2)

then dp[i]=min(dp[i],dp[i-j]+1)。所以先要排序,然后用二分找到最小的j然后用线段树或者其他的方法查询(i-1~i-j)的最小值。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#define inf 0X3f3f3f3f
using namespace std;
const int M = 1e5 + 10;
struct TnT {
int l , r , Min;
}T[M << 2];
void push_up(int i) {
T[i].Min = min(T[i << 1].Min , T[(i << 1) | 1].Min);
}
void build(int l , int r , int i) {
int mid = (l + r) >> 1;
T[i].l = l , T[i].r = r , T[i].Min = inf;
if(l == r) return ;
build(l , mid , i << 1);
build(mid + 1 , r , (i << 1) | 1);
push_up(i);
}
void update(int pos , int i , int num) {
int mid = (T[i].l + T[i].r) >> 1;
if(T[i].l == pos && T[i].r == pos) {
T[i].Min = num;
return ;
}
if(mid < pos) update(pos , (i << 1) | 1 , num);
else update(pos , i << 1 , num);
push_up(i);
}
int query(int l , int r , int i) {
int mid = (T[i].l + T[i].r) >> 1;
if(T[i].l == l && T[i].r == r) {
return T[i].Min;
}
if(mid < l) return query(l , r , (i << 1) | 1);
else if(mid >= r) return query(l , r , i << 1);
else return min(query(l , mid , i << 1) , query(mid + 1 , r , (i << 1) | 1));
}
int dp[M] , a[M] , n , k;
int binsearch(int l , int r , int num) {
int mid = (l + r) >> 1;
int ans = inf;
while(l <= r) {
mid = (l + r) >> 1;
if(num - a[mid] <= 2 * k) {
ans = mid;
r = mid - 1;
}
else l = mid + 1;
}
return ans;
}
int main() {
int t , Case = 0;
scanf("%d" , &t);
while(t--) {
scanf("%d%d" , &n , &k);
for(int i = 1 ; i <= n ; i++) scanf("%d" , &a[i]);
sort(a + 1 , a + 1 + n);
memset(dp , inf , sizeof(dp));
dp[0] = 0;
printf("Case %d: " , ++Case);
if(n < 3) {
printf("-1\n");
continue;
}
build(0 , n , 1);
update(0 , 1 , 0);
for(int i = 3 ; i <= n ; i++) {
if(a[i] - a[i - 2] <= 2 * k) {
int pos = i - 3;
int gg = binsearch(1 , i - 3 , a[i]);
pos = min(gg - 1 , pos);
int gl = query(pos , i - 3 , 1);
dp[i] = min(gl + 1 , dp[i]);
update(i , 1 , dp[i]);
}
}
if(dp[n] == inf) printf("-1\n");
else printf("%d\n" , dp[n]);
}
return 0;
}

lightoj 1084 - Winter(dp+二分+线段树or其他数据结构)的更多相关文章

  1. HDU4614 Vases and Flowers 二分+线段树

    分析:感觉一看就是二分+线段树,没啥好想的,唯一注意,当开始摆花时,注意和最多能放的比大小 #include<iostream> #include<cmath> #includ ...

  2. J - Joseph and Tests Gym - 102020J (二分+线段树)

    题目链接:https://cn.vjudge.net/contest/283920#problem/J 题目大意:首先给你n个门的高度,然后q次询问,每一次询问包括两种操作,第一种操作是将当前的门的高 ...

  3. Educational Codeforces Round 61 D 二分 + 线段树

    https://codeforces.com/contest/1132/problem/D 二分 + 线段树(弃用结构体型线段树) 题意 有n台电脑,只有一个充电器,每台电脑一开始有a[i]电量,每秒 ...

  4. 【BZOJ-3110】K大数查询 整体二分 + 线段树

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6265  Solved: 2060[Submit][Sta ...

  5. hdu6070 Dirt Ratio 二分+线段树

    /** 题目:hdu6070 Dirt Ratio 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6070 题意:给定n个数,求1.0*x/y最小是多少.x ...

  6. K-th occurrence HDU - 6704 (后缀数组+二分线段树+主席树)

    大意: 给定串s, q个询问(l,r,k), 求子串s[l,r]的第kk次出现位置. 这是一篇很好的题解: https://blog.csdn.net/sdauguanweihong/article/ ...

  7. 4.11 省选模拟赛 序列 二分 线段树优化dp set优化dp 缩点

    容易想到二分. 看到第一个条件容易想到缩点. 第二个条件自然是分段 然后让总和最小 容易想到dp. 缩点为先:我是采用了取了一个前缀最小值数组 二分+并查集缩点 当然也是可以直接采用 其他的奇奇怪怪的 ...

  8. LightOJ 1085(树状数组+离散化+DP,线段树)

    All Possible Increasing Subsequences Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format: ...

  9. luogu2282/bzoj1219 历史年份 (dp+hash+二分+线段树)

    luogu1415 拆分数列的加强版 先考虑弱化版怎么做 设f[i]表示某一串数,最后一个数的右端点是i时,它的左端点的最大值(也就是说,这一串数的最后一个数尽量小) 那么有$f[j]=max\{i+ ...

随机推荐

  1. 【Java】You have an error in your SQL syntax ...

    详情如下: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server v ...

  2. Spring Boot @Condition 注解,组合条件你知道吗

    上一篇文章 你应该知道的 @ConfigurationProperties 注解的使用姿势,这一篇就够了 介绍了如何通过 @ConfigurationProperties 注解灵活读取配置属性,这篇文 ...

  3. codeforces 371 C-Hamburgers

    一个乱七八糟的故事背景,可以练练英语阅读. 大概的意思是Polycarpus喜欢汉堡,现在他有你ns片香肠片,nb面包,nc块起司,有r卢布,每种东西都有价格,如果不够他可以去商店买(商店里面各种东西 ...

  4. ssm 搭建项目各项配置

    首先配置 pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&quo ...

  5. JavaFX 选择文件 导入Excel文件并解析

    FXML 控制器 : @FXML public void selectExcel(MouseEvent event) { FileChooser fileChooser = new FileChoos ...

  6. 微信JSSDK签名

    微信JS-SDK说明文档 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115 生成签名 1.签名规则 参与签名的 ...

  7. CodeForces 938E Max History 题解

    参考自:https://blog.csdn.net/dreaming__ldx/article/details/84976834 https://blog.csdn.net/acterminate/a ...

  8. js常见兼容性问题以及解决方法

    1.关于使用 event对象,出现的兼容性问题IE/Chrom: event.clientX;event.clientYFF/IE9以上/Chrom: 传参e   e.clientX;e.client ...

  9. Liunx之nginx代理

    一.代理 正向代理 正向代理,也就是传说中的代理,他的工作原理就像一个跳板(VPN),简单的说: 我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,他能访问那个我不能访问的 ...

  10. 01-WIN2012R2+SQL2016故障转移群集的搭建

    一.前期准备  1.1.准备4台机器 机器名 IP 功能 jf-yukong 192.168.10.200 做域控服务器 Jf-storage 192.168.10.201 做ISCSI存储服务器 J ...