2018雅禮省選集訓3 25 bsh 分治最短路

2021-08-18 20:44:41 字數 2236 閱讀 8394

因為是三角剖分,所以每一條對角線都把多邊形分成兩部分,於是考慮分治。

先找到一條把多邊形分得比較均勻的對角線,對兩個端點做一下bfs,處理掉起點和終點分別在這條對角線兩側的詢問(分經過某個點或者經過這條邊三種情況更新),然後繼續分治直到三角形為止。

選對角線的時候直接選最遠的即可。

**:

#include

#include

#include

#include

#define n 52010

#define fs first

#define sc second

#define chkmin(a,b) a=min(a,b)

#define in(x) (x>dx&&x#define out(x) (xdy)

using namespace std;

const int inf=0x3f3f3f3f;

int n,m,a[n],b[n],d1[n],d2[n],vis[n],dl[n];

intread()

struct edge

*con[n];

struct node

q[n<<1],s[n<<1];

bool cmp(node p,node q)

void ins(int

x,int

y,bool b)

void bfs(int s,int l,int r,int

*d)void solve(int l,int r,int l,int r)

return ;

}int dx,dy,d=0;

for(int i=l;i<=r;i++)

for(edge *p=con[a[i]];p;p=p->next)

if(p->b&&vis[p->t]>vis[a[i]])

if(d==0)return ;

bfs(dx,l,r,d1);bfs(dy,l,r,d2);

for(int i=l;i<=r;i++)

chkmin(q[i].ans,min(min(d1[q[i].x]+d2[q[i].y],d1[q[i].y]+d2[q[i].x])+1,min(d1[q[i].x]+d1[q[i].y],d2[q[i].y]+d2[q[i].x])));

int top=l-1,mt,nt,top=l-1,mt,nt;

for(int i=l;i<=r;i++)

if(in(q[i].x)&&in(q[i].y)) s[++top]=q[i];

mt=top;

for(int i=l;i<=r;i++)

if(out(q[i].x)&&out(q[i].y)) s[++top]=q[i];

nt=top;

for(int i=l;i<=r;i++)

if(!(in(q[i].x)&&in(q[i].y))&&!(out(q[i].x)&&out(q[i].y))) s[++top]=q[i];

for(int i=l;i<=r;i++)

q[i]=s[i];

for(int i=l;i<=r;i++)

if(in(a[i])&&in(a[i])) b[++top]=a[i];

mt=top;

for(int i=l;i<=r;i++)

if(out(a[i])&&out(a[i])) b[++top]=a[i];

nt=top;

for(int i=l;i<=r;i++)

if(!(in(a[i])&&in(a[i]))&&!(out(a[i])&&out(a[i]))) b[++top]=a[i];

for(int i=l;i<=r;i++)

a[i]=b[i];

for(int i=l;i<=r;i++)

vis[a[i]]=0;

solve(l,mt,l,mt);

solve(mt+1,nt,mt+1,nt);

}int main()

m=read();

for(int i=1;i<=m;i++)

for(int i=1;i<=n;i++)

a[i]=i;

solve(1,n,1,m);

sort(q+1,q+m+1,cmp);

for(int i=1;i<=m;i++)

printf("%d\n",q[i].ans);

return

0;}

2018雅禮省選集訓3 31 Max 期望DP

注意到 m m 比較小,不妨狀壓 m role presentation style position relative mm。我們設fi,j,s fi,j,s表示ai a i用掉集合 s s 中的操作後值為 j role presentation style position relative j...

省選專練 2018雅禮集訓 立方體Cube

困難雖然當你知道 答案是c n,m 2 n m 時甚易 如何推出 觀察計算式 我們知道當你有四個點時,乙個點旁邊有有兩個點,他們分別連線然後為4 2個但是乙個點作為起點終點使用兩次故除二 include include include include includeusing namespace s...

雅禮集訓 2018 Day4 Magic

傳送門本部分 於 這位大佬 題中要求本質不同的序列數量,不太好搞。我們考慮給相同顏色的牌加上編號,這樣所有牌都不相同。那麼如果我們求出了答案,只需要將答案除以 prod a i 就好了。恰好有 k 對 不能直接求,考慮容斥,如果我們求出了 g x 表示至少有 x 對的方案數,那麼答案即為 sum l...