gym102220
這次的題目看起來和理解起來幾乎障礙較少,在我這英語水平階段配上詞典就看懂啦一半題目(我看啦一半,也就是看過的都懂),看過的也沒幾個會的。雖然有想法,但是演算法還是懂得的太少啦,比如c題的線段相交,我是求的那個y=kx+b的引數,其實這道題需要用到pair(我之前沒見過需要提高精度,斜率一點誤差就非常傷),需要用到ax+by=c這種形式,
題解:兩條直線不平行必相交,若平行:若重合答案加1,否則不算。
我們用兩個map來刻畫直線的特性,mp1刻畫ax+by的直線系有多少個,mp2刻畫ax+by=c這一條直線有多少個。
假設當前直線與之前的線段都相交,那麼我們需要減去與這條直線平行而不重合的直線。即ans+=i-1+mp2-mp1.
typedef
long
long ll;
typedef pairp;
typedef pair
,ll>pi;
const
int maxn=
100010
;map
,ll>mp1;
//兩個引數a,b,代表形如a*x+b*y=c(c任意)的直線有多少個
map,ll>
,ll>mp2;
//三個引數a,b,c,代表形如a*x+b*y=c的直線有多少個,即相同直線有多少個
ll cnt,ans,n;
intmain()
cout<}return0;
}
g題當時沒想到居然是中位數(可能當時實現中位數還是沒頭緒),一直想著全都遍歷,然後直接超時,┭┮﹏┭┮。題解:由於橫縱方向地位相同,我們不妨來看橫方向,題目要找一點x使得n條線段經過平移最少次數,至少重合一點。
假設那一點就為x,那麼一條線段至少與x有交點的話,所需距離為:d=(|l-x|+|r-x|-|r-l|)/2,紙上畫一遍即可。我們要找的是所有線段移動的距離之和最小,那麼只需σd最小,
由於d中的|r-l|為常數,所以我們只需要求σ(|l-x|+|r-x|)最小,那麼x就是所有l,r的中位數了~~。題目難得就是轉化~~。
中位數的做法就是`
#include
#include
#include
#include
#include
#include
using
namespace std;
const
int max_n=
100000+5
;//資料大小
int n;
int a[max_n][4
];int z[max_n*2]
;long
long
intget
(int s,
int t)
sort
(z,z+
2*n)
;//排序是為啦找到中位數
long
long
int res=0;
for(
int i=
0;i<
2*n;i++
)for
(int i=
0;i)return res/2;
//第三步 公式:d=(|l-x|+|r-x|-|r-l|)/2
}int
main()
}long
long
int res=0;
res+
=get(1
,3);
//y的
res+
=get(0
,2);
//x的
printf
("%lld\n"
,res);}
return0;
}
周五個人賽總結
這次個人賽四個小時的時間只解出來了乙個題,還是乙個水題,通過這次比賽暴露了自身存在的的幾個問題。1.解題的順序上,不願意捨棄已經有一點思路的難題,這種題可能以現在的水平,在四個小時內根本無法解出,或者根本無法正確的解出。在本次比賽中,一道題花費了兩個多小時的時間,終於將能通過案例的 寫出,但在提交後...
個人賽第一場解題總結
a 大王叫我來巡山吶 crawling in process.crawling failed time limit 1000msmemory limit 32768kb64bit io format i64d i64u submit status practice fzu 2167 descript...
個人賽 A 題 傳球遊戲(ball)
description 上體育課的時候,小蠻的老師經常帶著同學們一起做遊戲。這次,老師帶著同學們一起做傳球遊戲。遊戲規則是這樣的 n個同學站成乙個圓圈,其中的乙個同學手裡拿著乙個球,當老師吹哨子時開始傳球,每個同學可以把球傳給自己左右的兩個同學中的乙個 左右任意 當老師在此吹哨子時,傳球停止,此時,...