我的做法,思路是攻击者血量为1就重算
但是会被这个卡掉:
60000 1000
2 1
2 1
1 2
1 2
1 2
...
附被hack代码:
// Problem: T176504 「MCOI-05」追杀
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/T176504?contestId=30513
// Memory Limit: 128 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native")
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <stdlib.h>
#define od(x) printf("%d",x)
#define odb(x) printf("%d ",x)
#define odl(x) printf("%d\n",x)
#define odp(x,y) printf("%d %d\n",x,y)
#define ol(x) puts("")
#define old(x) printf("%lld",x)
#define oldb(x) printf("%lld ",x)
#define oldl(x) printf("%lld\n",x)
#define oldp(x,y) printf("%lld %lld\n",x,y)
//#define int long long
inline int read()
{
int num=0,f=1;char c=getchar();
while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
while(c>47&&c<58)num=num*10+(c^48),c=getchar();
return num*f;
}
inline int re1d()
{
char c=getchar();
while(c<48||c>49)c=getchar();
return c&1;
}
inline int min(int a,int b){return a>b?b:a;}
inline int max(int a,int b){return a<b?b:a;}
int u[60005],v[60005],f[1005],bl[60005];
int pew[1005];
#define a bl
#define b bl
int TIME_PRERPEREP;
inline int __builtin_cIz(int n,int m,int p,int k)
{
memset(b,0,sizeof(int)*(n+3));
if(p==0){b[k]--;}
for(int i=1;i<=m;i++)
{
if(a[u[i]]==-3||b[v[i]]==-3)goto Macesuted;
a[v[i]]--;
Macesuted:;
// TIME_PRERPEREP++;
// if(TIME_PRERPEREP>200000000)exit(-1);
if(i==p)
{
if(b[k]>-3)b[k]--;
}
}
int res=0;
for(int i=1;i<=n;i++)
{
if(a[i]==-3)res++;
//pew[k][i]=bl[i];
}
return n-res;
}
//#define bl pew
/*inline int __builtin_ciz(int n,int m,int p,int k)
{
memset(b,0,sizeof(int)*(n+3));
if(p==0){b[k]--;}
for(int i=1;i<=m;i++)
{
if(a[u[i]]==-3||b[v[i]]==-3)goto Macesuted;
a[v[i]]--;
Macesuted:;
// TIME_PRERPEREP++;
// if(TIME_PRERPEREP>200000000)exit(-1);
if(i==p)
{
if(b[k]>-3)b[k]--;
}
for(int j=1;j<=n;j++)pew[i][j]=bl[j];
}
int res=0;
for(int i=1;i<=n;i++)
{
if(a[i]==-3)res++;
//pew[k][i]=bl[i];
}
return n-res;
}*/
//#undef bl
int ans[60005];
signed main()
{
int m=read(),n=read();
for(int i=1;i<=m;i++)u[i]=read(),v[i]=read();
//__builtin_ciz(n,m,0,0);
for(int i=1;i<=n;i++)f[i]=__builtin_cIz(n,m,0,i),ans[f[i]]++;
for(int j=1;j<=m;j++)
{
if(pew[u[j]]>-3&&pew[v[j]]>-3)pew[v[j]]--;
for(int i=1;i<=n;i++)
{
//if(u[j]!=i)f[j][i]=f[j-1][i];
if(u[j]==i&&pew[i]==-2)f[i]=__builtin_cIz(n,m,j,i);
ans[f[i]]++;
}
}
for(int i=0;i<=n;i++)odb(ans[i]);
return 0;
}