首页 > 其他分享 >[UOJ693] 地铁规划

[UOJ693] 地铁规划

时间:2023-12-19 11:33:23浏览次数:30  
标签:le UOJ693 int 规划 tp 黑边 地铁 区间 hehe

这是一道交互题。

新首都跳蚤利亚需要建立地铁线路!hehe 蚤负责了这个项目。

跳蚤利亚有 $n$ 个地铁站,还有 $m$ 条线路计划设立,第 $i$ 条铁轨将在 $u_i$ 和 $v_i$ 之间建立一条双向线路($u_i\neq v_i$)。可能有两条线路连接的地铁站相同。

由于跳蚤利亚是面向未来的节能环保城市,hehe 蚤希望地铁的建设也要避免浪费。hehe 蚤仔细地审查工程建设方案,并定义了什么叫做“绿色区间”:对于任何满足 $1 \le l \le r \le m$ 的整数 $l, r$,我们称 $[l, r]$ 是一个区间;如果在只修建所有 $u_i, v_i \in [l, r]$ 的线路的情况下,地铁网络不包含环,那么我们称这个区间是绿色的。

hehe 蚤突然好奇:有多少个区间 $[l, r]$ 是绿色的呢?但这样的好奇持续了 $10^{-9}$ 秒后, hehe 蚤就想到了做法。如果一个区间是绿色的,那它的子区间也是绿色的。于是可以用双指针,对于所有的区间左端点 $l\in[1,m]$,计算出使得 $[l, r]$ 是绿色的最大的右端点值 $r$ 即可。而维护是否有环这一信息,只需使用跳蚤国最新自研数据结构 hehe 树。

作为跳蚤国顶级科学家之一,hehe 蚤刚在大量系统中植入了 hehe 树,所以这问题已经变得没意思了。为了挑战自我,hehe 蚤拿出了一台植入 hehe 树失败的机器,仅包含部分 hehe 树功能。具体来说,这台机器支持:

  1. 给定 $id$,在图中建立双向线路 $u_{id}, v_{id}$,注意,如果假如建立后图中产生了环,机器会报错。

    (最多lim 次)
  2. 拆除图中加入时间最晚的一条双向线路。

  3. 给定 $id$,询问 $u_{id}, v_{id}$ 两点间是否可以通过已经建立的双向线路连通。

拿出了这台机器后,hehe 蚤又得出了一个基于分治的强大的做法,并给出了答案。hehe 蚤大呼简单。

但 hehe 蚤又想了想,觉得自己应该在跳蚤国内弘扬这股 “麻烦自己,麻烦别人” 的挑战精神。于是 hehe 蚤把这台机器交给了你。他会从小到大依次对每个左端点 $l\in [1,m]$,向你询问,所有以 $l$ 为左端点的绿色区间 $[l, r]$ 中最大的右端点值 $r$。因为 hehe 蚤觉得这个问题太简单,所以在你计算答案 $r$ 时,你不可以让机器加入编号大于 $r$ 的线路。

一句话题意:有一个长度为 $m$ 的边序列,你需要使用交互库提供的可撤销并查集接口,在线地对于每个 $l$ 求出最大的 $r$,使得区间 $[l,r]$ 内的边不形成环。

\(n\le 10^5,lim\ge 5\times 10^6\)

好题。

先说说 Baka tricks。
如果你现在有个问题,需要双指针,但是维护的信息并不支持删除操作。此时你可以使用重构的方式。维护一个中点 \(p\),那么当左端点 \(l\) 超过 \(p\) 的时候,你可以把 \(p\) 重设在 \(r\) 处,然后对于中点 \(p\) 可以预处理出 \(\forall l\le i\le p\), \([i,p]\) 的区间答案以及 \(\forall p\le i\le r\),\([p,i]\) 区间答案,然后把两边的答案合并起来双指针就行了。这个明显是 \(O(n)\) 的。

为什么要说这个呢?因为这道题是要在线维护一个很奇怪的双指针。baka trick 可以看作有两个栈可以撤销操作,但是这题只给你一个栈去做。现在要考虑更加巧妙的重构。

你现在要把在所有重构的边左边的和重构边右边的全部丢进一个栈里。左边的称为黑边,右边的称为白边。我们撤销的时候要弹掉黑点,但是压进来的是白边。所以要想办法在每次弹的时候把黑边往栈顶移。

赛时有种做法:弹栈直到弹出来的黑边和白边数量相等。然后把白边和黑边放回去。好像说可以证明复杂度时根号级别的,常数较小,所以能过。但是看不懂证明啊。

然后写 std 做法。考虑一个二进制分组,设现在栈中有 \(s\) 个黑边,那么考虑把他按照二进制拆开。比如现在黑边最靠栈顶的连续段有连续 \(x\) 个黑边, \(x=2^p_1+2^p_2+...p_k(p1>p2>...p_k)\),那么可以把 \(2^p_k\) 给全部丢到前面去,也就是弹出 \(\mathrm{lowbit}(s)\) 个黑边(容易证明是连续的),放到白边前面,然后再弹出。发现每个黑边最多走 \(log_n\) 次就到最前面,每个白边只会被跨越 \(log n\) 次。所以总次数是 \(2nlogn\) 级别的。

