日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【杭电多校2020】Go Running【几何】【最小点覆盖】

發(fā)布時(shí)間:2023/12/3 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【杭电多校2020】Go Running【几何】【最小点覆盖】 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題意:有一個(gè)數(shù)軸,若干人在某個(gè)時(shí)刻開(kāi)始從某個(gè)點(diǎn)朝某個(gè)方向按111的速度走若干時(shí)間。已知nnn個(gè)條件,形如tit_iti?時(shí)刻xix_ixi?的位置有人,求最少可能的人數(shù)。

∑n≤5×105\sum n\leq 5\times 10^5n5×105

畫(huà)出 x?tx-tx?t二維平面,可以看成用最少k=±1k=\pm1k=±1的直線覆蓋給出的nnn個(gè)點(diǎn)

轉(zhuǎn)45°45\degree45°看成水平線或豎直線(但好像沒(méi)啥區(qū)別)

過(guò)每個(gè)點(diǎn)作水平線和豎直線,將直線去重,然后直線建成點(diǎn),點(diǎn)建成過(guò)它作的兩個(gè)直線之間連的邊,跑最小點(diǎn)覆蓋即可。

注意匈牙利是O(nm)O(nm)O(nm),dinic只有O(mn)O(m\sqrt n)O(mn?)

#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <algorithm> #define MAXN 200005 #define MAXM 400005 #define INF 0x3f3f3f3f using namespace std; struct edge{int u,v,c;}e[MAXM]; int head[MAXN],nxt[MAXM],cnt; void ins(int u,int v,int c) {e[++cnt]=(edge){u,v,c};nxt[cnt]=head[u];head[u]=cnt; } void addnode(int u,int v,int c){ins(u,v,c);ins(v,u,0);} int s,t; int dis[MAXN]; bool bfs() {queue<int> q;q.push(s);memset(dis,-1,sizeof(dis));dis[s]=0;while (!q.empty()){int u=q.front();q.pop();for (int i=head[u];i;i=nxt[i])if (e[i].c&&dis[e[i].v]==-1){dis[e[i].v]=dis[u]+1;q.push(e[i].v);if (e[i].v==t)return true;}}return false; } int dfs(int u,int f) {if (u==t||!f)return f;int used=0;for (int i=head[u];i;i=nxt[i])if (e[i].c&&dis[e[i].v]==dis[u]+1){int w=dfs(e[i].v,min(e[i].c,f));if (!w)continue;used+=w;e[i].c-=w;e[i^1].c+=w;f-=w;if (used==0)break;}if (!used) dis[u]=-1;return used; } int dinic() {int mflow=0;while (bfs())mflow+=dfs(s,INF);return mflow; } int x[MAXN],y[MAXN],xl[MAXN],yl[MAXN],xcnt,ycnt; int main() {int T;scanf("%d",&T);while (T--){int n;scanf("%d",&n);for (int i=1;i<=xcnt+ycnt+2;i++) head[i]=0;for (int i=1;i<=cnt;i++) nxt[i]=0;cnt=1,xcnt=ycnt=0;for (int i=1;i<=n;i++){int a,b;scanf("%d%d",&a,&b);x[i]=xl[i]=a+b;y[i]=yl[i]=a-b;}sort(xl+1,xl+n+1);xcnt=unique(xl+1,xl+n+1)-xl-1;sort(yl+1,yl+n+1);ycnt=unique(yl+1,yl+n+1)-yl-1;s=xcnt+ycnt+1,t=s+1;for (int i=1;i<=xcnt;i++) addnode(s,i,1);for (int i=xcnt+1;i<=xcnt+ycnt;i++) addnode(i,t,1);for (int i=1;i<=n;i++){x[i]=lower_bound(xl+1,xl+xcnt+1,x[i])-xl;y[i]=lower_bound(yl+1,yl+ycnt+1,y[i])-yl;addnode(x[i],y[i]+xcnt,1);}printf("%d\n",dinic());}return 0; }

總結(jié)

以上是生活随笔為你收集整理的【杭电多校2020】Go Running【几何】【最小点覆盖】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。