제출 #582030

#제출 시각아이디문제언어결과실행 시간메모리
582030MrDeboo도서관 (JOI18_library)C++17
100 / 100
1342 ms760 KiB
#include <cstdio> #include <vector> #include <bits/stdc++.h> #include "library.h" using namespace std; vector<pair<int,int>>vec; int N,L,R,n; int Slv(int x){ vector<int>vct[n]; for(auto &i:vec){ if(i.first>=L&&i.second<=R){ vct[i.first].push_back(i.second); vct[i.second].push_back(i.first); } } int ans=0; vector<int>bl(n); for(int i=0;i<n;i++){ if(bl[i]||vct[i].empty())continue; int cnt=0; deque<int>dq={i}; while(dq.size()){ int a=dq.front(); dq.pop_front(); if(bl[a])continue; bl[a]=1; cnt++; for(auto &w:vct[a])dq.push_back(w); } ans++; } x-=ans; int cnt=0; for(int i=L;i<=R;i++){ if(!bl[i])cnt++; } return (x!=cnt); } int Range(int l,int r){ vector<int>v(n); for(int w=l;w<=r;w++)v[w]=1; L=l; R=r; return Slv(Query(v)); } void Solve(int GGGG){ n=GGGG; vector<int>res; if(n==1){ res.push_back(1); Answer(res); return; } vector<int>vct[n]; N=exp2(ceil(log2(n))); for(int i=0;i<n;i++){ while(vct[i].size()<2){ int l=i+1,r=n-1,mid,f=0; while(l<=r){ mid=(l+r)/2; if(Range(i,mid)){ r=mid-1; f=mid; }else l=mid+1; } if(f==0)break; l=i;r=f-1; int g=0; while(l<=r){ mid=(l+r)/2; if(Range(mid,f)){ l=mid+1; g=mid; }else r=mid-1; } vec.push_back({g,f}); vct[g].push_back(f); vct[f].push_back(g); } } deque<int>dq; for(int i=0;i<n&&dq.empty();i++){ if(vct[i].size()==1)dq.push_back(i); } vector<bool>bl(n); while(dq.size()){ int a=dq.front(); dq.pop_front(); if(bl[a])continue; bl[a]=1; res.push_back(a+1); for(auto &i:vct[a])dq.push_back(i); } Answer(res); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...