图片网站 代码,通信建设工程项目经理查询网站,如何做高清pdf下载网站,网站建设实训报告建议题意#xff1a;有一个数轴#xff0c;若干人在某个时刻开始从某个点朝某个方向按111的速度走若干时间。已知nnn个条件#xff0c;形如tit_iti时刻xix_ixi的位置有人#xff0c;求最少可能的人数。 ∑n≤5105\sum n\leq 5\times 10^5∑n≤5105
画出 x−tx-tx−t二维平…题意有一个数轴若干人在某个时刻开始从某个点朝某个方向按111的速度走若干时间。已知nnn个条件形如tit_iti时刻xix_ixi的位置有人求最少可能的人数。
∑n≤5×105\sum n\leq 5\times 10^5∑n≤5×105
画出 x−tx-tx−t二维平面可以看成用最少k±1k\pm1k±1的直线覆盖给出的nnn个点
转45°45\degree45°看成水平线或竖直线但好像没啥区别
过每个点作水平线和竖直线将直线去重然后直线建成点点建成过它作的两个直线之间连的边跑最小点覆盖即可。
注意匈牙利是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()
{queueint q;q.push(s);memset(dis,-1,sizeof(dis));dis[s]0;while (!q.empty()){int uq.front();q.pop();for (int ihead[u];i;inxt[i])if (e[i].cdis[e[i].v]-1){dis[e[i].v]dis[u]1;q.push(e[i].v);if (e[i].vt)return true;}}return false;
}
int dfs(int u,int f)
{if (ut||!f)return f;int used0;for (int ihead[u];i;inxt[i])if (e[i].cdis[e[i].v]dis[u]1){int wdfs(e[i].v,min(e[i].c,f));if (!w)continue;usedw;e[i].c-w;e[i^1].cw;f-w;if (used0)break;}if (!used) dis[u]-1;return used;
}
int dinic()
{int mflow0;while (bfs())mflowdfs(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 i1;ixcntycnt2;i) head[i]0;for (int i1;icnt;i) nxt[i]0;cnt1,xcntycnt0;for (int i1;in;i){int a,b;scanf(%d%d,a,b);x[i]xl[i]ab;y[i]yl[i]a-b;}sort(xl1,xln1);xcntunique(xl1,xln1)-xl-1;sort(yl1,yln1);ycntunique(yl1,yln1)-yl-1;sxcntycnt1,ts1;for (int i1;ixcnt;i) addnode(s,i,1);for (int ixcnt1;ixcntycnt;i) addnode(i,t,1);for (int i1;in;i){x[i]lower_bound(xl1,xlxcnt1,x[i])-xl;y[i]lower_bound(yl1,ylycnt1,y[i])-yl;addnode(x[i],y[i]xcnt,1);}printf(%d\n,dinic());}return 0;
}