Untitled
unknown
plain_text
10 months ago
5.4 kB
15
Indexable
/*
Created by chris144 on 10/3/2025 8:54 AM
Problem Name: PhanCong
Problem Link:
*/
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <time.h>
#include <algorithm>
#include <vector>
#include <queue>
#include <string.h>
#include <assert.h>
#include <map>
#include <math.h>
#include <functional>
#include <set>
#include <unordered_map>
#include <numeric>
#include <cstdlib>
#include <iomanip>
#include <bitset>
#include <complex>
#include <list>
#include <stack>
#include <deque>
#include <chrono>
#include <unordered_set>
#include <climits>
//#pragma GCC optimize("Ofast,03","unroll-loops")
//#pragma GCC target("avx2,popcnt,lzcnt,abm,bmi,bmi2,fma,tune=native,sse4")
using namespace std;
#define Chris "test"
#define FOR(i, a, b) for(int i = (a); i < (b); ++i)
#define FORD(i, a, b) for(int i = (a); i <= (b); ++i)
#define REP(i, a, b) for(int i = (a); i > (b); --i)
#define REPD(i, a, b) for(int i = (a); i >= (b); --i)
#define FORE(i, v) for(__typeof((v).begin()) i = (v).begin(); i != (v).end(); ++i)
#define all(v) (v).begin(), (v).end()
#define rall(v) (v).rbegin(), (v).rend()
#define MARK(i) (1LL << (i))
#define BIT(x, i) (((x) >> (i)) & 1)
#define pb push_back
#define pf push_front
#define pob pop_back
#define pof pop_front
#define emp emplace_back
#define fi first
#define se second
#define mp make_pair
#define Fill(v, x) fill(all((v)), (x))
#define Mem(v, a) memset((v), (a), sizeof((v)))
#define MINE(v) *min_element(all(v))
#define MAXE(v) *max_element(all(v))
#define el "\n"
#define MIN_HIGH(x, y) (high[x] < high[y] ? (x) : (y))
#define Chris_ signed main()
#define Faster ios::sync_with_stdio(false); cin.tie(nullptr);
#define showTime() cerr << '\n' << "Running time: " << (1.0 * clock() / CLOCKS_PER_SEC) << "s\n";
#define File(Chris) if(fopen(Chris".inp", "r")){freopen(Chris".inp", "r", stdin);freopen(Chris".out", "w", stdout);}
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, int> pli;
typedef pair<ll, ll> pll;
typedef set<int> sii;
typedef map<int, int> mii;
typedef stack<int> sti;
typedef deque<int> dqi;
typedef queue<int> quei;
typedef unordered_map<int, int> umii;
typedef unordered_set<int> umsii;
typedef vector<int> vii;
typedef vector<ll> vll;
typedef vector<vii> ivi;
typedef vector<vll> ivl;
template<class X, class Y>
bool maximize(X &x, const Y &y) {
if (x < y) {
x = y;
return true;
}
else return false;
}
template<class X, class Y>
bool minimize(X &x, const Y &y) {
if (x > y) {
x = y;
return true;
} else return false;
}
static constexpr ll mod = 1e9 + 7;
static constexpr int inf = (int) 1e5 + 5;
static constexpr ll INF = (ll) 1e9;
static constexpr ld eps = 1e-8;
static constexpr ll NINF = (ll) -1e9;
static constexpr int MAXN = (int) 1e3;
static constexpr int LOG = (int) 20;
static constexpr int base1 = (int) 131;
static constexpr int base2 = (int) 91;
static constexpr ll m2 = 1LL * mod * mod;
static constexpr ll mod_pow(ll x, ll e, ll m) { ll r = 1; x %= m; while (e > 0) { if (e & 1) r = (r * x) % m; x = (x * x) % m; e >>= 1; } return r; }
#define plus(a, b, m) ((((a) % (m)) + ((b) % (m))) % (m))
#define minus(a, b, m) ((((a) % (m)) - ((b) % (m))) % (m))
#define mul(a, b, m) ((((a) % (m)) * ((b) % (m))) % (m))
#define divide(a,b,m) (((ll)(a) % (m)) * mod_pow((ll)(b), (m) - 2, (m)) % (m))
static constexpr int dx4[4] = {-1, 1, 0, 0};
static constexpr int dy4[4] = {0, 0, -1, 1};
//#define int long long
int m, n;
int u, v, cur;
int matchX[inf], matchY[inf];
int used[inf];
vii adj[inf];
int N, W, H;
vector<pii> pts;
vii leftId, rightId;
ivi grid;
bool dfs(int u) {
if (used[u] == cur) return false;
used[u] = cur;
for (int v : adj[u]) {
if (matchX[v] == 0 || dfs(matchX[v])) {
matchX[v] = u;
matchY[u] = v;
return true;
}
}
return false;
}
void Inp(){
cin >> N >> W >> H;
pts.assign(N+1, {0,0});
grid.assign(W + 1, vii(H + 1, 0));
FORD(i,1,N) {
int x,y; cin >> x >> y;
pts[i] = {x,y};
if (x >= 0 && x <= W && y >= 0 && y <= H) grid[x][y] = i;
}
}
void Solve() {
Inp();
int total = N;
leftId.assign(N+1, 0);
rightId.assign(N+1, 0);
int L = 0, R = 0;
FORD(i, 1, N) {
int x = pts[i].fi, y = pts[i].se;
if (((x + y) & 1) == 0) leftId[i] = ++L;
else rightId[i] = ++R;
}
m = L;
n = R;
FORD(i,1,m) adj[i].clear();
FORD(i,1,N) if (leftId[i]) {
int x = pts[i].fi, y = pts[i].se;
FOR(d, 0, 4) {
int nx = x + dx4[d], ny = y + dy4[d];
if (nx >= 0 && nx <= W && ny >= 0 && ny <= H) {
int j = grid[nx][ny];
if (j != 0 && rightId[j]) adj[leftId[i]].pb(rightId[j]);
}
}
}
Mem(matchX, 0);
Mem(matchY, 0);
Mem(used, 0);
int res = 0;
for (cur = 1; cur <= m; ++cur) {
if (matchY[cur] == 0) {
res += dfs(cur);
}
}
int ans = total - res;
cout << ans << el;
return;
}
Chris_ {
Faster
File(Chris)
Solve();
showTime();
return 0;
}
Editor is loading...
Leave a Comment