bzoj
先預處理每個狀態是否合法。記\(dis[i][j]\)表示從任意乙個絕招點到達左手在\(i\)右手在\(j\)這個狀態的最小步數,以及\(vis[i][j]\)表示是從哪乙個絕招點轉移過來的。這一步可以\(bfs\)實現,複雜度\(o((n+m)^2)\)。
然後再列舉兩個相鄰狀態,如果兩個狀態的\(vis\)不同,那麼就可以更新這兩個絕招點的答案。
可以理解為從每個絕招點開始擴張,當遇到「接壤」時即意味著兩個絕招點在最短路上相遇。
#include#include#includeusing namespace std;
int gi()
#define cmin(a,b) (a>b?a=b:a)
const int n = 1005;
struct graph
}g1,g2;
int n,m,k,mn,mx,x[n],y[n],ok[n][n],q[2][n*n],hd,tl,vis[n][n],dis[n][n],ans[n*100];
int main()
k=gi();
for (int i=1;i<=k;++i)
for (int i=1;i<=m;++i)
for (int i=1;i<=n;++i) g1.link(i,i),g2.link(i,i);
hd=1,tl=k;
while (hd<=tl)
} memset(ans,63,sizeof(ans));
for (int u=1;u<=n;++u)
for (int v=1;v<=n;++v)
for (int i=g1.head[u];i;i=g1.nxt[i])
for (int j=g2.head[v];j;j=g2.nxt[j])
}for (int i=1;i<=k;++i) printf("%d\n",ans[i]==ans[0]?-1:ans[i]);
return 0;
}
loj 3161 NOI2019 君的探險
考慮b型資料,也就是圖是乙個父親編號小於兒子的樹的情況的做法.考慮整體二分,對於當前區間 l,r 維護父親屬於當前區間的集合 s 現在要將 s 分為父親在 l,mid 中的和 mid 1,r 中的兩類.首先如果 x in l,mid 那麼它的父親一定在左區間.考慮對於所有 l,mid 區間的節點呼叫...
BZOJ1052 BZOJ3760 覆蓋問題
原題位址 先說自己的逗比方法 二分答案,把所有點用乙個最小的矩形 框 起來,易證矩形的其中乙個端點是最優解中正方形的乙個端點,然後列舉四個端點後遞迴處理,差不多了 然後 olz黃學長的o n 做法 ac code include include include using namespace std...
動態點分治 bzoj 3730,bzoj 1095
總結一下動態點分治的模板。對於乙個樹,把它點分的同時記錄每個點的所有父親 logn個 並記錄點距其父親的距離。具體實現就是dfs的時候fa x dep x u,dis x dep x d bzoj1095 您需要寫乙個程式支援反轉點的顏色,求距離最遠的黑色點對的距離。解析 在每個點u存乙個堆st記錄...