• hdu1542 线段树+扫描线+离散化


    仅仅想说题目给的欲实际不服     还是这类型的水题吧   建议看之前我写的那个



    #include<stdio.h>

    #include<string.h>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    #define LL(x) (x<<1)
    #define RR(x) ((x<<1)|1)


    int n;
    struct node
    {
    double y;
    int x1,x2;
    int flash;
    }A[31000];
    struct Node
    {
    int ii;
    double x;
    }change[35000];
    int cmp1(Node a,Node b)
    {
    return a.x<b.x;
    }
    int cmp2(node a,node b)
    {
    return a.y<b.y;
    }
    int num[80000];
    double map[31000];
    int update(int L,int R,int left,int right,int k,int mark)
    {
    int mid=(L+R)/2;
    if(L==left&&right==R)
    {
    if(num[mark]!=-1)
    {
    num[mark]+=k;
    return 0;
    }
    update(L,mid,L,mid,k,LL(mark));
    update(mid,R,mid,R,k,RR(mark));
    if(num[LL(mark)]==num[RR(mark)]) num[mark]=num[LL(mark)];
    else num[mark]=-1;
    }
    else
    {
    if(num[mark]>=0)
    {
    num[LL(mark)]=num[RR(mark)]=num[mark];
    }
    if(right<=mid)
    {
    update(L,mid,left,right,k,LL(mark));
    }
    else if(left>=mid)
    {
    update(mid,R,left,right,k,RR(mark));
    }
    else
    {
    update(L,mid,left,mid,k,LL(mark));
    update(mid,R,mid,right,k,RR(mark));
    }
    if(num[LL(mark)]==num[RR(mark)]) num[mark]=num[LL(mark)];
    else num[mark]=-1;
    }
    return 0;
    }
    double find(int L,int R,int mark)
    {
    double Long=0;
    if(num[mark]>=1)
    {
    Long+=map[R]-map[L];
    return Long;
    }
    if(num[mark]==0) return 0;
    int mid=(L+R)/2;
    Long+=find(L,mid,LL(mark))+find(mid,R,RR(mark));
    return Long;
    }
    int main()
    {
    int i,j,d=1;
    double x1,y1,x2,y2;
    while(~scanf("%d",&n),n)
    {
    n*=2;
    //j=0;
    memset(A,0,sizeof(A));
    memset(map,0,sizeof(map));
    memset(change,0,sizeof(change));
    for(i=1;i<=n;i+=2)
    {
    scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
    A[i].y=y1;
    A[i].flash=1;
    A[i+1].y=y2;
    A[i+1].flash=-1;
    change[i].x=x1;
    change[i+1].ii=change[i].ii=i;
    change[i+1].x=x2;

    int leap[10000];
    memset(leap,0,sizeof(leap));
    sort(change+1,change+1+n,cmp1);
    int j=0;
    double k=-1;
    for(i=1;i<=n;i++)
    {
    if(change[i].x!=k)
    {
    k=change[i].x;
    ++j;
    map[j]=change[i].x;
    }
    if(leap[change[i].ii]==0)
    {
    A[change[i].ii].x1=A[change[i].ii+1].x1=j;
    leap[change[i].ii]=1;
    }
    else  A[change[i].ii].x2=A[change[i].ii+1].x2=j;
    }
    sort(A+1,A+1+n,cmp2);
    memset(num,0,sizeof(num));
    update(1,j,A[1].x1,A[1].x2,1,1);
    double area=0;
    for(i=2;i<=n;i++)
    {    
    area+=find(1,j,1)*(A[i].y-A[i-1].y);
    if(A[i].flash==1)
    update(1,j,A[i].x1,A[i].x2,1,1);
    else update(1,j,A[i].x1,A[i].x2,-1,1);
    }
    printf("Test case #%d ",d++);
    printf("Total explored area: %.2lf ",area);
    printf(" ");
    }
    return 0;
    }
  • 相关阅读:
    Python中的sort()方法使用基础
    centos修改时区shanghai
    const 关键字修饰指针
    多主题
    多语言(国际化)
    动画
    字符编码
    .vscode/extensions.json 是项目用到的 插件 推荐列表,项目应该将此配置 写入用到的插件
    end_of_line = lf 选择行尾序列 .editorconfig 老项目不动代码存盘 文件变动 CRLF 的问题 vscode
    vetur 和 volar 不要一起装 vscode插件 已解决
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/7115895.html
Copyright © 2020-2023  润新知