QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#184407#5668. Cell Nuclei Detectionucup-team1508#TL 1ms9840kbC++143.0kb2023-09-20 18:41:462023-09-20 18:41:47

Judging History

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

  • [2023-09-20 18:41:47]
  • 评测
  • 测评结果:TL
  • 用时:1ms
  • 内存:9840kb
  • [2023-09-20 18:41:46]
  • 提交

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)+1); }

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()
{
    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-4;l1<=x2;l1++) for(int l2=l1;l2<=l1+4;l2++) if(intersect(l1,l2,x1,x2)*2>=l2-l1+1)
            for(int r1=y1-4;r1<=y2;r1++) for(int r2=r1;r2<=r1+4;r2++)
                if(intersect(l1,l2,x1,x2)*intersect(r1,r2,y1,y2)*2>=(l2-l1+1)*(r2-r1+1))
                {
                    // 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()
{
    int T; scanf("%d",&T);
    while(T--) sol();
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

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: 9840kb

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: -100
Time Limit Exceeded

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:


result: