hdu5714 思维+区间内线段最

原创 2016年06月01日 10:43:41

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5714


题目大意:给你n只小船,给你每个船的左端点和右端点,以及航行方向(左,右)和到岸边的距离,每个船的航行距离一样。如果有个人在岸边且只能垂直于岸边拍摄(与岸边呈45度角),问最多可以拍到多少只完整的小船。

思路:

1、首先,因为所有船只航速一样,所以同一方向的船只相对静止。

2、如果在l点可以拍摄到向右航行的船只数目为num1,在r点可以拍摄到向左航行的船只数量为num2,l<=r,那么一定存在某一时刻拍摄到的船只数量等于num1+num2.这个很好证明,两个同样的三角形相向而行,必定会重合。


3、如果有y-x>2z,则该船不可能出现在镜头中。如果y-x<=2z,那么该船可被拍摄的范围是(y-z,x+z),画个图就理解了。但是做的时候把范围搞成了(x+z , y-z)。。。显然错了


4、我们可以处理出所有船只可被拍摄的范围,然后求区间内线段个数最多的点。方法是左端点标记为1,右端点标记为-1,排序后从左到右扫描一遍,遇到1++,遇到-1--;

5、不同方向的船只分开处理。

复杂度nlogn。


#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <iomanip>

using namespace std;
//#pragma comment(linker, "/STACK:102400000,102400000")
#define maxn 1000005
#define MOD 1000000007
#define mem(a , b) memset(a , b , sizeof(a))
#define LL long long
#define ULL unsigned long long
const long long INF=0x3fffffff;

int n , t;
struct node
{
    int val , flag ,d;

} a[maxn] , b[maxn];

int ans[maxn];

bool cmp(node n1,node n2)
{
    if(n1.val != n2.val) return n1.val < n2.val;
    else if(n1.flag != n2.flag) return n1.flag > n2.flag;
    else return n1.d < n2.d;
}

int main()
{
    scanf("%d" , &t);
    int cas = 0;
    while(t--)
    {
        mem(ans , 0);
        scanf("%d" , &n);
        int x , y ,  z , d;
        int id1 = 0 , id2 = 0;
        for(int i = 0 ; i < n ; i ++)
        {
            scanf("%d %d %d %d" , &x , &y , &z , &d);
            x += 1000000;
            y += 1000000;
            if((y - x) > 2*z) continue;
            a[id1].val = x + z;
            a[id1].d = d;
            a[id1++].flag = -1;
            a[id1].val = y - z;
            a[id1].d = d;
            a[id1++].flag = 1;
        }
        sort(a , a + id1 , cmp);
        int ans1 = 0 ;
        int num = 0;
        for(int i = id1 - 1; i >= 0 ; i --)
        {
            if (a[i].d < 0 && a[i].flag == -1) num++;
            ans[i] = max(ans[i + 1], num);
            if (a[i].d < 0 && a[i].flag == 1) num--;
        }
        num = 0;
        for(int i = 0 ; i < id1 ; i ++)
        {
            if(a[i].d > 0)
            {
                if(a[i].flag == 1) num++;
                ans1 = max(ans1 , num + ans[i]);
                if(a[i].flag == -1) num--;
            }
        }
        printf("Case #%d:\n%d\n", ++cas, ans1);

    }
    return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

HDU 6048 思维+找规律

题意:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6048 给出一个n*m的方格,以及1到n*m-1的数字,一开始按照一定的规则选择每个数,从上到下...
  • Bahuia
  • Bahuia
  • 2017年07月28日 21:58
  • 444

HDU6040(思维题)

题意:通过题目所给函数求出a数组,然后根据b数组排a数组。ai必须是a数组中第(bi+1)大的数。 分析:先通过下标对b数组排序。然后扫一遍b数组,如果相邻两个位置b相同,那么就还选上一个a(因为n可...
  • nucshiyilang
  • nucshiyilang
  • 2017年07月25日 21:24
  • 743

HDU 5114 思维 + 数论

HDU 5114 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5114 题意: 两个球在一个矩形里面做完全弹性碰撞的运动,位置给出,速度恒为...
  • beihai2013
  • beihai2013
  • 2015年10月26日 20:50
  • 387

hdu5875(思维题)

Function Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Tot...
  • martinue
  • martinue
  • 2016年09月11日 13:31
  • 427

hdu 4898 LCP+贪心思维

题意:将一个字符串切成k块,使得字典序最大的那块最小。 ORZ  WJMZBMR,几行题解读了一天才懂。 快速比较两个子串的大小可以利用LCP(最长公共前缀),比较公共前缀的下一个字符的大小就够了。 ...
  • t1019256391
  • t1019256391
  • 2014年08月02日 13:02
  • 1226

HDU 4747 线段树+思维

点击打开链接 题意:给出一个数字序列,定义mex为一段序列中没有出现的最小的自然数,问所有的mex的和 思路:网络赛题目,为何感觉如此的难,对于200000的数列并且有多次的区间和,想是想到要用线...
  • Dan__ge
  • Dan__ge
  • 2016年04月30日 15:45
  • 2994

HDU 4747 Mex (线段树)

转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 题目:给出一个序列,mex{}表示集合中没有出现...
  • ACM_cxlove
  • ACM_cxlove
  • 2013年09月16日 22:52
  • 5778

POJ 3667 Hotel(线段树:区间覆盖,维护最大连续子区间)

POJ 3667 Hotel(线段树:区间合并) 分析:        首先本题类似于UVA1400 ,所有区间合并类的线段树基本都需要维护3类信息:最大区间,最大前缀,最大后缀.        维护...
  • u013480600
  • u013480600
  • 2014年03月28日 16:46
  • 1224

HDU-5714-拍照(区间线段覆盖)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5714 拍照 Time Limit: 6000/3000 MS (Java/Others) ...
  • qq978874169
  • qq978874169
  • 2016年06月02日 21:15
  • 271

hdu5700 区间交 思维

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5700 题目大意:  Problem Description 小A有一个含有n个非负整数的数列与...
  • qq_24477135
  • qq_24477135
  • 2016年06月10日 14:44
  • 204
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu5714 思维+区间内线段最
举报原因:
原因补充:

(最多只允许输入30个字)