首页 > 其他分享 >[DMY]2024 CSP-S 模拟赛 Day 6

[DMY]2024 CSP-S 模拟赛 Day 6

时间:2024-09-28 16:24:05浏览次数:1  
标签:ma int siz 2024 num maxn DMY CSP dp

前言

离 A 掉一道题最近的一次。

过程

看完 T1 以后,想先构一个 \(\mathcal{O}(n^3)\) 的暴力,但是发现只有 10pts,而且算法复杂度接近 \(\mathcal{O}(n^4)\),所以果断放弃。

把链的限制写了(然后亏大了),然后开始在 CS 上面画画。画了一会发现一个简单的 dp 思路,但是是 \(\mathcal{O}(n^2)\) 的。不过分也不少,就写了。调完以后时间已经过了 \(1\frac{1}{12}h\)。

发现我的这个 dp 枚举只在于一个点,所以考虑怎么选点最优。容易想到重心,但是立刻就被 hack 了。

不服气的我发现重心被 hack 的可能性不大(因为当时没有看到数据捆绑,不过也多亏没看到),然后就开始写,结果发现跑过了大样例?

然后在原代码的基础上稍微修饰一下,再测的时候发现第二个样例挂了,说明假了。有点无奈,所以分段跑一下以后就丢了。

赛后发现有 65pts,某猫告诉我我的链判错了。我尝试改链,然后就:

image

一条链损我 35pts?

纪念一下我的 AC 代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
	int w=1,s=0;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
	while(isdigit(ch)){s=s*10+(ch-'0');ch=getchar();}
	return w*s;
}
const int mod=1e9+7;
const int maxn=2e5+10;
const int inf=1e9+7;
int n,k;
vector<int> G[maxn];
int xo[maxn];
int du[maxn];
void Sub()
{
	if(n>=k*2+2)puts("2");
	else if(n>=k+1)puts("1");
	else puts("0");
	return ;
}
int f[maxn][22],d[maxn],fa[maxn],siz[maxn],dp[maxn];
int ans=0;
void pre(int x,int faa)
{
    fa[x]=faa;
	siz[x]=1;
	d[x]=d[faa]+1;
	f[x][0]=faa;
	for(int i=1;i<=21;i++)f[x][i]=f[f[x][i-1]][i-1];
	for(auto y : G[x])
	{
		if(y==faa) continue;
		pre(y,x);
		siz[x]+=siz[y];
	}
}
int lca(int x,int y)
{
	if(d[x]<d[y]) swap(x,y);
	for(int i=21;i>=0;i--)
		if(d[f[x][i]]>=d[y]) x=f[x][i];
	if(x==y) return y;
	for(int i=21;i>=0;i--)
	{
		if(f[x][i]!=f[y][i])
		{
			x=f[x][i];
			y=f[y][i];
		}
	}
	return f[x][0];
}
void dfs(int x,int faa)
{
	int ma=0;dp[x]=0;siz[x]=1;
	for(auto y : G[x])
	{
		if(y==faa)continue;
		dfs(y,x);siz[x]+=siz[y];
		ma=max(ma,dp[y]-(siz[y]>=k));
		if(siz[y]>=k)dp[x]++;
	}
	dp[x]+=ma;
}
void Sub2()
{
	pre(1,0);
	for(int x=1;x<=n;x++)
	{
		dfs(x,0);
		int ma=-11,maa=-11,anss=0;
		for(auto y : G[x])if(siz[y]>=k)anss++;
		for(auto y : G[x])
		{
			int num=dp[y];
			if(siz[y]>=k)num--;
			if(num>ma)
			{
                maa=ma;
				ma=num;
			}
			else if(num>maa)
			{
				maa=max(0ll,num);
			}
		}
		anss=anss+ma+maa;
		ans=max(ans,anss);
	}
	printf("%lld\n",ans);
}
int root,ddp[maxn]={inf};
void get(int x,int fa)
{
	siz[x]=1;
	for(auto y : G[x])
	{
		if(y==fa)continue;
        get(y,x);siz[x]+=siz[y];
        ddp[x]=max(ddp[x],siz[y]);
	}
	ddp[x]=max(n-siz[x],ddp[x]);
	if(ddp[root]>ddp[x])root=x;
}
void Sub3()
{
	get(1,0);
	dfs(root,0);
	int ma=-11,maa=-11,x=root,anss=0;
	for(auto y : G[x])if(siz[y]>=k)anss++;
	for(auto y : G[x])
	{
		int num=dp[y];
		if(siz[y]>=k)num--;
		if(num>ma)
		{
			maa=ma;
			ma=num;
		}
		else if(num>maa)
		{
			maa=max(0ll,num);
		}
	}
	anss=anss+ma+maa;
	printf("%lld\n",anss);
}
void Main()
{
	bool sub=1;
	n=read(),k=read();ans=0;root=0;
	for(int i=1;i<=n;i++)G[i].clear();
	for(int i=1;i<=n;i++)du[i]=dp[i]=siz[i]=d[i]=ddp[i]=0; 
	for(int i=1;i<n;i++)
	{
		int x=read(),y=read();
		G[x].push_back(y);
		G[y].push_back(x);
		du[x]++;du[y]++;
		if(du[x]>2||du[y]>2)sub=0;
	}
	if(sub){Sub();return ;}
	if(n<=1000){Sub2();return ;}
	Sub3();return ;
}
signed main()
{
#ifdef Lydic
	freopen(".in","r",stdin);
	freopen(".out","w",stdout);
//  #else
//   	freopen("Zephyros.in","r",stdin);
//   	freopen("Zephyros.out","w",stdout);
#endif  
	int T=read();
	while(T--)Main();
    return 0;

}

