首页 > 其他分享 >H. Sugar Sweet II

H. Sugar Sweet II

时间:2024-02-02 20:00:26浏览次数:22  
标签:cc Sweet 1000005 long Sugar II n1 500005 true

  • 单向边森林不能通过dfs找环
  • 抽象的题目需要通过模拟样例理解题意
  • 列表模拟样例
  • 链式前向星双倍空间(边&边的访问函数)
    *
点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int mod=1000000007;
long long a[500005],b[500005],w[500005],c[500005],p[500005],cnt[500005];
long long h[500005],ne[1000005],t[1000005],tot,m,n;
bool v[500005],f[1000005];
long long jc[500005],jcinv[500005];
vector<long long>g[500005];
long long read1()
{
	char cc=getchar();
	while(!(cc>=48&&cc<=57))
	{
		if(cc=='-')
		{
			break;
		}
		cc=getchar();
	}
	bool f=false;
	long long s=0;
	if(cc=='-')
	{
		f=true;
	}
	else
	{
		s=cc-48;
	}
	while(1)
	{
		cc=getchar();
		if(cc>=48&&cc<=57)
		{
			s=s*10+cc-48;
		}
		else
		{
			break;
		}
	}
	if(f==true)
	{
		s=-s;
	}
	return s;
}
long long power(long long n,long long p)
{
	if(p==0)
	{
		return 1;
	}
	else if(p==1)
	{
		return n%mod;
	}
	else if(p%2==0)
	{
		long long tmp=power(n,p/2);
		return tmp*tmp%mod;
	}
	else
	{
		long long tmp=power(n,p/2);
		return tmp*tmp%mod*n%mod;
	}
}
void add(long long u,long long v)
{
	tot++;
	ne[tot]=h[u];
	h[u]=tot;
	t[tot]=v;
}
long long dfs1(long long n1)
{
	v[n1]=true;
	bool pd=false;
	for(long long i=h[n1];i;i=ne[i])
	{
		if(f[i]==false)
		{
			f[i]=true;
			if(i>n)
			{
				f[i-n]=true;
			}
			else
			{
				f[i+n]=true;
			}
			long long w=t[i];
			if(v[w]==false)
			{
				long long tmp=dfs1(w);
				if(tmp>0)
				{
					pd=true;
				}
			}
			else
			{
				m++;
				c[w]=m;
				g[m].push_back(w);
				pd=true;
			}
		}
	}
	if(pd==true)
	{
		if(c[n1]==0)
		{
			g[m].push_back(n1);
			return c[n1]=m;
		}
		else
		{
			return 0;
		}
	}
	return 0;
}
void dfs2(long long n1)
{
	v[n1]=true;
	for(long long i=h[n1];i;i=ne[i])
	{
		long long w=t[i];
		if(i<=n&&v[w]==false)
		{
			if(p[w]==-1)
			{
				if(p[n1]==0)
				{
					p[w]=0;
					cnt[w]=0;
				}
				else
				{
					cnt[w]=cnt[n1]+1;
					p[w]=jcinv[cnt[w]];
				}
			}
			dfs2(w);
		}
	}
}
void pre()
{
	jc[0]=1;
	jcinv[0]=1;
	for(long long i=1;i<=500000;i++)
	{
		jc[i]=jc[i-1]*i%mod;
	}
	jcinv[500000]=power(jc[500000],1000000005);
	for(long long i=500000;i>1;i--)
	{
		jcinv[i-1]=jcinv[i]*i%mod;
	}
}
int main()
{
//	freopen("H.in","r",stdin);
//	freopen("H.out","w",stdout);
	pre();
	long long T;
	cin>>T;
	while(T--)
	{
		n=read1();
		for(long long i=1;i<=n;i++)
		{
			a[i]=read1();
			p[i]=-1;
			cnt[i]=0;
		}
		for(long long i=1;i<=n;i++)
		{
			b[i]=read1();
			add(b[i],i);
		}
		for(long long i=1;i<=n;i++)
		{
			add(i,b[i]);
		}
		for(long long i=1;i<=n;i++)
		{
			w[i]=read1();
		}
		for(long long i=1;i<=n;i++)
		{
			if(a[i]<a[b[i]])
			{
				p[i]=1;
				cnt[i]=1;
			}
			else if(a[i]>=a[b[i]]+w[b[i]])
			{
				p[i]=0;
				cnt[i]=0;
			}
		}
		for(long long i=1;i<=n;i++)
		{
			if(!v[i])
			{
				long long tmp=dfs1(i);
			}
		}
		for(long long i=1;i<=n;i++)
		{
			v[i]=false;
		}
		for(long long i=1;i<=m;i++)
		{
			long long x=-1;
			for(long long j=0;j<g[i].size();j++)
			{
				if(p[g[i][j]]!=-1)
				{
					x=g[i][j];
				}
			}
			if(x==-1)
			{
				for(long long j=0;j<g[i].size();j++)
				{
					p[g[i][j]]=0;
					cnt[g[i][j]]=0;
				}
				x=g[i][0];
			}
			dfs2(x);
		}
		for(long long i=1;i<n;i++)
		{
			printf("%lld ",(a[i]+p[i]*w[i]%mod)%mod);
		}
		printf("%lld\n",(a[n]+p[n]*w[n]%mod)%mod);
		for(long long i=1;i<=tot;i++)
		{
			f[i]=false;
		}
		tot=0;
		for(long long i=1;i<=n;i++)
		{
			v[i]=false;
			h[i]=0;
			c[i]=0;
		}
		for(long long i=1;i<=m;i++)
		{
			g[i].clear();
		}
		m=0;
	}
	return 0;
}

