QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#691288#9424. Stop the Castle 2fzxWA 8ms106264kbC++144.2kb2024-10-31 10:44:392024-10-31 10:44:40

Judging History

This is the latest submission verdict.

  • [2024-10-31 10:44:40]
  • Judged
  • Verdict: WA
  • Time: 8ms
  • Memory: 106264kb
  • [2024-10-31 10:44:39]
  • 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 {
        return x.dis_v<dis_v;
    }
};
priority_queue <_node_queue> q;
void ins(int x) {
    int yy=calc1(x)+calc2(x);
    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) ins(it2->id);
    }
    if (it!=s1[cc].end()) {
        auto it2=it;it2++;
        if (it2!=s1[cc].end() && it2->id>n) ins(it2->id);
    }
}
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) ins(it2->id);
    }
    if (it!=s2[dd].end()) {
        auto it2=it;it2++;
        if (it2!=s2[dd].end() && it2->id>n) ins(it2->id);
    }
}

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<<" 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;   
}

详细

Test #1:

score: 0
Wrong Answer
time: 8ms
memory: 106264kb

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 1 6 
2
1 
0
1 2 

result:

wrong answer Participant states the answer to be 4 but is actually 5 (test case 1)