1. 程式人生 > >Tell Your World 【計算幾何+思維】

Tell Your World 【計算幾何+思維】

B. Tell Your World

time limit per test1second

memory limit per test256megabytes

Connect the countless points with lines, till we reach thefaraway yonder.

There are n points on a coordinate plane, the i-th of which being (i, yi).

Determine whether it's possible to draw two parallel andnon-overlapping lines, such that every point in the set lies on

exactly one of them, and each of thempasses through at least one point in the set.

Input

The first line of input contains a positive integer n (3 ≤ n ≤ 1 000) — the number ofpoints.

The second line contains n space-separated integers y1, y2, ..., yn ( - 109 ≤ yi ≤ 109) — the verticalcoordinates of each point.

Output

Output "Yes" (without quotes) if it's possible to fulfill therequirements, and "No" otherwise.

Youcan print each letter in any case (upper or lower).

Examples

Input

5
7 5 8 6 9

Output

Yes

Input

5
-1 -2 0 0 -5

Output

No

Input

5
5 4 3 2 1

Output

No

Input

5
1000000000 0 0 0 0

Output

Yes

Note

In the first example, there are five points:

(1, 7), (2, 5), (3, 8), (4, 6) and (5, 9). It's possible to draw a line thatpasses through points 1, 3, 5, and another one that passes through points 2, 4 and is parallel to the first one.

In the second example, while it's possible to draw two linesthat cover all points, they cannot be made parallel.

In the third example, it's impossible to satisfy both requirements at the sametime.

【題意】

給出座標為(i,y[i])的一系列點,問能否找到兩條平行且不重合的直線,使得所有點都落在兩條直線上,且每條直線上至少有一個點。

【思路】

把問題轉化一下,我們先算出兩條直線的斜率k(由於兩條直線平行,所以斜率相等),然後去找到兩條直線最左下角的點作為基準點,檢驗其他點跟基準點之間的斜率是否為k即可。

那麼我們如何去算這個k呢,一個個去列舉第一個點去其他點之間的斜率複雜度很大,這裡我們需要腦洞一下,我們先去分別列舉第一個點與第二個點、第三個點之間的斜率k1,k2,如果與真正的斜率不同,則第一個點與第二個點不在同一直線上,與第三個點也不在同一直線上,那麼說明第二個點和第三個點一定在同一直線上,算出斜率k3,真正的斜率一定是這三個裡的一個。然後再去對每個斜率檢查一下是否滿足題目要求即可。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int maxn = 1005;

int n;
int y[maxn];

bool solve(double k)
{
    int flag=0;
    int point=-1;                           //第一個點和第point個點是兩個基準點
    for(int i=2;i<=n;i++) 
    {
        if(y[i]-y[1]==k*(i-1)) continue;
        flag=1;                              //有兩條不同的直線
        if(point<0) point=i;
        else if(y[i]-y[point]!=k*(i-point))  //超過了兩條直線
        {
            flag=0;
            break;
        }
    }
    if(flag) return true;
    return false;
}

int main()
{
    while(~scanf("%d",&n))
    {
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&y[i]);
        }
        double k1=1.0*(y[2]-y[1]);
        double k2=0.5*(y[3]-y[1]);
        double k3=1.0*(y[3]-y[2]);
        if(solve(k1)||solve(k2)||solve(k3)) puts("Yes");
        else puts("No");
    }
    return 0;
}

相關推薦

Tell Your World 計算幾何+思維

B. Tell Your World time limit per test1second memory limit per test256megabytes Connect the countless points with lines, till we reach

Codeforces 849B Tell Your World計算幾何

continue int ++i 滿足 light size sizeof tar tell 題目鏈接 Tell Your World 題意 給出N個點(i, xi),問是否存在兩條平行的直線,使得每一個點恰好在兩條直線的其中一條上。 每條直線必須穿過至少一個點。 考

計算幾何+二分 POJ 2318

虛空傳送門 【題目大意】給定一個箱子的左上角座標和右上角座標。給定n個隔板的端點座標【保證隔板不相交】,內部隔間從0到n編號。 給定m個玩具的座標【保證玩具在箱子內部且不在隔板上】,每個玩具在一個隔間內。 問每個隔間內有多少個玩具。   首先用叉積判玩具在隔板的哪個方位

計算幾何基礎

1、儲存方式: 點 向量 (x, y) 圓 圓心,半徑 射線,線段,直線 兩個點 多邊形 順時針/逆時針點座標 2、精度問題 3、向量運算 點積 滿足分配律 a * b * cos α = a.x * b.x + a.y * b.y a在b上投影於b都乘積 垂直點積為零 叉積 滿足分配律 a * b * s

Liaoning Ship’s Voyage計算幾何+bfs

題目大意:一個圖上有n*n個點,然後從起點走到終點,然後需要繞過三角形和“#”,問一個最短路徑 分析:由於邊上的點和端點都是能走的,我在擴充套件邊的時候,判斷該邊與三角形是否有焦點,我原先是判斷線段與線段的交點,然後判斷點是否在三角形內部,後來發現如果一個線段的

