제출 #477686

#제출 시각아이디문제언어결과실행 시간메모리
477686lory1608Bitaro’s Party (JOI18_bitaro)C++17
7 / 100
2081 ms14668 KiB
#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define PII pair<int,int>
#define ll long long
#define pb push_back
#define sz(x) (int)(x.size())
#define gc getchar()
#define mk make_pair
#define gc (_p1==_p2&&(_p2=(_p1=_buf)+fread(_buf,1,100000,stdin),_p1==_p2)?EOF:*_p1++)
using namespace std;
char _buf[100000],*_p1=_buf,*_p2=_buf;
inline int gi()
{
	int x=0,f=1;
	char ch=gc;
	while(ch<'0'||ch>'9')
	{
		if(ch=='-')f=-1;
		ch=gc;
	}
	while(ch>='0'&&ch<='9')
	{
		x=(x<<3)+(x<<1)+(ch^48);
		ch=gc;
	}
	return (f==1)?x:-x;
}
const int maxn=2e5+5,B=210,inf=1e9;
priority_queue<pair<int,int>>pq[maxn];
int ind[maxn],tmp[maxn],c[maxn];
vector<int>e[maxn];
int dp[maxn],n,m,Q,t,y;
inline void input()
{
	n=gi(),m=gi(),Q=gi();
	FOR(i,1,m)
	{
		int u=gi(),v=gi();
		e[u].pb(v);tmp[v]++;
	}
}
bool vis[maxn];
int q[maxn],hd,tl;
inline void count()
{
	FOR(i,1,n)ind[i]=tmp[i],dp[i]=-inf;
	hd=0,tl=-1;
	FOR(i,1,n)if(!ind[i])q[++tl]=i;
	FOR(i,1,n)if(!vis[i])dp[i]=0;
	while(hd<=tl)
	{
		int u=q[hd++];
		for(int v:e[u])
		{
			dp[v]=max(dp[u]+1,dp[v]);
			ind[v]--;
			if(ind[v]==0)q[++tl]=v;
		}
	}
	printf("%d\n",dp[t]<0?-1:dp[t]);
}
inline void count2()
{
	priority_queue<pair<int,int>>pq=::pq[t];
	while(!pq.empty())
	{
		auto [w,id]=pq.top();
		pq.pop();
		if(vis[id])continue;
		else {return printf("%d\n",w),void();}
	}
	puts("-1");
}
bool bk[maxn];
inline auto merge(int x,int y)
{
	priority_queue<pair<int,int>>q,q1=pq[x],q2=pq[y];
	vector<int>temp;
	while(sz(temp)<=B)
	{
		if(q1.empty()&&q2.empty())break;
		pair<int,int>v;
		if(q1.empty())v=q2.top(),v.first++,q2.pop();
		else if(q2.empty())v=q1.top(),q1.pop();
		else if(q1.top().first>q2.top().first)v=q1.top(),q1.pop();
		else v=q2.top(),q2.pop(),v.first++;
		if(!bk[v.second])q.push(v),bk[v.second]=1,temp.pb(v.second);
	}
	for(int x:temp)bk[x]=0;
	return q;
}
inline void solve()
{
	queue<int>q;
	FOR(i,1,n)ind[i]=tmp[i],pq[i].push({0,i});
	FOR(i,1,n)if(!ind[i])q.push(i);
	while(!q.empty())
	{
		int u=q.front();q.pop();
		for(int v:e[u])
		{
			pq[v]=merge(v,u),ind[v]--;
			if(ind[v]==0)q.push(v);
		}
	}
	FOR(i,1,Q)
	{
		t=gi(),y=gi();
		FOR(j,1,y)c[j]=gi();
		FOR(j,1,y)vis[c[j]]=1;
		if(y>=B)count();
		else count2();
		FOR(j,1,y)vis[c[j]]=0;
	}
}
int main()
{
	//freopen("03-06.in","r",stdin);
	//freopen("03-06.out","w",stdout);
	input();
	solve();
	return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

bitaro.cpp:10: warning: "gc" redefined
   10 | #define gc (_p1==_p2&&(_p2=(_p1=_buf)+fread(_buf,1,100000,stdin),_p1==_p2)?EOF:*_p1++)
      | 
bitaro.cpp:8: note: this is the location of the previous definition
    8 | #define gc getchar()
      |
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...