卡一种做法
查看原帖
卡一种做法
171487
cmll02楼主2021/5/3 07:53

我的做法,思路是攻击者血量为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;
}
2021/5/3 07:53
加载中...