Pagini recente » Cod sursa (job #3141321) | Cod sursa (job #2874378) | Cod sursa (job #2518971) | Cod sursa (job #2657475) | Cod sursa (job #1247859)
#include <cstdio>
#include <set>
using namespace std;
#define F first
#define S second
#define NMAX 9000
struct node_inf
{
int value;
int index;
};
set < int > G[NMAX],Ginv[NMAX];
node_inf T_intern[4*NMAX],T_extern[4*NMAX];
int N,M,i,X,Y,step,left,f;
pair < int , int > marked[NMAX];
void Build_intern(int node,int left,int right)
{
if (left==right) return ;
Build_intern(2*node,left,(left+right)/2);
Build_intern(2*node+1,(left+right)/2+1,right);
T_intern[node] = (T_intern[2*node].value>T_intern[2*node+1].value) ? T_intern[2*node] : T_intern[2*node+1];
}
void Build_extern(int node,int left,int right)
{
if (left==right) return ;
Build_extern(2*node,left,(left+right)/2);
Build_extern(2*node+1,(left+right)/2+1,right);
T_extern[node] = (T_extern[2*node].value>T_extern[2*node+1].value) ? T_extern[2*node] : T_extern[2*node+1];
}
void Update_intern(int node)
{
if (node==0) return ;
T_intern[node] = (T_intern[2*node].value>T_intern[2*node+1].value) ? T_intern[2*node] : T_intern[2*node+1];
Update_intern(node/2);
}
void Update_extern(int node)
{
if (node==0) return ;
T_extern[node] = (T_extern[2*node].value>T_extern[2*node+1].value) ? T_extern[2*node] : T_extern[2*node+1];
Update_extern(node/2);
}
int main()
{
freopen("felinare.in","r",stdin);
freopen("felinare.out","w",stdout);
scanf("%d%d",&N,&M);
step=1;
while (step<N) step<<=1;
--step;
for (;M;--M)
{
scanf("%d%d",&X,&Y);
G[X].insert(Y);
Ginv[Y].insert(X);
++T_intern[step+Y].value;
++T_extern[step+X].value;
}
for (i=1;i<=N;++i)
{
T_intern[step+i].index=T_extern[step+i].index=i;
marked[i]=make_pair(2,1);
}
Build_intern(1,1,N);
Build_extern(1,1,N);
left=2*N;
while (T_intern[1].value || T_extern[1].value)
if (T_intern[1].value>T_extern[1].value)
{
marked[T_intern[1].index].F=0;
--left;
while (!Ginv[T_intern[1].index].empty())
{
f=*Ginv[T_intern[1].index].begin();
Ginv[T_intern[1].index].erase(Ginv[T_intern[1].index].begin());
G[f].erase(G[f].find(T_intern[1].index));
--T_extern[step+f].value;
Update_extern((step+f)/2);
}
T_intern[step+T_intern[1].index].value=0;
Update_intern((step+T_intern[1].index)/2);
}
else
{
marked[T_extern[1].index].S=0;
--left;
while (!G[T_extern[1].index].empty())
{
f=*G[T_extern[1].index].begin();
G[T_extern[1].index].erase(G[T_extern[1].index].begin());
Ginv[f].erase(Ginv[f].find(T_extern[1].index));
--T_intern[step+f].value;
Update_intern((step+f)/2);
}
T_extern[step+T_extern[1].index].value=0;
Update_extern((step+T_extern[1].index)/2);
}
for (printf("%d\n",left),i=1;i<=N;++i)
printf("%d\n",marked[i].F+marked[i].S);
return 0;
}