因為是三角剖分,所以每一條對角線都把多邊形分成兩部分,於是考慮分治。
先找到一條把多邊形分得比較均勻的對角線,對兩個端點做一下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...