QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#691288 | #9424. Stop the Castle 2 | fzx | WA | 8ms | 106264kb | C++14 | 4.2kb | 2024-10-31 10:44:39 | 2024-10-31 10:44:40 |
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 {
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)