jzoj2020.06.06【NOIP提高组】模拟

本文详细解析了NOIP提高组模拟赛中的三道题目:Bovine Shuffle是寻找不变的奶牛位置数量;Milk Measurement要求计算调整产奶量最高奶牛照片的次数;Barn Painting是树形DP解决不同相邻节点颜色的染色方案数。文章提供了每道题目的描述、输入输出格式、样例及解题思路。
摘要由CSDN通过智能技术生成

好久没打博客了~~~~~
趁着改完题就搞一搞(话说最近的题都好淼

T1 The Bovine Shuffle

Description

FJ 坚信快乐的牛可以产出更多的牛奶,因此 FJ 在牛棚里安装了一个巨大的迪斯科球并且打算让奶牛们学会跳舞。
FJ在许多出名的奶牛舞中选择了一种叫做 Bovine Shuffle 的舞蹈。这种舞蹈由 FJ 的 N 头奶牛组成。N头奶牛以一种顺序排成一行,接着表演数次 shuffle。每次的 shuffle 会将奶牛重新排列。FJ 为了让奶牛们更加快乐,让奶牛们更容易找到重新排列后的位置,他标记了 N 头奶牛的位置。在最开始,所有奶牛排成一排,第一头奶牛会在位置 1 上,第二只在 2上,以此类推。
我们用 N 个正整数 a1,a2,…,an来描述每次的 shuffle。ai说明了在位置 i上的奶牛在经过这回合的 shuffle 之后,会跑到位置 ai上。令 FJ 倍感非洲的是,即使 i与j不同,ai也可能会等于 aj!所以可能在一次 shuffle 后,有多头奶牛会跑到同一位置上,在这之后这群奶牛也会一同行动。
作为一名资深的养牛大户&坑牛专家的 FJ 猛然发现,无论经过多少次的 shuffle,一直都有 k个位置上有奶牛。FJ现在要你在 1秒内帮他得出 kk 的值,否则就赏你 10^18 mod10 大板!

Input

第一行包含一个整数,N
第二行包含 NN个整数,描述题目中的a 1 ​ ,a 2 ​ …a n ​

Output

一个整数,代表k

Sample Input

4
3 2 1 3

Sample Output

3

赛时

看到第一眼就是找规律,之后算了算感觉是找环,打了5分钟秒掉,然后赛后10分,都没有发现样例都没过。。。。。。(关键是好多大佬也是这么写的)

思路

感觉很多种方法,赛后问了问身旁比赛时腐败的大佬,大概一个这样的思路
对于每个没有被指向的点必然最后一直走不了,样例的3,2,1,3中4没有被指向,所以一定不行。然后再把关于那些不行的点指向的边删去,再判断剩下的点有没有被指向,一直做到那些没有边连向它的点没有。额。。其实有点像拓扑。
关于复杂度,n条边怎么暴力都没事吧?
附上超级丑的代码:

#include<cstdio>
#include<cstring>
#define N 100007 
using namespace std;
int a[N],b[N][500],n,ans,now;
bool bz[N];
void dg(int x){
   
	bool bz1=false;
	for(int i=1;i<=b[x][0];i++){
   
		if(bz[b[x][i]]==1){
   bz1=true;break;}
	}
	if(!bz1) ans--,bz[x]=0,dg(a[x]);
}
int main(){
   
	freopen("shuffle.in","r",stdin);
	freopen("shuffle.out","w",stdout);
	memset(bz,1,sizeof(bz));
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]),b[a[i]][++b[a[i]][0]]=i;
	ans=n;
	for(int i=1;i<=n;i++)
		if(!b[i][0]){
   
			bz[i]=0;
			ans--;
			dg(a[i]);
		}
	printf("%d",ans);
}

因为是改出来的,所以嘛有些地方写的很累赘就交了。

T2 Milk Measurement

Description

最初,农夫约翰的每头奶牛每天生产G加仑的牛奶(1≤G≤10^9)。由于随着时间的推移,奶牛的产奶量可能会发生变化,农夫约翰决定定期对奶牛的

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值