結果
問題 | No.3024 全単射的 |
ユーザー |
|
提出日時 | 2025-02-14 22:10:38 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 486 ms / 5,000 ms |
コード長 | 2,504 bytes |
コンパイル時間 | 2,014 ms |
コンパイル使用メモリ | 180,212 KB |
実行使用メモリ | 50,460 KB |
最終ジャッジ日時 | 2025-02-14 22:12:01 |
合計ジャッジ時間 | 5,548 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 22 |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:123:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 123 | scanf("%d%lld",&n,&m); | ~~~~~^~~~~~~~~~~~~~~~ main.cpp:127:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 127 | scanf("%lld%lld",&x[i],&y[i]); | ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
ソースコード
#include <bits/stdc++.h>using namespace std;typedef long long ll;const int INF=0x3f3f3f3f;const int MAX=5e5+10;const int mod=1e9;struct Discretization{#define type ll#define all(x) x.begin(),x.end()vector<type> a;void init(){a.clear();}void add(type x){a.push_back(x);}void work(){sort(all(a));a.resize(unique(all(a))-a.begin());}int get_pos(type x){return lower_bound(all(a),x)-a.begin()+1;}type get_val(int pos){return a[pos-1];}int size(){return a.size();}#undef type#undef all}d;struct Dinic{#define type intconst type inf=INF;static const int N=3e5+10;struct node{int from,to;type cap,flow;node(int u,int v,type c,type f):from(u),to(v),cap(c),flow(f){}};int n,s,t;vector<node> edge;vector<int> mp[N];int vis[N],dist[N],id[N];void init(int _n){n=_n;edge.clear();for(int i=0;i<=n;i++){mp[i].clear();id[i]=dist[i]=vis[i]=0;}}void add_edge(int from,int to,type cap){edge.push_back(node(from,to,cap,0));edge.push_back(node(to,from,0,0));int m=edge.size();mp[from].push_back(m-2);mp[to].push_back(m-1);}bool bfs(){int i,x;memset(vis,0,sizeof vis);queue<int>q;q.push(s);dist[s]=0;vis[s]=1;while(!q.empty()){x=q.front();q.pop();for(i=0;i<mp[x].size();i++){node &e=edge[mp[x][i]];if(!vis[e.to]&&e.cap>e.flow){vis[e.to]=1;dist[e.to]=dist[x]+1;q.push(e.to);}}}return vis[t];}type dfs(int x,type a){if(x==t||!a) return a;type flow=0,f;for(int &i=id[x];i<mp[x].size();i++){node &e=edge[mp[x][i]];if(dist[x]+1==dist[e.to]&&(f=dfs(e.to,min(a,e.cap-e.flow)))>0){e.flow+=f;edge[mp[x][i]^1].flow-=f;flow+=f;a-=f;if(!a) break;}}return flow;}type max_flow(int _s,int _t){s=_s;t=_t;type res=0;while(bfs()){for(int i=0;i<=n;i++) id[i]=0;res+=dfs(s,inf);}return res;}#undef type}dc;/*O(n^2*m)bipartite graph: O(m*sqrt(n))dc.init(n);dc.add_edge(a,b,cap); a,b: 1~n*/ll x[MAX],y[MAX];int main(){int n,i,s,t;ll m;scanf("%d%lld",&n,&m);d.init();for(i=1;i<=n;i++){scanf("%lld%lld",&x[i],&y[i]);d.add(x[i]);d.add(y[i]);}d.work();s=n+d.size()+1;t=s+1;dc.init(t);for(i=1;i<=n;i++){dc.add_edge(s,i,1);dc.add_edge(i,n+d.get_pos(x[i]),1);dc.add_edge(i,n+d.get_pos(y[i]),1);}for(i=1;i<=d.size();i++) dc.add_edge(n+i,t,1);printf("%d\n",dc.max_flow(s,t));return 0;}