QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#184420#5668. Cell Nuclei Detectionucup-team1508#AC ✓4725ms36696kbC++143.0kb2023-09-20 18:52:092023-09-20 18:52:09

Judging History

你现在查看的是最新测评结果

  • [2023-09-20 18:52:09]
  • 评测
  • 测评结果:AC
  • 用时:4725ms
  • 内存:36696kb
  • [2023-09-20 18:52:09]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
const int N=200010,M=6000010;
const int inf=0x3f3f3f3f;
typedef long long ll;
#define pii pair<int,int>
#define mp make_pair

int intersect(int l1,int r1,int l2,int r2) { return max(0,min(r1,r2)-max(l1,l2)); }

int head[N],ver[M],edge[M],nxt[M],d[N];
int n,m,tot=1,s=N-1,t=N-2;
void add_edge(int x,int y,int z)
{
    ver[++tot]=y,edge[tot]=z,nxt[tot]=head[x],head[x]=tot;
}
void add(int x,int y,int z)
{
    add_edge(x,y,z),add_edge(y,x,0);
}
queue<int> q;
bool bfs()
{
    while(q.size()) q.pop();
    q.push(s);
    for(int i=1;i<=m+n;i++) d[i]=0;
    d[t]=0,d[s]=1;
    while(q.size())
    {
        int x=q.front(); q.pop();
        for(int i=head[x];i;i=nxt[i])
        {
            int y=ver[i];
            if(edge[i]&&!d[y])
            {
                d[y]=d[x]+1;
                q.push(y);
            }
        }
    }
    return d[t];
}
int dinic(int x,int flow)
{
    if(x==t||!flow) return flow;
    int rest=flow,k;
    for(int i=head[x];i&&rest;i=nxt[i])
    {
        int y=ver[i];
        if(edge[i]&&d[y]==d[x]+1)
        {
            k=dinic(y,min(edge[i],rest));
            if(!k) d[y]=0;
            rest-=k,edge[i]-=k,edge[i^1]+=k;
        }
    }
    return flow-rest;
}
int get_maxflow()
{
    // for(int x=0;x<N;x++) if(head[x])
    // {
    //     cerr<<x<<": \n";
    //     for(int i=head[x];i;i=nxt[i]) if(edge[i])
    //         cerr<<ver[i]<<" "<<edge[i]<<"\n";
    // }

    int maxflow=0,flow=0;
    while(bfs()) while(flow=dinic(s,inf)) maxflow+=flow;
    return maxflow;
}

map<pii,map<pii,int>> num;
map<pair<pii,pii>,int> id;
int id_cnt=0;

void sol()
{
    // cerr<<intersect(1,2,3,4)<<"\n";
    num.clear(),id.clear(),id_cnt=0;
    for(int i=1;i<=m+n;i++) head[i]=0;
    head[s]=head[t]=0,tot=1;

    scanf("%d%d",&m,&n);
    for(int i=1;i<=m;i++)
    {
        int x1,y1,x2,y2; scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
        num[mp(x1,x2)][mp(y1,y2)]++;
    }
    for(auto [x,tmp]:num) for(auto [y,z]:tmp) add(s,id[mp(x,y)]=++id_cnt,z);

    ll ans=0;
    for(int i=1;i<=n;i++)
    {
        int x1,y1,x2,y2; scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
        add(m+i,t,1);
        // cerr<<"("<<x1<<","<<x2<<"), ("<<y1<<","<<y2<<"): \n";
        for(int l1=x1-3;l1<=x2;l1++) for(int l2=max(l1,x1)+1;l2<=l1+4;l2++)
            for(int r1=y1-3;r1<=y2;r1++) for(int r2=max(r1,y1)+1;r2<=r1+4;r2++)
                if(intersect(l1,l2,x1,x2)*intersect(r1,r2,y1,y2)*2>=(l2-l1)*(r2-r1))
                {
                    // cerr<<"("<<l1<<","<<l2<<"), ("<<r1<<","<<r2<<") \n";
                    if(num[mp(l1,l2)].find(mp(r1,r2))!=num[mp(l1,l2)].end())
                        // ans+=num[mp(l1,l2)][mp(r1,r2)];
                        add(id[mp(mp(l1,l2),mp(r1,r2))],m+i,1);
                }
    }
    printf("%d\n",get_maxflow());
    // printf("%lld\n",ans);
}

int main()
{
    // cerr<<intersect(1,2,3,4)<<"\n";
    int T; scanf("%d",&T);
    while(T--) sol();
    return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 1ms
memory: 7932kb

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: 1ms
memory: 7944kb

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: 4107ms
memory: 33948kb

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: 2790ms
memory: 36696kb

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: 1692ms
memory: 19704kb

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: 4725ms
memory: 33760kb

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: 1ms
memory: 8228kb

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'