首页 > 其他分享 >noip模拟15

noip模拟15

时间:2024-11-17 22:18:20浏览次数:1  
标签:15 noip fdf int res mid siz 节点 模拟

A 暴力操作(opt)

B 异或连通(xor)

C 诡异键盘(keyboard)

D 民主投票(election)

这道题很简单。。。

首先,对于一个节点 \(u\),如果 \(siz[u]-1\) 大于了其他所有节点能得到的最大值,那么它一定能胜利。

那考虑怎么找到一个值,满足所有节点能得到的最大值最小?用二分答案即可。

对于一次 check,我们需要一个树形 dp 去计算当前节点在最大值为 \(mid\) 下溢出的票数。\(dp[u]+=dp[v]+1\)。

然后,会有三种情况。

  • 对于 \(siz[u]>res\),一定能胜利;

  • 对于 \(siz[u]<res\),一定不能胜利;

  • 对于 \(siz[u]=res\),如果这个点只有一个,那么它可以战胜。否则,若有多个,一定会有几个相等的。那么我们用 \(res-1\) 再跑一个 \(dp\),如果节点 \(1\) 的值是 \(1\),就代表有一个节点溢出,并且沿着到根节点的路径一路溢出到根。那只需要再次 dfs,找到那个节点就好了,这个节点一定可以战胜。

然后就是常数问题了。链式前向星的常数小于 vector。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int T,n;
inline int read()
{
	register int s=0;
	register char c=getchar();
	while(c<'0'||c>'9') c=getchar();
	while(c>='0'&&c<='9')s=(s<<1)+(s<<3)+(c^48),c=getchar();
	return s;
}
void write(int x)
{
	if(x>9) write(x/10);
	putchar(x%10+'0');
}
struct node{
	int to,next;
}e[N<<1];
namespace q{
	int *siz,*f;
	int head[N],cnt;
	inline void add(int u,int v)
	{
		e[++cnt].to=v,e[cnt].next=head[u];
		head[u]=cnt;
	}
	inline void dfs1(int u)
	{
		siz[u]=1;
		#pragma GCC unroll 2
		for(int i=head[u];i;i=e[i].next)
		{
			int v=e[i].to;
			dfs1(v);siz[u]+=siz[v];
//			if(siz[v]>siz[Son[u]]) Son[u]=v;
		}
	}
	inline void ddfs(int u,int mx)
	{
		f[u]=0;
		#pragma GCC unroll 2
		for(int i=head[u];i;i=e[i].next)
		{
			int v=e[i].to;
			ddfs(v,mx);
			f[u]+=f[v]+1;
		}
		if(f[u]>mx) f[u]-=mx;
		else f[u]=0;
	}
	bitset<N>ans;
	bool fdf=0;
	inline void dddfs(int u,int V){
		if(f[u]&&siz[u]-1==V){
			ans[u]=1;
			fdf=1;
			return ;
		}
		if(fdf)return ;
		#pragma GCC unroll 2
		for(int i=head[u];i;i=e[i].next){
			int v=e[i].to;
			if(fdf)return ;
			if(f[v])dddfs(v,V);
		}
	}
	void work()
	{
		n=read();
		f=new int [n+2],siz=new int [n+2];
		cnt=0;
		#pragma GCC unroll 32
		for(int i=1;i<=n;i++)head[i]=0;
		#pragma GCC unroll 32
		for(int i=2;i<=n;i++)
		{
			int f=read();
			add(f,i);
		}
		dfs1(1);
		int l=1,r=n,res=0;
		while(l<=r)
		{
			int mid=(l+r)>>1;
			ddfs(1,mid);
			if(f[1]==0) res=mid,r=mid-1;
			else l=mid+1;
		}
		ans.reset();
		#pragma GCC unroll 2
		for(int i=1;i<=n;i++)
		{
			if(siz[i]-1>res) ans[i]=1;
		}
		ddfs(1,res-1);
		if(f[1]==1) 
		{
			fdf=0;
			dddfs(1,res);
		}
		for(int i=1;i<=n;i++) write((int)ans[i]);
		putchar(10);
		delete []siz,delete []f;
	}
}
signed main()
{
//	freopen("2.in","r",stdin);
//	freopen("ans.txt","w",stdout);
	freopen("election.in","r",stdin);
	freopen("election.out","w",stdout);
	T=read();
	while(T--) q::work();
	return 0;
}

标签:15,noip,fdf,int,res,mid,siz,节点,模拟
From: https://www.cnblogs.com/ccjjxx/p/18551284

