九省聯考 2018 劈配 解題報告

2022-04-29 21:18:10 字數 1663 閱讀 1731

寫了乙個有點奇怪的做法(感覺

首先發現有個比較正常的暴力,就是每次二分重新建圖跑,似乎有80分,應該也比較好寫,考場應該會寫這個。

考慮如果得到了前\(i\)個人的答案(問題1),那麼這些人只能在一部分的導師裡面反悔,我們把這些邊建出來。

然後對於\(i+1\sim n\)個人,每次把它所有邊加上,然後看看它在這個排名可不可以達到它的期望,然後再把邊撤回。

這裡用乙個單路增廣就好,比較好撤回,可以發現這個單路增廣是\(o(n+m)\)的

然後每個人跑了\(n\)次單路增廣,\(m\)在建一部分邊後大小應該是\(nc\)條的,所以總複雜度是\(o(tn^3c)\),跑不滿就可以過

code:

#include #include #include #include const int n=420;

const int m=4e5;

const int inf=0x3f3f3f3f;

template void read(t &x)

int head[n],thead[n],edge[m],to[m],next[m],cnt;

void add(int u,int v,int w)

int n,m,s,t,bee[n][n],ans0[n],ans1[n],yuy[n];

int pre[n],vis[n],ti,id,flag;

void dfs(int now)

flag=0;

return;

}for(int v,i=head[now];flag&&i;i=next[i])

if(edge[i])

}struct koito_yuu

koito_yuu(int v,int x)

bool friend operator <(koito_yuu a,koito_yuu b)

}yuu[n][n];

void work()

*/} for(int i=1;i<=n;i++) read(yuy[i]);

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

flag=1,++ti;

dfs(s);

id=bee[j][id==t+1?m+1:id-n];

if(j==i) ans0[i]=id;

if(id<=yuy[j]) ans1[j]=i;

cnt=tmp;

for(int k=1;k<=t+1;k++) head[k]=thead[k];

} add(s,i,1);

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

if(ans0[i]==yuu[i][j].v)

add(i,yuu[i][j].x,1);

flag=1,++ti;

dfs(s);

int now=t;

while(pre[now])

}for(int i=1;i<=n;i++) printf("%d ",ans0[i]);

puts("");

for(int i=1;i<=n;i++) printf("%d ",i-ans1[i]);

puts("");

}int main()

return 0;

}

2019.3.19

八省聯考2018 劈配

題目這題目,乍一眼看上去像乙個dp,因為這個資料範圍一般都是dp,但是考慮到轉移有後效性,所以顯然是做不了dp的。考試的時候像著怎麼設狀態沒有後效性,失敗了,就只打了乙個70分的暴力,還掛了20分。這題其實是個 網路流 匹配 真心看不出,然後我寫部落格的時候旁邊yl神犇看見了,嘲諷了我一波,我是真的...

八省聯考2018 劈配

題解 這題思路就是暴力。主要在於分析複雜度?dinic跑二分圖 msqrt n 這題好像用不到。首先這是個匹配問題顯然需要利用網路流 考慮第一問 每一次我們就暴力按照志願順序加入邊 直到二分圖匹配數 1 這個複雜度是 nm nm 的 因為一次只增廣一條邊所以每次是nm的,不過這個很明顯是跑不滿而且差...

八省聯考2018 劈配

一年一度的綜藝節目 中國新 又開始了。zayid 從小就夢想成為一名程式設計師,他覺得這是乙個展示自己的舞台,於是他毫不猶豫地報名了。輕車熟路的zayid 順利地通過了海選,接下來的環節是導師盲選,這一階段的規則是這樣的 總共n 名參賽選手 編號從1 至n 每人寫出乙份 並介紹自己的夢想。接著 由所...