首页 > 其他分享 >HHHOJ #1238. 「NOIP 2023 模拟赛 20230712 D」但战斗还未结束 思考--zhengjun

HHHOJ #1238. 「NOIP 2023 模拟赛 20230712 D」但战斗还未结束 思考--zhengjun

时间:2023-07-12 14:01:10浏览次数:40  
标签:rt 20230712 NOIP zhengjun -- long int dfs query

赛时想写 60pts,结果 cxr 似乎少算了一点空间,导致我一直没把空间卡过去QWQ。

当时不会 dfs 求拓扑序,这里讲一下。

枚举所有非访问过的点依次 dfs,每次进行下列操作:

  • 找出 \(v\) 的一个未访问过的入点 \(u\),调用 dfs(u)

  • 找不到 \(u\) 的时候,把 \(v\) 加入拓扑序列中。

代码

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=5e5+10;
int n,a[N],p[N];
pair<int,int>t[N<<2];
void pushup(int rt){
	t[rt]=max(t[rt<<1],t[rt<<1|1]);
}
void build(int l=1,int r=n,int rt=1){
	if(l==r){
		t[rt]={p[l],l};
		return;
	}
	int mid=(l+r)>>1;
	build(l,mid,rt<<1);
	build(mid+1,r,rt<<1|1);
	pushup(rt);
}
void erase(int x,int l=1,int r=n,int rt=1){
	if(l==r){
		t[rt]={-1,l};
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid)erase(x,l,mid,rt<<1);
	else erase(x,mid+1,r,rt<<1|1);
	pushup(rt);
}
pair<int,int> query(int L,int R,int l=1,int r=n,int rt=1){
	if(L<=l&&r<=R)return t[rt];
	int mid=(l+r)>>1;
	pair<int,int>s(-1,0);
	if(L<=mid)s=max(s,query(L,R,l,mid,rt<<1));
	if(mid<R)s=max(s,query(L,R,mid+1,r,rt<<1|1));
	return s;
}
int cnt,ans[N];
void dfs(int i){
	if(ans[i])return;
	erase(i);
	if(p[i]<=n)dfs(p[i]);
	for(;a[i]>1;){
		auto x=query(1,a[i]-1);
		if(x.first<=i)break;
		dfs(x.second);
	}
	ans[i]=++cnt;
}
int main(){
	freopen("war.in","r",stdin);
	freopen("war.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	fill(p+1,p+1+n,n+1);
	for(int i=1;i<=n;i++)
		if(~a[i])p[a[i]]=i;
		else a[i]=n+1;
	build();
	for(int i=1;i<=n;i++)dfs(i);
	for(int i=1;i<=n;i++)printf("%d%c",ans[i],"\n "[i<n]);
	return 0;
}

标签:rt,20230712,NOIP,zhengjun,--,long,int,dfs,query
From: https://www.cnblogs.com/A-zjzj/p/17547309.html

相关文章

  • 橱柜安装顺序
    1、地板:7.12号上午安装好2、7.12送柜子3、7.13号柜子安装:可否先安装橱柜,橱柜安装好后,优先安装吊顶4、7.14号安装橱柜时约烟机灶具安装+燃气安装5、7.15号安装门套、净水器安装15号6、阳台柜、台盆、晾衣架、灯、浴霸、花洒7、煤气软管 ......
  • linux下批量重命名目录及子目录下的文件
    一、加上后缀名假如只是给当前目录及所有子目录下的文件添加后缀名,使用find和mv就可以了。比如把当前及子目录下所有带_test后缀的文件加上.c后缀find.-typef-name'*_test'-execmv{}{}.c\;find.查找当前及子目录,GNU版本的find也可以省略点号,效果一样。......
  • Java实现浏览器端大文件分片上传技术
    ​ javaweb上传文件上传文件的jsp中的部分上传文件同样可以使用form表单向后端发请求,也可以使用ajax向后端发请求    1.通过form表单向后端发送请求         <formid="postForm"action="${pageContext.request.contextPath}/UploadServlet"method="post"e......
  • 树状数组学习笔记与总结
    树状数组学习笔记与总结目录树状数组OIWiki信息学奥赛一本通例题单点修改,区间查询区间修改,单点查询区间修改,区间查询树状数组OIWikiOIWiki-树状数组信息学奥赛一本通例题单点修改,区间查询LibreOJ树状数组1:单点修改,区间查询我的代码点击查看代码#include<......
  • 【雕爷学编程】Arduino动手做(117)---P10V706LED屏模组4
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • Nginx 常用的基础配置(web前端相关方面)
    基础配置userroot;worker_processes1;events{worker_connections10240;}http{log_format'$remote_addr-$remote_user[$time_local]''"$request"$status$bod......
  • windwos使用FRP方式
    FRP使用方法流程图如下访问FRP官方项目https://freefrp.net下面是windwos演示进入网站选择客户端下载客户端版本选择windwos是adm64当今绝大部分都是这个操作系统了解压好后主要用到上面这两个东西配置方式打开frpc.ini把里面的配置信息全部删除即可配置方......
  • 监控生命周期
    服务器上架到机柜基础设施监控服务器温度,风扇转速 ipmitool命令,只能用在物理机存储的监控(df,fdisk,iotop)cpu(lscpu,uptime,top,htop,glances)内存情况(free)网络(iftop)应用监控       mysql  redis        nginx       php......
  • golang channel Synchronization
    在Go语言中,通道(channel)是一个很重要的并发同步机制,可以用来在不同的goroutine之间发送和接收数据。通道实现了一个先进先出(FIFO)的数据结构,所以可以确保数据的接收顺序与发送顺序一致。此外,通道的发送和接收操作都是原子的,这意味着你不需要额外的锁来同步数据访问。这里有几......
  • 高通个别驱动创建Buffer耗时高问题的解决
    前言最近在优化游戏的时候,发现在在高通特定驱动版本的机器上(855,855+等),创建VB的耗时跟VB的数量成正比,这个应该是驱动的bug。跟官方人员确认过,确实是有这个问题,他们给的解决方案是减少Buffer的数量,经过一轮优化后,Buffer数量减少了将近30%,但是这个耗时的问题还是没能解决,在正常机......