bzoj 3778: 共鳴計算幾何+dp

con b- 三角形面積 cmp getchar space for cpp std 枚舉起點,然後設f[i][j]為上凸殼上一個點是i當前點是j的最大面積,g是下凸殼,然後合並的時候枚舉結束點t合並上下凸殼即可 這樣的好處是每次轉移都是往凸多邊形裏加一個三角形(s,i,j

計算幾何 02凸包問題(Convex Hull)

### 引言 首先介紹下什麼是凸包?如下圖: ![](https://gitee.com//riotian/blogimage/raw/master/img/20200921200555.png) 在一個二維座標系中,有若干點雜亂排列著,將最外層的點連線起來構成的凸多邊型,它能包含給定的所有的點,這個多

計算幾何CDOJ1720 幾何幾何

-a section fin wap line [0 turn tor std #include<cstdio> #include<algorithm> #include<cmath> using namespace std; #d

計算幾何+極角排序+爆llE. Convex

lfa string ret == mes 過程 一個 區別 problem https://www.bnuoj.com/v3/contest_show.php?cid=9147#problem/E 【題意】 給定n個點的坐標,可以選擇其中的四個點構造凸四邊形,問最多能構造

計算幾何預處理枚舉Urozero Autumn Training Camp 2016 Day 5: NWERC-2016 Problem K. Kiwi Trees

相交 const put vector freopen n) math turn blog 發現由於角的度數和邊的長度有限制,那倆圓如果放得下的話,必然是塞在兩個角裏。 於是預處理n個圓心的位置(註意要判斷那個圓會不會和其他的邊界相交),然後n^2枚舉倆角即可。 #inc

計算幾何分類討論Gym - 101173C - Convex Contour

turn ace return highlight gym rotate ons ltr sqrt 註意等邊三角形的上頂點是卡不到邊界上的。 於是整個凸包分成三部分:左邊的連續的三角形、中間的、右邊的連續的三角形。 套個計算幾何板子求個三角形頂點到圓的切線、三角形頂點到正方

計算幾何bitsetGym - 101412G - Let There Be Light

bit pen urn 接受 eset iostream scan || names 三維空間中有一些(<=2000)氣球,一些光源(<=15),給定一個目標點,問你在移除不超過K個氣球的前提下,目標點所能接受到的最大光照。 枚舉每個光源,預處理其若要照射到光源

hdu_6055 : Regular polygon (2017 多校第二場 1011) 計算幾何

include int scan ble pro set sort 根據 可能 題目鏈接 有個結論: 平面坐標系上,坐標為整數的情況下,n個點組成正n邊形時,只可能組成正方形。 然後根據這個結論來做。 我是先把所有點按照 x為第一關鍵字,y為第二關鍵字 排序,然後枚舉向量

計算幾何圓反演hdu6158 The Designer

using 技術分享 技術 幾何 ++i %d mat 圓的面積 logs 給你內外那倆圓的半徑,讓你按圖中標號的順序往縫裏塞n個小圓,問你小圓的總面積。 不知道圓反演的先去查一下定義。 將兩個圓的切點視作反演中心,任取反演半徑(比如1),將兩個圓反演成兩條平行直線,則那

計算幾何分類討論Gym - 101243I - Land Division

log clas algo 答案 cto esp turn 端點 name 題意:給你一個n個點的凸包,讓你切一刀,使得它變成一個m邊形和一個K邊形,問你切的這一刀最短是多少。 如果m+K==n+4,那麽一定切在兩條邊上,但是由於兩個線段間的最短距離,至少會經過一條線段的

計算幾何DPtarjanDay 10.6

long long pri cout logs 前綴 ret ble freopen style T1 計算幾何+遞推 1 #include <cstdio> 2 #include <cmath> 3 double w,x,r; 4 int

計算幾何二分圖判定Gym - 101485C - Cleaning Pipes

你是 i+1 ace 機器 ble mes 方案 clu str 題意:有n個水井,每個水井發出一些管線(都是線段),然後每條管線上最多只有一個水井。所有從不同的水井發出的管線的相交點都是清潔點(不存在清潔點是大於兩條管線點的交點)。你需要在某些管線上放出一些機器人,它們會

計算幾何+狀壓DP憤怒的小鳥

mes noi return style clu ring min typedef logs 本來覺得挺簡單的一道題卻因為沒考慮a>=0的情況而調試了一個上午,看來留給思考的時間應該更多一些,等各種特殊情況都想好之後再開始寫代碼 總之NOIP2016的題都做完啦

計算幾何如何計算兩個圓的交點坐標

style coo 正交 ces sta 設定 由於 直接 ima How to calculate two coordinates of the intersection points of two circles? 題目:   給定兩個圓的的方程     (x-x1)^

HDU 1007 Quoit Design計算幾何/分治/最近點對

jcp 存在 sig script != iss accepted aps posit Quoit Design Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot