QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#691300#9424. Stop the Castle 2fzxWA 227ms125988kbC++144.7kb2024-10-31 10:50:072024-10-31 10:50:09

Judging History

This is the latest submission verdict.

  • [2024-10-31 10:50:09]
  • Judged
  • Verdict: WA
  • Time: 227ms
  • Memory: 125988kb
  • [2024-10-31 10:50:07]
  • Submitted

answer

#include <bits/stdc++.h>
#define int long long 
#define pb push_back
using namespace std;
const int INF=1e6+5;
int n,m,k,dis_[INF],a[INF],b[INF],c[INF],d[INF];
struct P3{
    int x,id;
    bool operator < (const P3 &xx) const {
        return x<xx.x;
    }
};
multiset <P3> s1[INF],s2[INF];
vector <int> cnt1,cnt2;
int Get1(int x) {return lower_bound(cnt1.begin(),cnt1.end(),x)-cnt1.begin()+1;}
int Get2(int x) {return lower_bound(cnt2.begin(),cnt2.end(),x)-cnt2.begin()+1;}

int calc5(int x) {
    int cc=Get1(a[x]),L1=0;
    auto it=s1[cc].lower_bound({b[x],x});
    if (it!=s1[cc].begin()) {
        auto it2=it;it2--;
        if (it2->id<=n) L1++;
    }
    if (it!=s1[cc].end()) {
        auto it2=it;it2++;
        if (it2!=s1[cc].end() && it2->id<=n) L1++;
    }
    return L1;
}
int calc6(int x) {
    int dd=Get2(b[x]),L1=0;
    auto it=s2[dd].lower_bound({a[x],x});
    if (it!=s2[dd].begin()) {
        auto it2=it;it2--;
        if (it2->id<=n) L1++;
    }
    if (it!=s2[dd].end()) {
        auto it2=it;it2++;
        if (it2!=s2[dd].end() && it2->id<=n) L1++;
    }
    return L1;
}

int calc1(int x) {
    int cc=Get1(c[x]),L1=0;
    auto it=s1[cc].lower_bound({d[x],x});
    if (it!=s1[cc].begin()) {
        auto it2=it;it2--;
        if (it2->id<=n) L1++;
    }
    if (it!=s1[cc].end()) {
        auto it2=it;it2++;
        if (it2!=s1[cc].end() && it2->id<=n) L1++;
    }
    return L1==2;
}
int calc2(int x) {
    int dd=Get2(d[x]),L1=0;
    auto it=s2[dd].lower_bound({c[x],x});
    if (it!=s2[dd].begin()) {
        auto it2=it;it2--;
        if (it2->id<=n) L1++;
    }
    if (it!=s2[dd].end()) {
        auto it2=it;it2++;
        if (it2!=s2[dd].end() && it2->id<=n) L1++;
    }
    return L1==2;
}
struct _node_queue {
    int dis_v,pos;
    bool operator < (const _node_queue &x) const {
        if (x.dis_v!=dis_v) return x.dis_v<dis_v;
        else return x.pos<pos;
    }
};
priority_queue <_node_queue> q;
void ins(int x) {
    x-=n;
    int yy=calc1(x)+calc2(x);
    // cerr<<x<<" "<<yy<<" qoweij\n";
    if (dis_[x]==yy) return ;
    dis_[x]=yy;
    q.push({dis_[x],x});   
}

void calc3(int x) {
    int cc=Get1(c[x]);
    auto it=s1[cc].lower_bound({d[x],x});
    if (it!=s1[cc].begin()) {
        auto it2=it;it2--;
        if (it2->id>n) {
            s1[cc].erase({d[x],x+n});
            ins(it2->id);
            s1[cc].insert({d[x],x+n});
        }
    }
    if (it!=s1[cc].end()) {
        auto it2=it;it2++;
        if (it2!=s1[cc].end() && it2->id>n) {
            s1[cc].erase({d[x],x+n});
            ins(it2->id);
            s1[cc].insert({d[x],x+n});
        }
    }
}
void calc4(int x) {
    int dd=Get2(d[x]);
    auto it=s2[dd].lower_bound({c[x],x});
    if (it!=s2[dd].begin()) {
        auto it2=it;it2--;
        if (it2->id>n) {
            s2[dd].erase({c[x],x+n});
            ins(it2->id);
            s2[dd].insert({c[x],x+n});
        }
    }
    if (it!=s2[dd].end()) {
        auto it2=it;it2++;
        if (it2!=s2[dd].end() && it2->id>n) {
            s2[dd].erase({c[x],x+n});
            ins(it2->id);
            s2[dd].insert({c[x],x+n});
        }
    }
}

