poj 1436 Horizontally Visible Segments(선분 트리 구간의 덮어쓰기 관계식)
Time Limit: 5000MS
Memory Limit: 65536K
Total Submissions: 1942
Accepted: 736
Description
There is a number of disjoint vertical line segments in the plane. We say that two segments are horizontally visible if they can be connected by a horizontal line segment that does not have any common points with other vertical segments. Three different vertical segments are said to form a triangle of segments if each two of them are horizontally visible. How many triangles can be found in a given set of vertical segments?
Task
Write a program which for each data set:
reads the description of a set of vertical segments,
computes the number of triangles in this set,
writes the result.
Input
The first line of the input contains exactly one positive integer d equal to the number of data sets, 1 <= d <= 20. The data sets follow.
The first line of each data set contains exactly one integer n, 1 <= n <= 8 000, equal to the number of vertical line segments.
Each of the following n lines consists of exactly 3 nonnegative integers separated by single spaces:
yi', yi'', xi - y-coordinate of the beginning of a segment, y-coordinate of its end and its x-coordinate, respectively. The coordinates satisfy 0 <= yi' < yi'' <= 8 000, 0 <= xi <= 8 000. The segments are disjoint.
Output
The output should consist of exactly d lines, one line for each data set. Line i should contain exactly one integer equal to the number of triangles in the i-th data set.
Sample Input
1
5
0 4 4
0 3 1
3 4 2
0 2 2
0 2 3
Sample Output 1
Source Central Europe 2001
제목:http://poj.org/problem?id=1436
제목: n개의 수직 라인을 드리겠습니다. 이 라인들은 교차하지 않습니다. 만약에 두 라인이 직접 존재한다면 수평선이 이 두 라인과 연결될 수 있고 다른 라인과 교차하지 않습니다. 우리는 두 라인이 볼 수 있다고 말했습니다. 모두 몇 개의 세 라인이 두 개의 라인을 볼 수 있는지...
분석: 이 문제는 당연히 위에서 아래로의 스캐닝 라인에 정렬 등을 추가하여 해결할 수 있다. 그러나 이 문제의 라인 트리 작성법은 여전히 아날로그 구간의 덮어쓰기이다. 이 문제는 덮어쓰기를 요구하는 관계이다. 처음에 나는 라인 트리를 업데이트할 때 덮어쓰기 관계를 판단하고 덮어쓰기를 할 수 있다고 생각했다. 마지막으로 전체 나무를 훑어보고 모든 덮어쓰기 관계를 찾아낼 수 있다고 생각했다. 그러나 이것은 틀렸다.왜냐하면 이전에 그 구간을 찾지 못했기 때문에 덮인 구간이 교체되었기 때문이다...
정확한 방법은 매번 이 구간을 찾아 그 구간을 덮어쓴 다음에 그것을 라인 트리에 추가하면 이전의 오류를 피할 수 있다.이제 라인이 보이는지 여부의 관계도를 얻었고, 폭력적으로 세 개의 라인을 일일이 열거했다...할 수 없는 걸 샅샅이 뒤지는 것 같아요.
코드:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int mm=16666;
struct seg
{
int l,r,x;
}g[mm];
int head[mm],flag[mm],ver[mm<<8],next[mm<<8];
int dly[mm<<2];
int edge,ans;
bool cmp(seg a,seg b)
{
return a.x<b.x;
}
void prepare()
{
edge=0;
memset(head,-1,sizeof(head));
memset(dly,0,sizeof(dly));
memset(flag,0,sizeof(flag));
}
void addedge(int u,int v)
{
ver[edge]=v,next[edge]=head[u],head[u]=edge++;
}
void pushdown(int rt)
{
dly[rt<<1]=dly[rt<<1|1]=dly[rt];
dly[rt]=0;
}
void updata(int L,int R,int id,int l,int r,int rt)
{
if(L<=l&&R>=r)
{
dly[rt]=id;
return;
}
if(dly[rt])pushdown(rt);
int m=(l+r)>>1;
if(L<=m)updata(L,R,id,lson);
if(R>m)updata(L,R,id,rson);
}
void query(int L,int R,int id,int l,int r,int rt)
{
if(dly[rt])
{
if(flag[dly[rt]]!=id)
addedge(dly[rt],flag[dly[rt]]=id);
return;
}
if(l==r)return;
int m=(l+r)>>1;
if(L<=m)query(L,R,id,lson);
if(R>m)query(L,R,id,rson);
}
int main()
{
int i,j,k,v,n,cs;
scanf("%d",&cs);
while(cs--)
{
scanf("%d",&n);
for(i=0;i<n;++i)
{
scanf("%d%d%d",&g[i].l,&g[i].r,&g[i].x);
g[i].l<<=1,g[i].r<<=1;
}
sort(g,g+n,cmp);
prepare();
for(i=0;i<n;++i)
query(g[i].l,g[i].r,i+1,0,mm,1),
updata(g[i].l,g[i].r,i+1,0,mm,1);
ans=0;
for(i=1;i<=n;++i)
for(j=head[i];j>=0;j=next[j])
for(k=next[j];k>=0;k=next[k])
{
for(v=head[ver[j]];v>=0;v=next[v])
if(ver[v]==ver[k])break;
if(v<0)
for(v=head[ver[k]];v>=0;v=next[v])
if(ver[v]==ver[j])break;
if(v>=0)++ans;
}
printf("%d
",ans);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Ruby의 구조체 클래스은 접근자 메서드가 있는 속성 모음입니다. 클래스를 명시적으로 작성할 필요 없이. Struct 클래스는 구성원 및 해당 값 집합을 포함하는 새 하위 클래스를 생성합니다. 각 멤버에 대해 #attr_accessor 와...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.