相关文章

  • [考试记录] 2024.11.16 noip模拟赛14
    T1字符串构造机考虑将一个LCP条件拆分成两个,一个是相等的部分,使用并查集维护,另一个是不等的部分,两个串末尾的字符一定不相等,随便那啥维护。对于非法情况就是在同一个相等联通块内有不相等的条件。然后考虑从前往后贪心即可。#include<bits/stdc++.h>usingnamespacestd;#d......
  • NOIP 模拟赛总结
    NOIP模拟赛总结DAY5T1:二分答案,贪心T2:二分答案,猜结论,单调栈T3:阶,分治T4:set,线段树,找性质(颜色段均摊总分:70总结:郑楠则反。DP优化经典套路不能忘。注意子任务的提示DAY6T1:暴力T2:乱搞,爆搜T3:分治,(亿点点)化式子T4:曼哈顿转切比雪夫,二分答案,KDtree(最近点),可持久化线段树(二维数......
  • NOIP 数据结构
    线段树标记看成序列而不是数权值对权值、标记对标记、标记对权值P1471区间加,区间平均值,区间方差区间平均值等同于区间和将方差式子拆解:$\frac{1}{n}\sum(A_i-\overline{A})^2=\frac{1}{n}(\sum{A_i}^2-2\sumA_i\overline{A}+n{\overline{A}}^2)$把\(\overline......
  • NOIP 模拟 9
    A送信卒直接二分。B共轭树图看了好多篇题解都说的不太清楚,随便观察一下得知子树间互不影响,且没有边相交,在不连直接父亲的情况下,孩子的父亲一定比祖先的父亲靠上,所以这道题考虑的是和祖先的关系,而不是与孩子的关系,然后这个时候可简单地设计出一种状态,\(f_{u,i}\)表示\(u\)......
  • NOIP 模拟 8
    搬的【MX-S5】梦熊NOIP2024模拟赛1(同步赛)A王国边缘倍增写脸上了。B买东西题反悔贪心写脸上了,首先按物品价格从小到大排序,这样之前用的优惠券一定可以给现在的优惠券用,如果给价格为\(a\),折扣价为\(w\)的物品用了优惠为\(x\)的优惠券,现在拿过来给\(b\)用后的贡献是......
  • NOIP 模拟 11
    T1暴力操作(opt)类似背包的处理出来除以每个数的最小代价,然后直接二分check即可,细节就是处理前后要做后缀min,然后求出\(\lfloor\frac{a}{x}\rfloor\lemid\)的最小\(x\),可以通过整除分块的套路,\(x=\lfloor\frac{a}{mid+1}\rfloor+1\)。T2异或连通(xor)trie树上的一个子树......
  • 201117 noi plus 模拟赛
    省流:\(40+85+48+0\)。逆天绿紫黑黑。不能再挂分了,t1\(100\to40\),t2\(100\to85\),t3\(84\to48\)。T1给一个\(n\timesm\)的网格图,每个点只能是#或.或S或T,若这个点为#则这个点是障碍,不能到达,若是.则是空地,可以到达,S是起点,T是终点。每次你可以走四联......
  • NOIP2024加赛5
    暴力操作(opt)拜谢丁真首先题目有一个很明显的性质:我们肯定只会对前\(\cfrac{n+1}{2}\)个数进行操作使它变小。最后的答案很明显没看出来具有二分答案的性质,考虑怎么check。实则就是要判断前\(\cfrac{n+1}{2}\)个数是否都能\(\lemid\)。我们可以方便的找出\(a_i\)变......
  • 问卷结果出炉!医工交叉领域的研究者们普遍关注的问题是……|个人观点·24-11-15
    小罗碎碎念昨天发了一份问卷,征集了一下群友们目前关于科研方面的需求。(此表单长期有效,我会定期更新在知识星球的专栏中)对昨天问卷结果做了一个简单的统计,先展示一下大家普遍关注的问题。需要工科分析数据排在最前面我是不意外的,但是没想到,排在第二的居然是寻求联合培养......
  • NOIP2016 提高组 愤怒的小鸟
    NOIP2016提高组愤怒的小鸟比较板的状压dp,结果做了3天才写完。算法一暴力搜索所有猪的分组情况,同组要满足能一根抛物线打完。时间复杂度\(O(n^n\timesn)\),实现的好的话大概能过\(60pts\)。最难写的大概是函数判断的部分。想一次写对就一定要打好草稿先理清思路。这是经验......