POJ 2653 Pick-up sticks

知道是个计算几何的模板题,感觉思路也没问题,暴力超时好无奈。。

待解决中...........

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <deque>
#include <list>
#include <cctype>
#include <algorithm>
#include <climits>
#include <queue>
#include <stack>
#include <cmath>
#include <map>
#include <set>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#define ll long long
#define ull unsigned long long
#define all(x) (x).begin(), (x).end()
#define clr(a, v) memset( a , v , sizeof(a) )
#define pb push_back
#define mp make_pair
#define read(f) freopen(f, "r", stdin)
#define write(f) freopen(f, "w", stdout)
using namespace std;
const double eps = 1e-8;

int cmp ( double x )
{
    if ( fabs(x) < eps ) {
        return 0;
    }
    if ( x > 0 ) return 1;
    else return -1;
}

inline double sqr ( double x )
{
    return x * x;
}

struct point {
    double x, y;
    point() {}
    point(double a, double b):x(a), y(b) {}
    void input()
    {
        scanf ( "%lf%lf", &x, &y );
    }
    friend point operator + ( const point &a, const point &b )
    {
        return point( a.x + b.x, a.y + b.y );
    }
    friend point operator - ( const point &a, const point &b )
    {
        return point( a.x - b.x, a.y - b.y );
    }
    friend point operator * ( const point &a, const double &b )
    {
        return point( a.x * b, a.y * b );
    }
    friend point operator * ( const double &a, const point &b )
    {
        return point ( a * b.x, a * b.y );
    }
    friend point operator / ( const point &a, const double &b )
    {
        return point( a.x / b, a.y / b );
    }
    double norm()
    {
        return sqrt(sqr(x) + sqr(y));
    }
};

struct line {
    point a;
    point b;
    line() {}
    line( point x, point y ) : a(x), b(y) {}
};

inline double dot ( const point &a, const point&b )
{
    return a.x * b.x + a.y * b.y;
}

inline double det( const point &a, const point &b )
{
    return a.x * b.y - a.y * b.x;
}

inline bool parallel ( line a, line b )
{
    return ! cmp( det( a.a - a.b, b.a - b.b ) );
}

inline bool line_make_point( line a, line b, point& res )
{
    if ( parallel(a,b) )
        return false;
    double s1 = det ( a.a - b.a, b.b - b.a );
    double s2 = det ( a.b - b.a, b.b - b.a );
    res = ( s1 * a.b - s2 * a.a ) / ( s1 - s2 );
    return true;
}

inline bool line_make_point( line a, line b ) {
    if ( parallel(a,b) )
        return false;
    return true;
}

inline bool PointOnSegment ( point p, point s, point t )
{
    return cmp ( det ( p - s, t - s ) ) == 0 && cmp ( dot ( p - s, p - t ) ) <= 0;
}

line num[100005];
bool vis[100005];

inline bool place ( int i, int j ) {
    int x1 = num[i].a.x;
    int x2 = num[i].b.x;
    int x3 = num[j].a.x;
    int x4 = num[j].b.x;
    if ( x1 < min( x3, x4 ) && x2 < min ( x3, x4 ) ) return false;
    if ( x3 < min( x1, x2 ) && x4 < min ( x1, x2 ) ) return false;
    x1 = num[i].a.y;
    x2 = num[i].b.y;
    x3 = num[j].a.y;
    x4 = num[j].b.y;
    if ( x1 < min( x3, x4 ) && x2 < min ( x3, x4 ) ) return false;
    if ( x3 < min( x1, x2 ) && x4 < min ( x1, x2 ) ) return false;
    return true;
}



int main()
{
    //ios::sync_with_stdio( false );
    int n;
    while ( scanf ( "%d", &n ) && n ) {
        clr ( vis, 1 );
        clr ( num, 0 );
        for ( int i = 0; i < n; i ++ ) {
            num[i].a.input();
            num[i].b.input();
        }
        for ( int i = n - 1; i >= 0; i -- ) {
            for ( int j = i - 1; j >= 0; j -- ) {
                point tmp;
                if ( ! vis[j] ) continue;
                if ( place( i, j ) ) {
                    vis[j] = 0;
                }
                if ( line_make_point ( num[i], num[j], tmp ) ) {
                    cout << i << ' ' << j << endl;
                    if ( PointOnSegment( tmp, num[i].a, num[i].b ) && PointOnSegment( tmp, num[j].a, num[j].b ) ) {
                        vis[j] = 0;
                        //break;
                        //cout << j << endl;
                    }
                }
            }
        }

        int ans[100000] = { 0 };
        int cnt = 0;
        for ( int i = 0; i < n; i ++ ) {
            if ( vis[i] ) {
                ans[cnt++] = i + 1;
            }
        }
        //int len = ans.size();
        printf ( "Top sticks: " );
        //cout << "Top sticks: ";
        for ( int i = 0; i < cnt - 1; i ++ ) {
            printf ( "%d, ", ans[i] );
            //cout << ans[i] << ", ";
        }
        printf ( "%d.\n", ans[cnt-1] );
        //cout << ans[len-1] << "." << endl;
    }
    return 0;
}


资源下载链接为: https://pan.quark.cn/s/d9ef5828b597 在本文中,我们将探讨如何通过 Vue.js 实现一个带有动画效果的“回到顶部”功能。Vue.js 是一款用于构建用户界面的流行 JavaScript 框架,其组件化和响应式设计让实现这种交互功能变得十分便捷。 首先,我们来分析 HTML 代码。在这个示例中,存在一个 ID 为 back-to-top 的 div 元素,其中包含两个 span 标签,分别显示“回到”和“顶部”文字。该 div 元素绑定了 Vue.js 的 @click 事件处理器 backToTop,用于处理点击事件,同时还绑定了 v-show 指令来控制按钮的显示与隐藏。v-cloak 指令的作用是在 Vue 实例渲染完成之前隐藏该元素,避免出现闪烁现象。 CSS 部分(backTop.css)主要负责样式设计。它首先清除了一些默认的边距和填充,对 html 和 body 进行了全屏布局,并设置了相对定位。.back-to-top 类则定义了“回到顶部”按钮的样式,包括其位置、圆角、阴影、填充以及悬停时背景颜色的变化。此外,与 v-cloak 相关的 CSS 确保在 Vue 实例加载过程中隐藏该元素。每个 .page 类代表一个页面,每个页面的高度设置为 400px,用于模拟多页面的滚动效果。 接下来是 JavaScript 部分(backTop.js)。在这里,我们创建了一个 Vue 实例。实例的 el 属性指定 Vue 将挂载到的 DOM 元素(#back-to-top)。data 对象中包含三个属性:backTopShow 用于控制按钮的显示状态;backTopAllow 用于防止用户快速连续点击;backSeconds 定义了回到顶部所需的时间;showPx 则规定了滚动多少像素后显示“回到顶部”按钮。 在 V
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值