首页 > 其他分享 >P9431 [NAPC-#1] Stage3 - JRefreshers 题解

P9431 [NAPC-#1] Stage3 - JRefreshers 题解

时间:2023-07-03 22:45:01浏览次数:47  
标签:cnt return -# int 题解 P9431 low y1 y2

传送门

这个人赛时看错了几次题目导致样例调了 1h。

\(Sol1: n \leqslant 10, T \leqslant 10\)

乱搞分。

枚举跳跃的顺序,判断可不可行,最后取最大值,复杂度 \(O((n - 1 )!)\)。

\(Sol2: B\)

感觉跟正解没什么关系,先说这个。

  • 特殊性质 \(\mathbf B\):保证对于任意跳跃球 \(u, v\),如果 kid 理论上能从 \(u\) 跳到 \(v\),那么他理论上一定可以从 \(v\) 跳到 \(u\)。

两点一定互相可达,题目求的是能到的最大的点的数量。

并查集维护最大连通块大小即可。

\(Sol3: A\)

提示正解的部分。

  • 特殊性质 \(\mathbf A\):保证对于任意不同跳跃球 \(u,v\),如果 kid 理论上能从 \(u\) 跳到 \(v\)(理论上:不考虑 kid 能否从起点到达 \(u\) 的问题,下同),那么他理论上一定不可以从 \(v\) 跳到 \(u\)。

一定没有环,所以建完图后一定是一个 DAG,直接在 DAG 上跑 dp。

$Sol4: $ 如何建图

如果点 \(u\) 能跳到点 \(v\) 的话,就连接一条 \(u\) 向 \(v\) 的边。

每下坠一格时,可以移动一格,所以 \(y\) 坐标的差应该小于等于 \(x\) 坐标的差。

bool check(int a, int b)
{
	int x1 = x[a], x2 = x[b], y1 = y[a] + d, y2 = y[b];
	if(y1 < y2) return false;
	if(abs(x1 - x2) > y1 - y2) return false;
	return true;
}

\(Sol5:\)

建完图之后显然不是 DAG,于是想到缩点,缩点完用 \(Sol3\) 的方法去 dp。

bool check(int a, int b)
{
	int x1 = x[a], x2 = x[b], y1 = y[a] + d, y2 = y[b];
	if(y1 < y2) return false;
	if(abs(x1 - x2) > y1 - y2) return false;
	return true;
}
int h[N], nxt[M], to[M], cnt;
void add(int u, int v)
{
	to[++ cnt] = v, nxt[cnt] = h[u], h[u] = cnt;
}
int dfn[N], low[N], bel[N], tim, scc_cnt;
bool ins[N];
int siz[N], f[N], in_deg[N];
stack<int> s;
void tarjan(int u)
{
	dfn[u] = low[u] = ++ tim;
	ins[u] = true;
	s.push(u);
	for(int i = h[u]; i; i = nxt[i])
	{
		int v = to[i];
		if(!dfn[v])
		{
			tarjan(v);
			low[u] = min(low[u], low[v]);
		}
		else if(ins[v]) low[u] = min(low[u], dfn[v]);
	}
	if(low[u] == dfn[u])
	{
		int v;
		scc_cnt ++;
		do
		{
			siz[scc_cnt] ++;
			v = s.top();
			s.pop();
			ins[v] = false;
			bel[v] = scc_cnt;
		} while(v != u);
	}
}
vector<int> adj[N];
int top()
{
	queue<int> q;
	for(int i = 1; i <= scc_cnt; i ++) if(in_deg[i] == 0) q.push(i), f[i] = siz[i];
	while(q.size())
	{
		int u = q.front();
		q.pop();
		for(auto v : adj[u])
		{
			f[v] = max(f[v], f[u] + siz[v]);
			if(-- in_deg[v] == 0) q.push(v);
		}
	}
}
void init()
{
	for(int i = 1; i <= n; i ++) 
	{
		h[i] = 0;
		adj[i].clear();
		in_deg[i] = 0;
		f[i] = 0;
		siz[i] = 0;
		ins[i] = false;
		bel[i] = 0;
		nxt[i] = 0; 
		to[i] = 0;
		dfn[i] = 0;
		low[i] = 0;
	}
	cnt = scc_cnt = tim = 0;
}
void solve()
{
	cin >> n >> d >> c;
	
	for(int i = 1; i <= n; i ++) cin >> x[i] >> y[i];
	for(int i = 1; i <= n; i ++)
		for(int j = 1; j <= n; j ++) if(check(i, j) && i != j) add(i, j);
	for(int i = 1; i <= n; i ++) if(!dfn[i]) tarjan(i);
	for(int i = 1; i <= n; i ++)
		for(int j = h[i]; j; j = nxt[j])
			if(bel[i] != bel[to[j]]) adj[bel[to[j]]].push_back(bel[i]), in_deg[bel[i]] ++;
	queue<int> q;
	for(int i = 1; i <= scc_cnt; i ++) if(in_deg[i] == 0) q.push(i), f[i] = siz[i];
	while(q.size())
	{
		int u = q.front();
		q.pop();
		for(auto v : adj[u])
		{
			f[v] = max(f[v], f[u] + siz[v]);
			if(-- in_deg[v] == 0) q.push(v);
		}
	}
	cout << f[bel[c]] << '\n';
}

标签:cnt,return,-#,int,题解,P9431,low,y1,y2
From: https://www.cnblogs.com/Svemit/p/17524346.html

相关文章

  • 软测笔记7-【mysql实操题】
    实操题1建表准备#建学生信息表studentcreatetablestudent(snovarchar(20)notnullprimarykey,snamevarchar(20)notnull,ssexvarchar(20)notnull,sbirthdaydatetime,classvarchar(20));#建立教师表createtableteacher(tnovarchar(20)notnullprima......
  • 软测笔记6-【Mysql面试题】
    1.请列出几款典型的关系型和非关系型数据库关系型数据库:mysql、sql-server、oracle非关系型:redis、mongodb2.请列出mysql数据库的特点特点有:可移植性好、支持多操作系统、支持多语言、开源社区版本免费、支持多线程等3.Mysql中常用的数据类型有哪些?字符串型、数值型、......
  • 【mysql】一、mysql的学习---索引
    mysql的学习资料来源 https://www.bilibili.com/video/BV1CZ4y1M7MQ?from=search&seid=3518646188262100291一、索引:【mysql】一、mysql的学习---索引二、视图:【mysql】二、mysql的学习---视图三、存储过程和函数:【mysql】三、mysql的学习---存储过程和函数四、触发器:【mysq......
  • 2023-07-03:讲一讲Redis缓存的数据一致性问题和处理方案。
    2023-07-03:讲一讲Redis缓存的数据一致性问题和处理方案。答案2023-07-03:数据一致性当使用缓存时,无论是在本地内存中缓存还是使用Redis等外部缓存系统,会引入数据同步的问题。下面以Tomcat向MySQL中进行数据的插入、更新和删除操作为例,来说明具体的过程。分析下面几种解......
  • jmeter---解决同一线程组下不同http采样器使用不同请求头的问题
    问题:某个线程组M中包含一个信息头管理器1,和a、b、c、d等多个http取样器,这几个取样器共用一个信息头管理器1,但当我再增加一个接口请求e时,发现此接口请求ed的请求头中的content-type是需要application/x-www-form-urlencoded类型的,而信息头管理器1中定义的content-type是appli......
  • [LOJ 6029]「雅礼集训 2017 Day1」市场 题解
    这道题恶心之处在于区间向下取整。这里给出两种思路:区间覆盖做法如果最大值和最小值向下取整后相等,则对此区间进行区间覆盖。我考场写的是这个,但是码错了,加上习惯不好,\(100\to64\),再加上烦了弱智错误,\(64\to9\),不给出代码。差值相等做法注意到相邻两数的向下取整的差值不......
  • 《摆与混》第二章--7月3日--周一
    痛苦的周一对于一个放假大学生与普通日常没有什么不同;1.今天做了什么:今天早起失败了(9点半起床)。洗漱后简单的学习了一些Java的基本知识,了解了一些Java与其他语言的不同,完成了几个简单的程序,,下午4点到6点跟哥们去打了会羽毛球(碰见了高中的老师,我还是很有人气的),之后跟朋友吃了顿饭,......
  • ORA-01438处理方法 value larger than specified precision allowed for this column
    http://ora-01438.ora-code.com/ORA-01438:valuelargerthanspecifiedprecisionallowedforthiscolumnCause:Wheninsertingorupdatingrecords,anumericvaluewasenteredthatexceededtheprecisiondefinedforthecolumn.Action:Enteravaluethatcompli......
  • W04-LINUX防火墙
    NAT实现:1,SNAT:SourceNAT本地网络中的主机通过某一特定地址访问外部网络,实现地址伪装,请求报文:修改源IP;#iptables-tnat-APOSTROUTING-s10.0.0.0/24!-d10.0.0.0/24-jSNAT---to-source192.168.10.200(固定公网IP)#iptables-tnat-APOSTROUTING-s10.0.0.0/24!-d......
  • 安卓开发-基础篇(更新中)
    安卓开发-基础篇本篇文章算是自己学习的记录和补充,防止以后忘记。如果能够对大家有所帮助那就更好了。本文将会持续更新(根据本人的学习进度),如有问题,欢迎在评论区留言指正。目录目录安卓开发-基础篇目录1.简单控件1.1文本显示(Text,Color)1.1.1简要介绍1.1.2文本颜色1.2视......