⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1558.txt

📁 杭电acm解题报告2001---2099.
💻 TXT
字号:
#include <cstdio>
#include <memory>
//using namespace std;
const int Max=1100;

int Parent[Max],Rank[Max],set[Max];
struct Point
{
    double x,y;
}line[Max][2];

bool insertLine(Point a,Point c,Point b,Point d)
{
    double t1,t2, num1, num2,num3,num4;
    num1  = (a.y - c.y)*(d.x - c.x) - (a.x - c.x)*(d.y - c.y);//(d-c)**(a-c)
    num2  = (a.y - c.y)*(b.x - c.x) - (a.x - c.x)*(b.y - c.y);//(b-c)**(a-c)
    
    num3  = (d.y - b.y)*(a.x - b.x) - (d.x - b.x)*(a.y - b.y);//(d-b)**(a-b)
    num4  = (c.x - b.x)*(d.y - b.y) - (c.y - b.y)*(d.x - b.x);//(d-b)**(c-b)
    
    t1=num1*num2;
    t2=num3*num4;
    if( t1<=0 && t2<=0)
        return true;
    else
        return false;
}

int Find(int x)
{
    int temp=x;
    int root,w;
    
    while(Parent[x]!=0)   //搜寻根节点
        x=Parent[x];
    root=x;
    x=temp;
    while(Parent[x]!=0)  //压缩路径
    {
        w=Parent[x];
        Parent[x]=root;
        x=w;
    }
    return root;
}

int Union(int x,int y)
{
    int u,v;
    int root;
    
    u=Find(x);
    v=Find(y);
    if(u==v)    return 0;
    if(Rank[u]<=Rank[v])
    {
        root=Parent[u]=v;
        set[root] += set[u];
        if(Rank[u]==Rank[v])
            Rank[v]++;
    }
    else
        root=Parent[v]=u , set[root] += set[v];;
        
    return root;
}

int main()
{
    int t,n,i,j,seg,k;
    char cmd;
    scanf("%d",&t);
    while(t--)
    {
        memset(Parent,-1,sizeof(Parent));
        memset(Rank,0,sizeof(Rank));
        memset(set,0,sizeof(set));
        k=1;
        scanf("%d",&n);
        for(i=1;i<=n;i++)
        {
            getchar();
            cmd=getchar();
            if(cmd=='P')
            {
                scanf("%lf %lf %lf %lf",&line[k][0].x,&line[k][0].y,&line[k][1].x,&line[k][1].y);
                Parent[k]=0;    set[k]++;
                for(j=1;j<k;j++)
                {
                    if( insertLine(line[k][0],line[k][1],line[j][0],line[j][1]) )
                    {
                        Union(k,j);
                    }
                }
                k++;
            }
            else
            {
                scanf("%d",&seg);
                printf("%d\n",set[ Find(seg) ]);
            }
        }
        if(t!=0)
            printf("\n");
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -