t1:首先這題可以通過推式子(考慮相鄰兩個位置的優劣情況)發現最優解應該是按照a/t從大到小的順序來解題的。所以我們可以求出最優解的序列,現在要求的就是c的最大值。
但這時我們會發現可能會有多個a/t相同的點,所以我們求出每一道題可能出現的最早和最晚的時間,這兩個時間就等於這個點在a/t相同的這一塊中排在最前和最後的時間。
接下來我們把a從小到大排序,然後二分c,對於乙個c,要滿足對於每乙個i(it2:這題有一點難度。
首先因為矩形的邊是可以走的,所以最短路徑一定是x單調或y單調的。
然後我們就可以通過翻轉矩形來計算x單調或y單調的情況。假設現在是y單調增且sx<=tx且sy<=ty。那麼我們這樣來求答案:
第一要保證可以y單調增地從起點走到終點。那麼我們從起點開始,優先往下走,往下走不通了之後就往右走,直到可以往下走時再往下走。按照這種策略一直走下去,當走到tx這一行時,若當前y>ty,那麼就是不合法的。
保證了可以y單調之後,我們就要求最小步數。這時我們從起點開始往右走,當撞到牆了之後就往兩側分流,最終求最小值。具體做法與掃瞄線類似,期間用set維護。
往兩側分流
貼一下**:
#include
#include
#include
#include
#include
#define maxn 200010
using
namespace std;
struct data
;data a[maxn]
,a1[maxn]
;struct dot
dot(
int _x,
int _y,
int _l)
bool
operator
<
(const dot&a)
const};
sets;
set::iterator it;
struct point
;point b[maxn]
;int n,mx,my,sx,sy,tx,ty,ans=-1
;int
add(
int i,
int x1,
int y1,
int x2,
int y2)
intgame
(const data &a,
const data &b)
intgame1
(const data &a,
const data &b)
intpd
(int sx,
int sy,
int tx,
int ty)}if
(y>ty)
return50;
else
return
100;
}int
work
(int sx,
int sy,
int tx,
int ty)
mi1=-1
;mi2=-1
;for
(k=1
;k<=sum;k++)if
(sum>0)
j++;}
i=j-1;
}}sum=s.
size()
;while
(sum>=1)
}int
main()
if(sx>mx)mx=sx;
if(tx>mx)mx=tx;
if(sy>my)my=sy;
if(ty>my)my=ty;
for(i=
1;i<=n;i++
)add
(i,a1[i]
.x1,a1[i]
.y1,a1[i]
.x2,a1[i]
.y2)
;work
(sx,sy,tx,ty)
;for
(i=1
;i<=n;i++
)add
(i,a1[i]
.x1,my-a1[i]
.y2,a1[i]
.x2,my-a1[i]
.y1)
;work
(sx,my-sy,tx,my-ty)
;for
(i=1
;i<=n;i++
)add
(i,mx-a1[i]
.x2,a1[i]
.y1,mx-a1[i]
.x1,a1[i]
.y2)
;work
(mx-sx,sy,mx-tx,ty)
;for
(i=1
;i<=n;i++
)add
(i,mx-a1[i]
.x2,my-a1[i]
.y2,mx-a1[i]
.x1,my-a1[i]
.y1)
;work
(mx-sx,my-sy,mx-tx,my-ty)
;for
(i=1
;i<=n;i++
)t=sx;sx=sy;sy=t;
t=tx;tx=ty;ty=t;
t=mx;mx=my;my=t;
for(i=
1;i<=n;i++
)add
(i,a1[i]
.x1,a1[i]
.y1,a1[i]
.x2,a1[i]
.y2)
;work
(sx,sy,tx,ty)
;for
(i=1
;i<=n;i++
)add
(i,a1[i]
.x1,my-a1[i]
.y2,a1[i]
.y1,my-a1[i]
.y1)
;work
(sx,my-sy,tx,my-ty)
;for
(i=1
;i<=n;i++
)add
(i,mx-a1[i]
.x2,a1[i]
.y1,mx-a1[i]
.x1,a1[i]
.y2)
;work
(mx-sx,sy,mx-tx,ty)
;for
(i=1
;i<=n;i++
)add
(i,mx-a1[i]
.x2,my-a1[i]
.y2,mx-a1[i]
.x1,my-a1[i]
.y1)
;work
(mx-sx,my-sy,mx-tx,my-ty)
;printf
("%d"
,ans)
;}
2019 08 12 省選組 模擬
t1 這題的題意有點難懂。其實題目就是要我們先讓所有工人把該學的都學了,然後使得無論工人們在那種選擇的情況下都可以讓所有機器都有人操作。推一推不難發現 我們把整個二分圖分成若干個連通塊,所有機器都有人操作的充要條件就是每乙個連通塊都是乙個完全二分圖 即左邊的每乙個點向右邊的每乙個點都有連邊 那麼我們...
2020 01 16 省選組 模擬
這套比賽目前只改出一題。t1 首先我們發現對於k個關鍵點構成的一棵樹,最有答案一定是2 sum maxdis,其中sum表示所有邊權的和,maxdis表示直徑的長度。知道了這個之後我們就可以分兩部分算答案。首先計算sum。我們列舉每一條邊,然後計算這一條邊可能出現在關鍵樹上的方案數。設這條邊的一側有...
2020 09 05 省選組 模擬
t1 首先用tarjan求出所有的點雙,然後建圓方樹。具體的建法是將當前點雙的割點作為父親向乙個新建的方點連邊,然後方點在想點雙中其他點連邊。在建好圓方樹之後我們就樹形dp。設f i 表示從i的子樹到i的最長鏈的長度。對於每個x,如果x為圓點則像常規一樣轉移 若x為方點則要處理一下 把當前方點對應的...