QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#691300 | #9424. Stop the Castle 2 | fzx | WA | 227ms | 125988kb | C++14 | 4.7kb | 2024-10-31 10:50:07 | 2024-10-31 10:50:09 |
Judging History
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)