转去看 T2,光速写完 20pts 的暴力,然后发现很可以二分,推了一大会发现二分复杂度甚至不如暴力的我决定弃掉这道题。

讲课的人说是笛卡尔树思想,但是我不会单调栈。

赛后发现为数不多的 20pts 还爆了 10pts,只剩一份蛋包饭的分数了。

不知道为什么 T3 当时没有细想,现在觉得比 T2 简单,但是考场上放了个 5pts 就过了。这道题 jsy 讲容斥的时候讲过错排思想,针对这道题就是把排列转成多个环以后跑一个分组背包(昨天刚见过)。

T4 的话觉得是原,把原题扒出来以后发现压根没有一点相似之处,小部分数据可以区间 dp,但是当时我拐回去看 T1 了,所以没有写(然后 T1 也爆了)。

总结

还是细节问题,但有一部分也是数据的原因。总的来说比赛挂了 10+35=45pts,不算高,但也不算低。

排名非常靠后,感觉 7 级线有点难。

标签:ma,int,siz,2024,num,maxn,DMY,CSP,dp
From: https://www.cnblogs.com/Lydic/p/18438099

相关文章

  • SolidWorks.2024.SP3.1图文安装教程及下载
    SOLIDWORKS2024引入了一系列新功能和性能改进,‌旨在提升用户在设计、‌仿真、‌数据管理和制造等方面的效率和创新能力。‌安装前准备工作:【rjqjf.com】首先检查一下NETFramework3.5和4.0是否已安装。如果未安装.NETFramework3.5(包括.NET2.0和3.0),请转到“控制面板”->“......
  • NOIP2024集训Day37 DP
    NOIP2024集训Day37DPA.[CQOI2011]放棋子设\(f_{i,j,k}\)表示前\(k\)种棋子放了任意\(i\)行、\(j\)列。决策是:在哪些位置填同种颜色的棋子。于是美剧上一个状态的\(i,j\)(表示为\(l,r\)),上一状态\(k_1=k-1\)。设\(g_{i,j,k}\)表示\(k\)个同种颜色的......
  • 《2024 Java 就业前景深度洞察报告》
    《2024Java就业前景深度洞察报告》一、核心观点1.1Java就业前景光明,持续引领技术潮流Java作为一种广泛应用于软件开发的编程语言,在当今的技术领域中占据着重要地位。它具有强大的跨平台性、稳定性和安全性,使得众多企业在开发关键业务系统时首选Java。随着信息技术......
  • CSP & NOIP 模拟赛记录
    9.18(lanos212)T1签到,10mins内过了。T2乍一看有点困难,题目太形式化,不太直观,先跳过去思考T3了,T3没有什么DP的思路,但是这种题显然需要DP。看了一眼T4,被一堆式子糊脸恶心了,没有怎么思考。接下来一个小时在思考T2和T3,突然发现T2只需要每次求最短路就可以了,那么就是......
  • 信息学奥赛复赛复习06-CSP-J2020-02直播获奖-向上取整、向下取整、整数除法、最大值、
    PDF文档公众号回复关键字:2024092812020CSP-J题目1优秀的拆分[题目描述]NOI2130即将举行。为了增加观赏性,CCF决定逐一评出每个选手的成绩,并直播即时的获奖分数线。本次竞赛的获奖率为w%,即当前排名前w%的选手的最低成绩就是即时的分数线更具体地,若当前已评出了p个......
  • 2024 年全国大学生新质生产力大赛—数学建模赛项题目 B:金融违规交易的大数据分析 问题
    针对问题三,我们可以采取以下步骤进行聚类分析,并统计不同国家的涉案人员数量和交易金额总数。以下是具体的分析思路和方法:1.数据预处理清洗数据:确保数据中没有缺失值,并将需要的字段转换为合适的数据类型。选择聚类特征:选择与洗钱风险评分相关的指标作为聚类特征,例如交易金......
  • 2024java社招面试(亲身经历8w字,更新中)
    一、Java基础部分面试题1.Java面向对象的三个特征封装:对象只需要选择性的对外公开一些属性和行为。继承:子对象可以继承父对象的属性和行为,并且可以在其之上进行修改以适合更特殊的场景需求。多态:允许不同类的对象对同一消息做出响应。2.Java中基本的数据类型有哪些以......
  • 网络安全(黑客技术)-2024自学手册
    一、什么是网络安全  网络安全可以基于攻击和防御视角来分类,我们经常听到的“红队”、“渗透测试”等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。  无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面性,例如Web 安全技术,既......
  • MindFusion Pack for Java Swing 2024.R1 Crack
    MindFusionPackforJavaSwingJavaDiagramDiagrammingJavaSwingSchedulerSchedulingJavaSwingSpreadsheetSpreadsheetJavaSwingChartCharts&GaugesJavaSwingVirtualKeyboardVirtualKeyboardDiagramsIfyourJavaapplicationneedstodrawaflow......
  • TSCTF-J 2024 部分WP
    TSCTF-J2024部分题目复现(未完结)iPlayBingo:F12拿到answerCheck.wasm文件,同时观察js代码找到关键函数Check()利用Wabt将answerCheck.wasm文件转为answerCheck.c和answerCheck.h文件,但此时可读性依然较差。用gcc链接成answerCheck.o文件,此时可以使用IDA反汇编。​ 关键的函数......