纪中暑假集训 2020.08.13【NOIP提高组】模拟 T3:【GDKOI2014】壕壕的寒假作业

【GDKOI2014】壕壕的寒假作业

Description

纪中暑假集训 2020.08.13【NOIP提高组】模拟 T3:【GDKOI2014】壕壕的寒假作业_第1张图片

Input

纪中暑假集训 2020.08.13【NOIP提高组】模拟 T3:【GDKOI2014】壕壕的寒假作业_第2张图片

Output

输出n行。第i行输出两个整数,分别表示第i份作业最早完成的时刻以及最晚完成的时刻,两个整数之间以一个空格间隔。

Sample Input

4 4

3 4 5 6

1 2

1 3

2 4

3 4

Sample Output

3 3

7 12

8 12

18 18

Data Constraint

对于30%的数据,n<=100,m<=5000

对于100%的数据,1<=n<=2000,0<=m<=10000,1<=timei<=1000000,1<=ai,bi<=n。

反思&题解

比赛&正解思路: 一眼送分题,最早完成这个作业的情况就是把要在这个作业且完成的作业全部完成了再完成这个;最晚完成这个作业的情况就是除了要完成这个作业以后的作业不完成,其他都完成就行了,建个图dfs随便跑跑就过了 (就这送分题我想了半小时……)
反思: T3就这……不禁让我想起了昨天的毒瘤T3

CODE

#include
using namespace std;
struct arr
{
	long long next,to;
}edge1[10005],edge2[10005];
long long n,m,head1[10005],head2[10005],cnt1,cnt2,ans,ti[2005],sum;
bool bz[2005];
void dfs1(long long now)
{
	long long i;
	for (i=head1[now];i;i=edge1[i].next)
	{
		long long v=edge1[i].to;
		if (!bz[v])
		{
			ans+=ti[v];
			bz[v]=true;
			dfs1(v);
		}
	}
}
void dfs2(long long now)
{

	long long i;
	for (i=head2[now];i;i=edge2[i].next)
	{
		long long v=edge2[i].to;
		if (!bz[v])
		{
			bz[v]=true;
			ans+=ti[v];
			dfs2(v);
		}
	}
}
void add1(long long u,long long v)
{
	edge1[++cnt1].to=v;
	edge1[cnt1].next=head1[u];
	head1[u]=cnt1;
}
void add2(long long u,long long v)
{
	edge2[++cnt2].to=v;
	edge2[cnt2].next=head2[u];
	head2[u]=cnt2;
}
int main()
{
	scanf("%lld%lld",&n,&m);
	long long i;
	for (i=1;i<=n;i++)
	{
		scanf("%lld",&ti[i]);
		sum+=ti[i];
	}
	for (i=1;i<=m;i++)
	{
		long long a,b;
		scanf("%lld%lld",&a,&b);
		add1(b,a);
		add2(a,b); 
	}
	for (i=1;i<=n;i++)
	{
		long long j;
		for (j=1;j<=n;j++)
			bz[j]=false;
		ans=ti[i];
		dfs1(i);
		printf("%lld ",ans);
		for (j=1;j<=n;j++)
			bz[j]=false;
		ans=0;
		dfs2(i);
		printf("%lld\n",sum-ans);
	} 
	return 0;
}

你可能感兴趣的:(反思,题解)