Submission
Status:
PPPPPPPPPP
Subtask/Task Score:
100/100
Score: 100
User: qweqwe
Problemset: ถังดักนิวทริโน
Language: cpp
Time: 0.004 second
Submitted On: 2026-02-25 21:28:58
#include <bits/stdc++.h>
#define fastio cin.tie(0)->sync_with_stdio(0)
using namespace std;
using ll = long long;
using pii = pair<ll,ll>;
using db = long double;
vector<ll> parents;
vector<vector<ll>> allParents;
void findLastParent(int n,int i){
allParents[i].push_back(parents[n]);
if (parents[n]==0) return;
if (n==parents[n]) return;
findLastParent(parents[n],i);
}
int main(){
fastio;
int n,m;
cin >> n >> m;
parents.resize(n+1);
allParents.resize(n+1);
vector<vector<ll>> buckets(n+1);
vector<ll> intervals(100001,0);
for (int i=1;i<=n;i++){
ll st,en;
cin >> st >> en;
parents[i] = intervals[st];
for (int j=st;j<=en;j++){
intervals[j] = i;
}
findLastParent(parents[i],i);
vector<ll> grandParents = allParents[i];
buckets[parents[i]].push_back(i);
/*
for (ll j:parents){
cout << j << " ";
}cout << "\n";
*/
for (ll grandParent:grandParents){
//cout << grandParent << " ";
if (grandParent != parents[i])buckets[grandParent].push_back(i);
}//cout << "\n";
buckets[i].push_back(i);
}
unordered_set<ll> req;
for (int i=0;i<m;i++){
int q;
cin >> q;
req.insert(q);
}
vector<ll> pickedBuckets;
while (!req.empty()){
ll minAllBucket = 0, maxReqBucket = 0, index = -1;
for (int i=1;i<=n;i++){
ll tempBucket = 0;
for (int j:buckets[i]){
if (req.count(j)){
tempBucket++;
}
}
ll curBucket = (ll)buckets[i].size();
if (tempBucket >= maxReqBucket){
if (tempBucket == maxReqBucket){
if (minAllBucket > curBucket){
minAllBucket = curBucket;
index = i;
}
}else{
minAllBucket = (ll)buckets[i].size();
maxReqBucket = tempBucket;
index = i;
}
}
//cout << i << " " << minAllBucket << " " << maxReqBucket << " " << index << "\n";
}
for (int j:buckets[index]){
if (req.count(j)){
req.erase(j);
}
}
pickedBuckets.push_back(index);
}
sort(pickedBuckets.begin(),pickedBuckets.end());
cout << pickedBuckets.size() << "\n";
for (ll i:pickedBuckets){
cout << i << " ";
}
return 0;
}