void solve() {
    cnt1.clear();cnt2.clear();
    cin>>n>>m>>k;
    for (int i=1;i<=n;i++) cin>>a[i]>>b[i];
    for (int i=1;i<=m;i++) cin>>c[i]>>d[i];
    for (int i=1;i<=n;i++) cnt1.pb(a[i]);
    for (int i=1;i<=m;i++) cnt1.pb(c[i]);
    sort(cnt1.begin(),cnt1.end());
    cnt1.erase(unique(cnt1.begin(),cnt1.end()),cnt1.end());
    for (int i=1;i<=n;i++) cnt2.pb(b[i]);
    for (int i=1;i<=m;i++) cnt2.pb(d[i]);
    sort(cnt2.begin(),cnt2.end());
    cnt2.erase(unique(cnt2.begin(),cnt2.end()),cnt2.end());

    for (int i=1;i<=n;i++) s1[Get1(a[i])].insert({b[i],i});
    for (int i=1;i<=m;i++) s1[Get1(c[i])].insert({d[i],i+n});
    for (int i=1;i<=n;i++) s2[Get2(b[i])].insert({a[i],i});
    for (int i=1;i<=m;i++) s2[Get2(d[i])].insert({c[i],i+n});
    for (int i=1;i<=m;i++) {
        dis_[i]=calc1(i)+calc2(i);
        q.push({dis_[i],i});
    }
    vector <int> ans;
    int res=0;
    for (int i=1;i<=n;i++) res+=calc5(i)+calc6(i);
    res/=2;
    while (q.size()) {
        int x=q.top().pos,dd=q.top().dis_v;q.pop();
        // cerr<<x<<" "<<dd<<" "<<res<<" "<<dis_[x]<<" qweroij\n";
        if (dd!=dis_[x]) continue;
        if (!k) break;k--;
        res+=dis_[x];ans.pb(x);
        calc3(x);calc4(x);
        s1[Get1(c[x])].erase({d[x],x+n});
        s2[Get2(d[x])].erase({c[x],x+n});
    }
    cout<<res<<"\n";
    for (int w:ans) cout<<w<<" ";
    cout<<"\n";
}
signed main()
{
    ios::sync_with_stdio(false);
    int t=0;cin>>t;
    while (t--) solve();
    return 0;   
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 17ms
memory: 106404kb

input:

3
8 6 4
1 3
2 1
2 6
4 1
4 7
6 1
6 3
6 6
2 3
3 1
4 3
4 6
5 2
6 4
3 2 1
10 12
10 10
10 11
1 4
1 5
1 3 2
1 1
2 1
2 2
2 3

output:

4
3 5 2 6 
2
1 
0
1 2 

result:

ok ok 3 cases (3 test cases)

Test #2:

score: -100
Wrong Answer
time: 227ms
memory: 125988kb

input:

1224
11 17 14
7 3
4 2
8 13
3 15
3 4
5 11
10 2
3 3
8 6
7 11
2 3
10 4
1 3
12 1
2 5
11 9
11 6
11 10
8 15
1 5
9 14
4 11
1 6
10 7
7 6
11 4
8 4
1 11
18 3 2
14 8
2 14
13 13
9 12
14 12
5 6
8 1
10 5
8 6
8 9
6 6
7 5
12 11
6 11
13 5
1 10
7 6
14 5
6 15
2 4
11 1
1 6 4
14 14
13 9
9 3
10 12
7 5
8 13
9 14
1 9 8
4 9...

output:

7
1 2 3 4 5 6 7 8 9 10 11 12 13 15 
21
1 3 
0
1 2 3 4 
0
1 2 3 4 5 6 6 7 
24
3 9 
18
2 3 1 
0
1 2 3 4 5 6 7 8 9 10 11 12 
8
1 2 3 4 5 6 8 
17
1 5 6 
2
1 2 3 4 5 6 8 10 
10
1 2 
19
5 5 6 
6
1 2 3 4 5 6 7 7 8 8 9 
0
1 
5
1 2 
1
2 3 4 
20
1 2 3 5 8 
7
1 2 4 5 8 
11
1 3 4 5 6 7 
2
1 
3
1 2 3 4 4 5 
32
3...

result:

wrong answer Participant states the answer to be 21 but is actually 15 (test case 2)