QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#186058 | #5668. Cell Nuclei Detection | aesthetic# | AC ✓ | 3341ms | 148804kb | C++20 | 4.2kb | 2023-09-23 04:09:52 | 2023-09-23 04:09:52 |
Judging History
answer
#include "bits/stdc++.h"
#define endl '\n'
#define f first
#define s second
#define pb push_back
#define mp make_pair
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
#define rep(i, a, b) for (int i = (a); i < (b); ++i)
std::mt19937 rng((int) std::chrono::steady_clock::now().time_since_epoch().count());
using namespace std;
// #define int long long
#define dbg_loc() cerr << __PRETTY_FUNCTION__ << " : " << __LINE__ << "\n"
template<typename A, typename B> ostream& operator<<(ostream &os, const pair<A, B> &p){
return os << '(' << p.first << ", " << p.second << ')';
}
template<typename T_container,typename T=typename enable_if<!is_same<T_container,string>::value, typename T_container::value_type>::type>
ostream& operator<<(ostream &os, const T_container &v){
os << '{'; string sep; for (const T &x : v) os << sep << x, sep = ", "; return os << '}';
}
void dbg_out() { cerr << endl; }
template<typename Head, typename... Tail> void dbg_out(Head H, Tail... T){
cerr << ' ' << H;
dbg_out(T...);
}
#define LOCAL
#define LOCAL
#ifdef LOCAL
#define dbg(...) cerr<<"(" << #__VA_ARGS__<<"):" , dbg_out(__VA_ARGS__) , cerr << endl
#else
#define dbg(...)
#endif
#define per(i, a, b) for(int i = b-1; i>=a ; i--)
#define trav(a, x) for(auto& a : x)
#define allin(a , x) for(auto a : x)
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
ll mod = (1000000007LL);
inline ll Mod(ll a, ll b){return (a%b);}
inline ll poww(ll a, ll b){ll res = 1;while (b > 0){if(b & 1) res = (res * a)%mod;a = (a * a)%mod;b >>= 1;}return res;}
ll gcd (ll a, ll b) { while (b) { a %= b,swap(a, b);}return a;}
void read(vector<int> &w, int n){w.resize(n);for(int i = 0; i < n; i++) cin>>w[i];}
void print(vector<int> &w){for(int i =0; i < sz(w); i++){if(i == sz(w) - 1) cout<<w[i]<<"\n";else cout<<w[i]<<" ";}}
///CUIDADO COM MAXN
#define N 50010 // 1E6
int n, m;
int xi[2][N],yi[2][N], xii[2][N], yii[2][N];
// 0 =ground truth (m cells)
// 1 = guess (n cells)
vi caras[2010][2010];
bool valid(int guess, int truth){
int Lx = max(xi[0][truth], xi[1][guess]);
int Rx = min(xii[0][truth], xii[1][guess]);
int Ly = max(yi[0][truth], yi[1][guess]);
int Ry = min(yii[0][truth], yii[1][guess]);
if(Lx > Rx or Ly > Ry) return false;
int intersect = (Rx-Lx)*(Ry-Ly);
int area = (xii[0][truth] - xi[0][truth])*(yii[0][truth] - yi[0][truth]);
return 2*intersect >= area;
}
struct bipartite_match{ // 1 indice
int n , m;
vector<vi> g; vi vis , match;
bipartite_match(int n , int m) : n(n) , m(m), vis(n+m+2) , match(n+m+2) , g(n+m+2){}
void addLR(int x , int y){ // aresta da esquerda pra direita
g[x].push_back(y + n);
return ;
}
void addRL(int x , int y){ // aresta da direita pra esquerda
g[x+n].push_back(y);
return ;
}
bool dfs(int x){
allin(w,g[x]){
if(vis[w]) continue;
vis[w] = true;
if(match[w] == 0 || dfs(match[w])){
match[w] = x, match[x] = w;
return true;
}
}
return false;
}
int solve(){
int ans = 0; bool haspath;
do{
haspath = false;
fill(all(vis) , false);
for(int i = 1 ; i<= n + m; i ++){
if(!match[i] && dfs(i)) haspath = 1 , ans ++ ;
}
} while(haspath);
return ans;
}
int matchL(int x){return (match[x] ? match[x] - n : 0);}
int matchR(int x){return match[x+n];}
};
void solve_case(){
cin>>m>>n;
rep(i,1,2002)
rep(j,1,2002)
caras[i][j].clear();
rep(i,1,m+1){
cin>>xi[0][i]>>yi[0][i]>>xii[0][i]>>yii[0][i];
}
bipartite_match B(m+1, n+1);
rep(i,1,n+1){
cin>>xi[1][i]>>yi[1][i]>>xii[1][i]>>yii[1][i];
rep(dx, xi[1][i], xii[1][i] + 1){
rep(dy, yi[1][i], yii[1][i] + 1)
caras[dx][dy].pb(i);
}
}
int ans =0;
rep(i,1,m+1){
int can=0;
set<int> vis;
rep(dx, xi[0][i], xii[0][i] + 1){
rep(dy, yi[0][i], yii[0][i] + 1){
for(auto p: caras[dx][dy]){
if(vis.count(p)) continue;
vis.insert(p);
if(valid(p, i)){
B.addLR(i, p);
B.addRL(p, i);
}
}
}
}
// ans += can;
}
rep(i,1,m+n+2){
shuffle(all(B.g[i]), rng);
}
// B.
cout<<B.solve()<<"\n";
}
int32_t main(){
ios::sync_with_stdio(false); cin.tie(0);
int test_case;
cin>>test_case;
while(test_case--){
solve_case();
}
}
详细
Test #1:
score: 100
Accepted
time: 30ms
memory: 98280kb
input:
3 2 2 1 1 3 3 3 3 5 5 2 2 4 4 4 4 6 6 2 3 1 1 3 3 3 3 5 5 1 3 3 5 2 1 4 5 3 1 5 3 3 3 1 1 2 2 2 2 3 3 3 3 4 4 1 1 3 3 2 2 4 4 3 3 5 5
output:
0 1 3
result:
ok 3 lines
Test #2:
score: 0
Accepted
time: 32ms
memory: 98704kb
input:
3 2 2 1 1 3 3 3 3 5 5 2 2 4 4 4 4 6 6 2 3 1 1 3 3 3 3 5 5 1 3 3 5 2 1 4 5 3 1 5 3 3 3 1 1 2 2 2 2 3 3 3 3 4 4 1 1 3 3 2 2 4 4 3 3 5 5
output:
0 1 3
result:
ok 3 lines
Test #3:
score: 0
Accepted
time: 612ms
memory: 142280kb
input:
5 50000 50000 0 0 4 4 4 0 8 4 8 0 12 4 12 0 16 4 16 0 20 4 20 0 24 4 24 0 28 4 28 0 32 4 32 0 36 4 36 0 40 4 40 0 44 4 44 0 48 4 48 0 52 4 52 0 56 4 56 0 60 4 60 0 64 4 64 0 68 4 68 0 72 4 72 0 76 4 76 0 80 4 80 0 84 4 84 0 88 4 88 0 92 4 92 0 96 4 96 0 100 4 100 0 104 4 104 0 108 4 108 0 112 4 112 ...
output:
50000 50000 0 50000 3150
result:
ok 5 lines
Test #4:
score: 0
Accepted
time: 378ms
memory: 148804kb
input:
5 50000 50000 0 0 1 1 1 0 2 1 2 0 3 1 3 0 4 1 4 0 5 1 5 0 6 1 6 0 7 1 7 0 8 1 8 0 9 1 9 0 10 1 10 0 11 1 11 0 12 1 12 0 13 1 13 0 14 1 14 0 15 1 15 0 16 1 16 0 17 1 17 0 18 1 18 0 19 1 19 0 20 1 20 0 21 1 21 0 22 1 22 0 23 1 23 0 24 1 24 0 25 1 25 0 26 1 26 0 27 1 27 0 28 1 28 0 29 1 29 0 30 1 30 0 ...
output:
50000 25050 12500 16000 8000
result:
ok 5 lines
Test #5:
score: 0
Accepted
time: 263ms
memory: 136540kb
input:
5 50000 50000 0 0 2 4 4 0 7 1 8 0 10 1 12 0 15 3 16 0 19 1 20 0 22 2 24 0 26 4 28 0 30 4 32 0 36 3 36 0 40 1 40 0 44 1 44 0 47 2 48 0 49 3 52 0 54 1 56 0 59 4 60 0 64 3 64 0 68 3 68 0 70 1 72 0 76 4 76 0 80 3 80 0 84 4 84 0 87 2 88 0 90 1 92 0 94 4 96 0 98 1 100 0 104 1 104 0 107 2 108 0 110 4 112 0...
output:
10594 10779 10618 10381 10779
result:
ok 5 lines
Test #6:
score: 0
Accepted
time: 3341ms
memory: 119788kb
input:
5 50000 50000 0 0 4 4 1 0 5 4 2 0 6 4 3 0 7 4 4 0 8 4 5 0 9 4 6 0 10 4 7 0 11 4 8 0 12 4 9 0 13 4 10 0 14 4 11 0 15 4 12 0 16 4 13 0 17 4 14 0 18 4 15 0 19 4 16 0 20 4 17 0 21 4 18 0 22 4 19 0 23 4 20 0 24 4 21 0 25 4 22 0 26 4 23 0 27 4 24 0 28 4 25 0 29 4 26 0 30 4 27 0 31 4 28 0 32 4 29 0 33 4 30...
output:
50000 50000 50000 50000 49600
result:
ok 5 lines
Test #7:
score: 0
Accepted
time: 19ms
memory: 98540kb
input:
1 4 4 1 1 3 3 2 1 4 3 1 2 3 4 2 2 4 4 2 1 4 3 3 2 5 4 1 2 3 4 2 3 4 5
output:
3
result:
ok single line: '3'