이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5+5;
const int sqrtn = 320;
int w,e;
vector<pair<int,int>> res;
int n,m,q;
bool blocked[MAXN];
int dp[MAXN];
vector<int> v1[MAXN];
vector<int> v1rev[MAXN];
vector<pair<int,int>> temp[MAXN];
vector<int> hold;
void merge(vector<pair<int,int>> a,vector<pair<int,int>> b){
for(int i=0;i<b.size();i++){
a.push_back(make_pair(b[i].first+1,b[i].second));
}
//dist,node
sort(a.begin(),a.end());
reverse(a.begin(),a.end());
int cnt = 0;
map<int,int> m1;
for(int i=0;i<a.size() && cnt<=sqrtn;i++){
if(!m1[a[i].second]){
//if node not seen yet, add it to possible nodes,set it tp the distance
m1[a[i].second] = a[i].first;
cnt++;
}else{
m1[a[i].second] = max(m1[a[i].second],a[i].first);
}
}
res.clear();
for(auto x = m1.begin();x!=m1.end();x++){
res.push_back(make_pair(x->second,x->first));
}
reverse(res.begin(),res.end());
while(res.size()>sqrtn){
res.pop_back();
}
}
int dodp(int t){
for(int i=1;i<=n;i++){
blocked[i] = false;
dp[i] = 0;
}
for(int i=0;i<hold.size();i++){
blocked[hold[i]] = true;
}
for(int i=1;i<=n;i++){
if(blocked[i]){
dp[i] = -1e9;
}else{
dp[i] = 0;
}
for(int x:v1rev[i]){
dp[i] = max(dp[i],dp[x]+1);
}
}
return max(-1,dp[t]);
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin>>n>>m>>q;
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
v1[u].push_back(v);
v1rev[v].push_back(u);
//v1rev -> backwards
}
for(int i=1;i<=n;i++){
temp[i].push_back(make_pair(0,i));
for(int x:v1rev[i]){
w=i;
e=x;
//temp[v].push_back(make_pair(1,1));
merge(temp[i],temp[x]);
//Keep merging temp[i] with nodes which connect to it to find furthest nodes
temp[i].clear();
for(auto y:res){
temp[i].push_back(y);
// cout<<i<<" "<<y.first<<" "<<y.second<<endl;
}
}
for(auto y:temp[i]){
// cout<<i<<" "<<y.second<<" "<<y.first<<endl;
}
}
for(int i=1;i<=n;i++){
sort(temp[i].begin(),temp[i].end());
reverse(temp[i].begin(),temp[i].end());
}
while(q--){
int t,c;
cin>>t>>c;
// cout<<t<<" "<<c<<endl;
hold.clear();
// set<int> s1;
for(int i=1;i<=c;i++){
int x;
cin>>x;
hold.push_back(x);
//s1.insert(x);
}
sort(hold.begin(),hold.end());
if(hold.size()>sqrtn){
cout<<dodp(t)<<"\n";
}else{
bool ok = false;
for(auto x:temp[t]){
if(!binary_search(hold.begin(),hold.end(),x.second)){
cout<<x.first<<"\n";
ok = true;
break;
}
}
if(!ok){
cout<<-1<<"\n";
}
}
}
}
컴파일 시 표준 에러 (stderr) 메시지
bitaro.cpp: In function 'void merge(std::vector<std::pair<int, int> >, std::vector<std::pair<int, int> >)':
bitaro.cpp:17:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i=0;i<b.size();i++){
~^~~~~~~~~
bitaro.cpp:26:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i=0;i<a.size() && cnt<=sqrtn;i++){
~^~~~~~~~~
bitaro.cpp: In function 'int dodp(int)':
bitaro.cpp:50:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i=0;i<hold.size();i++){
~^~~~~~~~~~~~
bitaro.cpp: In function 'int main()':
bitaro.cpp:92:18: warning: variable 'y' set but not used [-Wunused-but-set-variable]
for(auto y:temp[i]){
^
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |