# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
172413 | mhy908 | Bitaro’s Party (JOI18_bitaro) | C++14 | 1990 ms | 91416 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define F first
#define S second
#define all(x) x.begin(), x.end()
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
typedef pair<LL, LL> pll;
const LL llinf=9000000000000000000;
const int inf=2000000000;
int n, m, q;
vector<int> link[100010];
vector<int> rlink[100010];
vector<pii> noq;
vector<int> y[100010];
int indeg[100010];
int topol[100010], l, r;
pii dp[100010][90];
int ans[100010];
const int buc=50;
int dp2[100010];
bool ch[100010];
int get_dp(int num, int qnum){
memset(dp2, 0, sizeof(dp2));
for(auto i:y[qnum])dp2[i]=-inf;
for(int i=1; i<=n; i++){
for(auto j:rlink[topol[i]]){
dp2[topol[i]]=max(dp2[topol[i]], dp2[j]+1);
}
if(topol[i]==num)return dp2[num];
}
}
int main()
{
scanf("%d %d %d", &n, &m, &q);
for(int i=1; i<=m; i++){
int a, b;
scanf("%d %d", &a, &b);
link[a].pb(b);
rlink[b].pb(a);
indeg[b]++;
}
for(int i=1; i<=n; i++){
if(!indeg[i])topol[++r]=i;
}
for(l=1; l<=r; l++){
for(auto i:link[topol[l]]){
indeg[i]--;
if(!indeg[i])topol[++r]=i;
}
}
for(int i=1; i<=n; i++){
vector<pii> vc;
vector<int> temp;
vc.pb(mp(0, topol[i]));
for(auto j:rlink[topol[i]]){
for(int k=1; dp[j][k].S; k++){
vc.pb(mp(dp[j][k].F+1, dp[j][k].S));
}
}
sort(all(vc), greater<pii>());
vc.erase(unique(all(vc)), vc.end());
int num=0;
for(int j=0; num<=buc&&j<vc.size(); j++){
if(ch[vc[j].S])continue;
ch[vc[j].S]=true;
temp.pb(vc[j].S);
dp[topol[i]][++num]=vc[j];
}
for(auto j:temp)ch[j]=false;
}
for(int i=1; i<=q; i++){
int num, sz;
scanf("%d %d", &num, &sz);
for(int j=1; j<=sz; j++){
int a;
scanf("%d", &a);
y[i].pb(a);
}
sort(all(y[i]));
for(int j=1; j<=buc; j++){
if(dp[num][j].S==0){
ans[i]=-1;
break;
}
if(!binary_search(all(y[i]), dp[num][j].S)){
ans[i]=dp[num][j].F;
break;
}
if(j==buc)noq.pb(mp(i, num));
}
}
for(auto i:noq){
ans[i.F]=get_dp(i.S, i.F);
if(ans[i.F]<0)ans[i.F]=-1;
}
for(int i=1; i<=q; i++){
printf("%d\n", ans[i]);
}
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |