Google Code Jam 2010 Round 1C Problem A. Rope Intranet

本文介绍了 Google Code Jam 2010 中的一个经典算法问题——绳网交叉问题,并提供了详细的解析及 C++ 实现代码。该问题涉及计算两座大楼间电线的交叉点数量,通过分析电线连接方式,给出了一种有效的解决方案。
Google Code Jam 2010 Round 1C Problem A. Rope Intranet
https://code.google.com/codejam/contest/619102/dashboard#s=p0

Problem A. Rope Intranet

A company is located in two very tall buildings. The company intranet connecting the buildings consists of many wires, each connecting a window on the first building to a window on the second building.

You are looking at those buildings from the side, so that one of the buildings is to the left and one is to the right. The windows on the left building are seen as points on its right wall, and the windows on the right building are seen as points on its left wall. Wires are straight segments connecting a window on the left building to a window on the right building.

You've noticed that no two wires share an endpoint (in other words, there's at most one wire going out of each window). However, from your viewpoint, some of the wires intersect midway. You've also noticed that exactly two wires meet at each intersection point.

On the above picture, the intersection points are the black circles, while the windows are the white circles.

How many intersection points do you see?

Input

The first line of the input gives the number of test cases, TT test cases follow. Each case begins with a line containing an integer N, denoting the number of wires you see.

The next N lines each describe one wire with two integers Ai and Bi. These describe the windows that this wire connects: Ai is the height of the window on the left building, and Biis the height of the window on the right building.

Output

For each test case, output one line containing "Case #x: y", where x is the case number (starting from 1) and y is the number of intersection points you see.

Limits

1 ≤ T ≤ 15.
1 ≤ Ai ≤ 104.
1 ≤ Bi ≤ 104.
Within each test case, all Ai are different.
Within each test case, all Bi are different.
No three wires intersect at the same point.

Small dataset

1 ≤ N ≤ 2.

Large dataset

1 ≤ N ≤ 1000.

Sample


Input 
 

Output 
 
2
3
1 10
5 5
7 7
2
1 1
2 2
Case #1: 2
Case #2: 0

 

Solution:

vector<int> linesL;
vector<int> linesR;

int solve()
{
    int L1, R1, L2, R2, is = 0;
    int count = (int)linesL.size();
    for (int i = 0; i < count; i++) {
        L1 = linesL[i]; R1 = linesR[i];
        for (int j = i; j < count; j++) {
            L2 = linesL[j]; R2 = linesR[j];
            
            if ((L1 < L2 && R1 > R2) || (L1 > L2 && R1 < R2)) {
                is++;
            }
        }
    }
    
    return is;
}

int main()
{
    freopen("in.in", "r", stdin);
    freopen("out.out", "w", stdout);
    
    int T;
    scanf("%d\n", &T);
    if (!T) {
        cerr << "Check input!" << endl;
        exit(0);
    }
    
    for (int t = 1; t <= T; t++) {
        cerr << "solving: #" << t << " / " << T << endl;
        
        linesL.clear();
        linesR.clear();
        
        int lc;
        scanf("%d\n", &lc);
        
        for (int l = 0; l < lc; l++) {
            int lL, lR;
            scanf("%d %d\n", &lL, &lR);
            linesL.push_back(lL);
            linesR.push_back(lR);
        }
        
        auto result = solve();
        printf("Case #%d: %d\n", t, result);
    }
    
    fclose(stdin);
    fclose(stdout);
    return 0;
}

 


转载于:https://www.cnblogs.com/fatlyz/p/3678805.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值