hdu 3681 Prison Break 扫描线set

来源:互联网 发布:linux alias ll 编辑:程序博客网 时间:2024/06/06 21:43
set甚屌只能ORZ
#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<set>#include<iostream>#include<algorithm>using namespace std;const int maxn = 51111;const double eps = 1e-8;inline int dcmp(double x) {return (x > eps) + (x < -eps);}inline double Sqr(double x) {return x * x;}int LineNow, ltp, n, cnt[maxn];struct Cir//圆{    int x;    int y;    int r;}c[maxn];struct Line//从左向右扫描节点{    int id;    bool in;    void Read(int id_, bool in_){id = id_, in = in_;}    inline int GetSite()const{return c[id].x + (in ? -c[id].r : c[id].r);}    bool operator<(const Line &b)const{return GetSite() < b.GetSite();}}l[maxn << 1];struct Node//从上至下排序节点{    int id;    bool up;    Node(){}    Node(int id_, bool up_){id = id_, up = up_;}    inline double GetSite()const    {return c[id].y + sqrt(Sqr(c[id].r) - Sqr(LineNow - c[id].x)) * (up ? 1 : -1);}    bool operator<(const Node &b)const    {        double y1 = GetSite();        double y2 = b.GetSite();        return dcmp(y1 - y2) ? y1 > y2 : up > b.up;    }};set<Node> s;set<Node>::iterator iti, itn;void ReadData(int n){    int i;    for(ltp = i = 0; i < n; ++ i)    {        scanf("%d%d%d", &c[i].x, &c[i].y, &c[i].r);        l[ltp ++].Read(i, true);        l[ltp ++].Read(i, false);    }}int MakeAns(){    int i, ans = 0;    sort(l, l + ltp);    s.clear();    for(i = 0; i < ltp; ++ i)    {        LineNow = l[i].GetSite();        if(!l[i].in)        {            s.erase(Node(l[i].id, true));            s.erase(Node(l[i].id, false));        }        else        {            iti = itn = s.insert(Node(l[i].id, true)).first;int time=(*iti).GetSite();            itn ++;            if(iti == s.begin() || itn == s.end()) cnt[l[i].id] = 1;            else            {                iti --;                if((*iti).id == (*itn).id) cnt[l[i].id] = cnt[(*iti).id] + 1;                else cnt[l[i].id] = max(cnt[(*iti).id], cnt[(*itn).id]);            }            ans = max(ans, cnt[l[i].id]);            s.insert(Node(l[i].id, false));        }    }    return ans;}int main(){    while(scanf("%d", &n) != EOF)    {        ReadData(n);        printf("%d\n", MakeAns());    }    return 0;}

0 0
原创粉丝点击