題解:不上公升的序列,我們差分一下變成任意選值的序列,但是代價需要求個字首和。
所以現在就變成了每個點有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 字串 入門難度 ...