#include "subway.h"
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int st[N],n,k,l,tp,r,p[N],s;
void init(int x,int m,int lim)
{
	n=m;
}
void rebuild()
{
	for(int i=l;i<=r;i++)
		undo();
	tp=0;
	for(int i=r;i>=l;i--)
		st[++tp]=i,merge(i);
	k=r;
}
int solve(int l)
{
	::l=l;
	if(l^1)
	{
		if(st[tp]==l-1)
		{
			--tp;
			undo();
		}
		else
		{
			int m=0;
			while(st[tp]>k)
				p[++m]=st[tp--],undo();
			undo(),--tp;
			int c=0;
			for(int c=1;c<((k-l+2)&(l-k-2));c++)
				p[++m]=st[tp--],undo();
			for(int i=m;i;i--)
				if(p[i]>k)
					st[++tp]=p[i],merge(p[i]);
			for(int i=m;i;i--)
				if(p[i]<=k)
					st[++tp]=p[i],merge(p[i]),++s;
		}
	}
	while(r<n&&check(r+1))
		merge(++r),st[++tp]=r;
	if(l>k)
		rebuild();
//	printf("%d %d %d\n",l,r,k); 
//	for(int i=1;i<=tp;i++)
//		printf("%d ",st[i]);
//	puts("");
	return r;
}

标签:le,UOJ693,int,规划,tp,黑边,地铁,区间,hehe
From: https://www.cnblogs.com/mekoszc/p/17913303.html

相关文章

  • 动态规划泛做
    CF833BTheBakery令\(f_{i,k}\)表示前\(i\)个数字分成\(k\)段的最大总价值,显然有暴力转移\(f_{i,k}=f_{j,k-1}+kind(j+1,i)\),其中\(kind(x,y)\)表示\([x,y]\)中不同数字的种数。但暴力转移是\(O(n^2k)\)的,考虑把\(kind\)函数拆开优化,把每种数字的贡献对应到区间......
  • python动态规划求解最长回文子串
    回文是什么,回文是正着读和反着读都是一样的字符叫着回文。 如‘aba’,‘aa’,‘b’,这些都是回文classSolution:deflongestPalindrome(self,s:str)->str:n=len(s)dp=[[False]*nfor_inrange(n)]ans=""forlinrange(n):......
  • 动态规划进阶
    数位DP常见的模板:询问\(l\simr\)中有多少个满足给定条件的数,\(1\lel\ler\le10^{18}\)。这种问题,数位DP可以做到\(O(\logv)\)级别,其中\(v\)是\(l,r\)的值域。思路直接枚举会枚举大量不可能满足条件的数,可以从数位入手。数位DP的算法流程如下:几个定义:\(len(......
  • 零基础学习信奥如何进行科学规划
    我自己与信奥、与编程有着很深的缘分,无论是从我家孩子读书时的竞赛经历(曾经的信奥选手)还是我曾经的工作背景(之前一直在教育系统从事信息学工作),到现在自己在一线执教,管理教育教学团队,总结出一些信奥学习的基本规律。 #1信奥学习进阶路线 从零基础到高水平选手的学习历程,会经过......
  • 【笔记】2023.12.16 动态规划
    笔记2023.12.16:动态规划今天题目很多,可能有些题不口胡了。LOJ6089小Y的背包计数问题前\(\sqrtn\)个物品直接做单调队列优化是\(O(n\sqrtn)\)。大于\(\sqrtn\)的是完全背包。考虑到完全背包\(v\)的OGF为\(\dfrac{1}{1-x^{v}}\)。这不行。你考虑到对于一个物......
  • 嵌入式的学习需要合理规划时间
    低级的欲望放纵即可获得,高级的欲望只有克制才能达成。——卡耐基1、粉丝的误会很多粉丝,问我, "胡老师我想报您的培训班。"...得知我知识业余时间写文章,紧接着又会问,"jg单位这么清闲啊,你居然有这么多时间写文章的?而且你文章很深,每一篇我都看都要看很久!"...这种粉丝确定不是来害......
  • springboot004旅游路线规划系统(Java毕业设计,附数据库和源码)
    第一章绪论1.1选题背景与研究意义随着社会的不断进步,在居民生活水平提高的同时,人们当前在生活的方方面面也越来越注重服务所带来的体验,随着近几年国家政策大力发展旅游业,旅游景点的建设越来也完善,旅游业的发展速度得到了显著的提升。各大旅行社、旅游景点都不断的推出新的活动计......
  • 一站式出行服务:地铁列车可视化大屏带来的便利
    地铁列车作为城市公共交通的重要组成部分,对于市民的出行起着至关重要的作用。但是,对于乘客来说,他们只能通过车窗或者站台上的大屏幕来了解地铁列车的动态信息。然而,随着科技的发展,地铁列车可视化大屏应运而生,为乘客提供了更加直观、准确的信息,让出行变得更加轻松愉悦。 山海鲸......
  • [持续更新][数据结构][算法]涵盖线性表、栈、链表、队列、图、动态规划、分治递归、回
    备考考点整理内部排序表格树的主要考点二叉树的常考紧紧抓住\(n_0=n_2+1\)\(n=n_0+n_1+n_2...n_m\)\(n=n_1+2*n_2+3*n_3...m*n_m\)+1哈夫曼树没有度为1的结点,也就是\(n_1=0\)完全二叉树常考总结最大岛屿问题(dfs模板)#include<iostream>#include<algorith......
  • 今天在地铁认识一个女程序员,在外包公司工作三年被裁,只赔偿 4000...
    来源:https://www.163.com/dy/article/G9K7V11T05373SPQ.html今天在地铁认识一个女(硕士),我邀请她来我公司面试,她要求15000一个月,听她说被外包公司骗了,合同都是套路,被裁员后只获得4000元的赔偿,就这个举动,我感觉她是一个职场小白,我看她学历这么高就给了一次机会她。她自我介绍说:学......