王国军总指挥——卡西乌斯准将决定重建情报局,需要从全国各地挑选有能力的士兵,选择的标准为A,B两种能力。对于每个候选士兵,如果存在另一名士兵的两项能力均大于等于他,那么他将被淘汰。(注意:若两名士兵两项能力均相等,则认为排在后面被淘汰)。

可以认为,能力差别不大的士兵更适合在一个队伍中。(我们这样定义能力差别:设士兵i的A,B能力值为ai,bi,士兵j的A,B能力值为aj,bj,那么他们的能差别为|ai-aj|+|bi-bj|)

对于每个未被淘汰的士兵,只要某队伍中有另一个和他能力差别不大于k的士兵,他就可以加入该队伍。

现在,卡西乌斯想在符合以上条件的前提下,挑选出人数最多的队伍担当重任。

输入:第1行: 2个用空格隔开的整数:n和k ,其中n表示候选士兵总数,k如题意所述。

第2..n+1行: 第i+1行用2个以空格隔开整数ai和bi,分别表示第i个士兵A,B两种能力的能力值。

输出:只有1个整数,表示最多人数。

样例输入:5 3

2 11

4 10

3 9

1 12

6 8

样例输出:3

数据范围:20% 的数据1<=n<=1000

40% 的数据 未被淘汰的士兵总数不会多于3000人。

100%的数据.1<=n<=100000,其余数据在[0,100000000]。

感觉这题挺好的...无论是思想还是方法

题解应该说复杂了,其实这题想明白了就是傻逼题(哪题想明白了不是傻逼题?)...并没有必要用上并查集

先说说这题要我们解决的第一个问题:如果判断哪些点是可以留下来的?

根据题意,我们知道要满足没有任何一个点的横坐标和纵坐标大于等于那个点,那个点就可以留下来

要判断这两个条件看起来似乎很难,除非你打暴力我没话说

我们可以先考虑一维的情况,我们当然知道是排序一遍即可;

其实二维的也一样,我们把所有的点按照x坐标排序(假设是按从大到小排序好了)

我们可以确定,前面的点一定不可能被后面的点淘汰对吧(因为前面的x比后面的点的x大,如果是等于的情况,可任意删掉一个点,可以删掉后面的点为准)

现在的问题是,我们如何判断后面的点的y也小于前面的点的y

其实也很简单,我们不断更新最大的y,比较后面的点和当前最大y的大小即可;

接下来,第二个问题,如果判断集合最多的人数呢?

我们试着在纸上画出所有留下来的点,会发现什么神奇的性质呢?

所有的点形成的直线,是一条下降的曲线!(按x从大到小排序的情况,而且留下来的点,y是呈逐渐递增的)

这个性质有什么用呢?

我们整理一下留下来的点(还是按x从大到小排序)

如果后面的点,一定不和它前面一个点的距离满足小于等于k,那么我们是不是就可以知道它一定不在前面的集合里?它后面的点更不可能在前面的集合了(自己仔细想想就知道了)

那这样是不是直接扫一遍,不断更新最大的集合的个数就可以了

附上代码:(代码本身是按x从小到大排序,反正没有太大的区别)

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<queue>
#include<cmath>
#include<map>
#include<set>
#include<cstdlib>
using namespace std;
const int INF = 2147483647,maxn = 100005; struct node{
int x,y;
bool operator <(const node &a)const{
return x==a.x?y<a.y:x<a.x;
}
}a[maxn]; node b[maxn];
int n,ans,k; inline int solve(int x,int y){
return abs(b[x].x-b[y].x)+abs(b[x].y-b[y].y);
} int main(){
//freopen("data","r",stdin);
freopen("troops.in","r",stdin);
freopen("troops.out","w",stdout);
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%d%d",&a[i].x,&a[i].y);
sort(a+1,a+n+1);
int Max = a[n].y,tmp = 0,t = 1;
b[++tmp] = a[n];
for(int i=n-1;i;i--)
if(Max<a[i].y)Max = a[i].y,b[++tmp] = a[i];
for(int i=2;i<=tmp;i++){
if(solve(i,i-1)<=k)t++;else ans = max(ans,t),t = 1;
}
ans = max(ans,t);
cout<<ans;
return 0;
}

  

noip模拟赛:部队[技巧?思想?]的更多相关文章

  1. NOI.AC NOIP模拟赛 第一场 补记

    NOI.AC NOIP模拟赛 第一场 补记 candy 题目大意: 有两个超市,每个超市有\(n(n\le10^5)\)个糖,每个糖\(W\)元.每颗糖有一个愉悦度,其中,第一家商店中的第\(i\)颗 ...

  2. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  3. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  4. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  5. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  6. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  7. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

  8. 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...

  9. CH Round #58 - OrzCC杯noip模拟赛day2

    A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...

  10. CH Round #52 - Thinking Bear #1 (NOIP模拟赛)

    A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...

随机推荐

  1. Codeforces Round #266 (Div. 2)-C,D

    C - Number of Ways 直接暴力从前往后寻找.假设找到1/3sum的位置,那么标记++.找到2/3的位置,总数加上标记数. #include<stdio.h> #includ ...

  2. 一个数据表对象(NSManagedObject)加入排序

    eg:数据库表对象 @interface Meditation : NSManagedObject @property (nonatomic, retain) NSString * order;//用 ...

  3. 使用 Eclipse 的 SVN 主要插件创建项目/支/标签

    原文 阅读 Mark Phippard 该博客以及<Subversion 与版本号控制>之后,我了解到 分支/标签 是 SVN 非常棒的特性之中的一个.但我在使用推荐的 "tru ...

  4. mac github工具将命令当下来的代码拖入macgithub中就可以

    mac github工具将命令当下来的代码拖入macgithub中就可以,刚開始傻傻的就知道点击那个加入button,总是在当下来的文件夹下创建个文件夹.并且代码不能同步

  5. jg-table 过程2 ( jgTable )

    jg-table ( jgTable )  添加一些新的功能,这是多行表头支持,要添加到,现在支持拖放多行表来改变头部的宽度, 假设设置cloneTheadToFoot 能够自己主动翻转多行表头,这也 ...

  6. C#中设计Fluent API

    C#中设计Fluent API 我们经常使用的一些框架例如:EF,Automaper,NHibernate等都提供了非常优秀的Fluent API, 这样的API充分利用了VS的智能提示,而且写出来的 ...

  7. [Unity3D]Unity3D连衣裙实现游戏开发系统

    大家好,我是秦培.欢迎关注我的博客,我的博客地址">blog.csdn.net/qinyuanpei. 不知从什么时候開始,国产RPG单机游戏開始出现换装,仙剑系列中第一部实现了换装的 ...

  8. Git基础教程

    Git是一个分布式的版本控制工具,本篇文章从介绍Git开始,重点在于介绍Git的基本命令和使用技巧,让你尝试使用Git的同时,体验到原来一个版 本控制工具可以对开发产生如此之多的影响,文章分为两部分, ...

  9. MVC5 + EF6 + Bootstrap3-10

    MVC5 + EF6 + Bootstrap3 (10) 数据查询页面 上一节:MVC5 + EF6 + Bootstrap3 (9) HtmlHelper用法大全(下) 源码下载:点我下载 目录 前 ...

  10. java 转成字符串 json 数组和迭代

    当你需要转成一串一串的json 排列 .当内容和遍历它们. 首页进口 net.sf.json.JSONArray和net.sf.json.JSONObject 两个jar 包 String str = ...