20200603模擬賽 安排(半平面交)

2021-10-06 19:19:50 字數 3632 閱讀 7978

題解:不上公升的序列,我們差分一下變成任意選值的序列,但是代價需要求個字首和。

所以現在就變成了每個點有k

kk種代價,對所有點都定乙個權重,求後k−1

k-1k−

1種帶權重代價的最小值÷

\div

÷第一種的帶權重代價。

01分數規劃,二分後直接變成求是否有方案後k−1

k-1k−

1種代價加減一些係數後都大於等於000。

注意到這後k−1

k-1k−

1種代價加減有關第一種代價的係數後,變成了乙個k−1

k-1k−

1維向量,我們需要選出一些向量使得他們的線性組合能座標都非負。

對於k =2

k=2k=

2的情況,直接判斷是否有非負的向量。

對於k =3

k=3k=

3的情況,是在二維平面上有若干從原點出發的向量,直接判斷是否有在第一象限的向量,如果沒有,判斷所有向量是否共過原點的(不包含第一象限的)半平面,是的話就不存在方案,否則就存在方案。

對於k =4

k=4k=

4的情況,是在三維空間中有若干從原點出發的向量,判斷所有向量是否共過原點的(不包含第一象限的)半超平面,三維超平面就是三維空間的一半,在這個題中因為它一定過原點,所以可以表示為ax+

by+z

≤0ax+by+z\leq 0

ax+by+

z≤0的形式,對於向量(u,

v,w)

(u,v,w)

(u,v,w

)在半超平面中,也就是點(u,

v,w)

(u,v,w)

(u,v,w

)在半超平面中,寫作au+

bv+w

≤0au+bv+w\leq 0

au+bv+

w≤0,這對於a,b

a,ba,

b構成了個二元不等式,可以表示為在平面直角座標系oab

oaboa

b中的au+

bv+w

≤0au+bv+w\leq0

au+bv+

w≤0這一半平面,則a,b

a,ba,

b有解當且僅當所有的半平面有交。(注意這個半平面不能包含第一象限,所以有條件a,b

≥0a,b\geq 0

a,b≥0)

精度卡到死,寫完半平面交之後發現std寫的是randomshuffle之後跑n^2

想必是出題人也發現半平面交這東西不靠譜,精度炸的離譜,不想被人爆破而做的明智之舉。

我錯了我錯了半平面交調出來了,原來nlogn半平面交要在外面框乙個很大的正方形,不然如果乙個半平面和前面的半平面相比極角一次轉了pi以上是怎麼寫都寫不好的

a cc

ode(

4kb半

平面交)

\mathcal ac\ code(4kb半平面交)

accode

(4kb

半平面交

)

#include

#define maxn 80005

#define rep(i,j,k) for(int i=(j),lim=(k);i<=lim;i++)

#define per(i,j,k) for(int i=(j),lim=(k);i>=lim;i--)

#define db double

#define eps 1e-12

#define inf 1e10

using

namespace std;

int n,k,a[maxn]

,b[maxn]

,sm[maxn][4

];intdcmp

(db x)

#define ct const

struct pt

pt operator

+(ct pt &b)ct

pt operator

-(ct pt &b)ct

db operator

*(ct pt &b)ct

pt operator

*(ct db &b)ct

}p[maxn]

;int cnt;

struct line

bool

operator

<

(ct line &b)ct

}li[maxn]

,q[maxn]

;pt itp

(ct pt &p1, ct pt &v1, ct pt &p2 , ct pt &v2)

#define ptln(x) x.s,x.t-x.s

bool

check()

for(

;qr-ql+

1>=3&&

(itp

(ptln

(q[qr]),

ptln

(q[qr-1]

))- q[ql]

.s)*

(q[ql]

.t - q[ql]

.s)> eps;qr--);

for(

;qr-ql+

1>=3&&

(itp

(ptln

(q[ql]),

ptln

(q[ql+1]

))- q[qr]

.s)*

(q[qr]

.t - q[qr]

.s)> eps;ql++);

if(qr - ql +

1<=2)

return0;

return1;

}int

main()

else

ans =

max(ans , s2 / s1);}

printf

("%.10lf\n"

,ans);}

else

if(k ==3)

if(fabs

(u)<

1e-12)}

else

else}}

if(*** || mn > mx || mx <0)

else

r = mid - eps;

}printf

("%.10lf\n"

,l);

}else

, mx[4]

=;cnt =0;

rep(j,

1,n)if(

dcmp

(u)||

dcmp

(v))

elseif(

!dcmp

(v))

else}}

if(***||

!check()

) l = mid;

else

r = mid - eps;

}printf

("%.10lf\n"

,l);}}

}

《省賽模擬賽補》

c題 比賽的時候已經想到了統計最底層的每個序列的出現次數,但是一開始想的是建圖之後dfs處理,但是發現很難處理出來。其實正確的思路是拓撲排序去處理次數。我們在最後建圖完成之後,倒著從n回去拓撲即可。但是這裡有個坑點,就是一開始統計入度可能是不正確的。例如 3 1 2 4 1 2 3是1,2的父節點,...

日常模擬賽

none 100 100 10 210 不太會做.好像.是個sb題.嗯.div3t1難度 include include define int long long define gc getchar define pc putchar inline int read void print int x...

模擬賽記錄

模擬賽記錄 8.20 7 30 9 30 數學入門難度6道題 300分 8.21 7 40 9 50 圖論 普及 6道題 500分 8.22 學長模擬賽 7 40 10 00 提高 300 分 80 分 8.23 圖論 普及 提高 8 40 11 30 300分 180分 8.24 字串 入門難度 ...