标签:cc,Sweet,1000005,long,Sugar,II,n1,500005,true
From: https://www.cnblogs.com/watersail/p/18003755

相关文章

  • IIS网站定时停止和启动
     一,创建2个批处理文件iisstart.bat@echooffnetstartiisadminnetstartw3svc iisstop.bat@echoofftaskkill/f/imw3wp.exeiisreset/STOPtaskkill/f/imw3wp.exe 二,通过windows自带“任务计划程序”定时执行批处理命令 下面注意权限 为“使用最......
  • day27 代码随想录算法训练营 40. 组合总和 II
    题目:40.组合总和II我的感悟:只要在路上就不怕走的慢。卡尔的视频慢慢听0.75倍听还是可以的。只要状态好,就可以学。多学会鼓励理解难点:代码难点:①notused[i-1]等同于used[i-1]==0 这里用的是True和False,所以用的是notused[i-1]②i>0为了防止i-1越界③剪枝......
  • Windows Server 2019 安装IIS 服务
    安装步骤1、点击左下角打开开始菜单找到服务器管理器菜单打开服务器管理器2、在弹出的服务器管理器界面找到添加角色和功能3、在弹出的添角色和功能向导中选择下一步4、选择:基于角色或基于功能的安装,然后下一步5、选择:从服务器池中选择服务器,然后下一步6、选择:Web服务器(IIS),......
  • 代码随想录算法训练营第四天 |24. 两两交换链表中的节点 | 19.删除链表的倒数第N个节
    142.环形链表II 已解答中等 相关标签相关企业 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,......
  • 优美的排列II
    667.BeautifulArrangementII(Medium)给定两个整数n和k,你需要实现一个数组,这个数组包含从1到n的n个不同整数,同时满足以下条件:①如果这个数组是[a1,a2,a3,...,an],那么数组[|a1-a2|,|a2-a3|,|a3-a4|,...,|an-1-an|]中应该有且仅有k个不同整......
  • IIC
    半双工,意味着要使用开漏输出高位先行,比如AT24C128/256是16位地址,发送从机地址的时候要一个字节一个字节的发,这个时候因为是高位先行,因此先发高位地址起始时序(SCL高电平期间SDA产生下降沿):先置SDA为高电平,然后置SCL为高电平,然后拉低SDA,然后在拉低SCL终止时序(SCL高电平期间SDA......
  • 代码随想录算法训练营第八天| 344.反转字符串 541. 反转字符串II 卡码网:54.替换数字
    反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决这一问题。题目链接:344.反转字符串-力扣(LeetCode)关于是否用reverse函数解决问题:如果题目......
  • LIID
    论文地址:https://www.researchgate.net/profile/Yu-Huan-Wu-2/publication/344231723_Leveraging_Instance-_Image-_and_Dataset-Level_Information_for_Weakly_Supervised_Instance_Segmentation/links/5f649783299bf1b53ede0180/Leveraging-Instance-Image-and-Dataset-Level-I......
  • 解决IIS应用程序池回收假死的方法
    Aworkerprocesswithprocessidof'4472'servingapplicationpool'MPOS'wasshutdownduetoinactivity. ApplicationPooltimeoutconfigurationwassetto20minutes. Anewworkerprocesswillbestartedwhenneeded.为应用程序池“MPOS”提供......
  • 代码随想录算法训练营第七天| 454.四数相加II 383. 赎金信 15. 三数之和 18. 四
    454.四数相加II 给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i,j,k,l) 能满足:0<=i,j,k,l<nnums1[i]+nums2[j]+nums3[k]+nums4[l]==0题目链接:454.四数相加II-力扣(LeetCode)思路:当遇到需要确认元素是......