P11024 做题报告

前言

调代码要笑着调
联考题目放在 T3 其实不然
NOIp 放个T2差不多了
具有多个常见的经典 trick,还是有点落实价值的

题意

给出长度为 \(n\) 的数组的终止状态,总共 \(m\) 次操作,每一次将区间 \([l,r]\) 的所有数字覆盖改为 \(c\),找到一个决策顺序,要求按照这个顺序做能正好完成所有操作并且终止状态正确,或报告无解

思路

首先肯定看见覆盖问题就会尝试将其转化,一个很板子的转化就是将操作序列倒转变成每一次修改后不会再动了,类似于 白雪皑皑 的做法,然后发现有一个很显然的贪心,那就是每一次找到一个区间内要不就是被染过色了,要不就是和现在需要染色的颜色相同的区间,将其染色,因为显然这个位置如果已经合法了,就一定不会在某一个后续时刻不合法,而我们每一次染完一个区间之后都有可能会出现新的可以染的区间,并且所有区间的染色顺序不分先后,这样我们就出了一个 \(O(nm\log_2 n) ~ O(n^2m)\) 的做法,下限可以使用线段树精细维护最大最小值达到。

很显然这不是正解,发现我们做法中有一个思想,叫做每一次染色之后都有可能存在新的区间可以染色,稍加思考发现很像拓扑,但是我们不能让询问区间向询问区间连边,因为它们之间不存在包含关系,所以存在的最朴素的做法就是对于每一个节点挂在所有在这个区间里面的节点上,然后就可以跑拓扑了。

很显然这个时间复杂度依旧会超时,发现我们是将每一个在这个区间内的点挂上这个区间,所以可以使用线段树把这个节点挂上去,每一次修改就是 \(O(\log n)\) 的,而且对于每一个线段树上的节点只会更新一次,每一个询问区间可以拉成 \(\log n\) 个节点,而且每一个节点可以使用并查集维护是否被修改过,所以均摊时间复杂度是 \(O((N+M)\log_2 N)\) 的。

做法

将每一个询问区间放到线段树上,然后类似拓扑将可以直接染色的点放在队里里面,每一次取出队头然后将队头的区间的所有点都染色,使用并查集维护所有没有被染色的节点。对于每一次修改,找到这个节点在线段树上的所有祖先然后将他们修改用类似拓扑排序的方式把可以被压队的放到队内,然后如果到最后有位置没有被染色或者有操作没有使用就无解,否则将拓扑序反转就是解

代码

#include<algorithm>
#include<iostream>
#include<cstring>
#include<climits>
#include<stdio.h>
#include<vector>
#include<cmath>
#include<queue>
#pragma GCC optimize(3,"Ofast","inline")
#define ll long longusing namespace std;
namespace ZYQIO{const int L=1<<20;inline char gc(){static char buf[L],*l=buf,*r=buf;if(l==r)r=(l=buf)+fread(buf,1,L,stdin);return (l==r)?EOF:*l++;}char obuf[L],*p=obuf;inline void pc(char c){if(p==obuf+L)fwrite(obuf,1,L,stdout),p=obuf;*p++=c;}inline void flush(){fwrite(obuf,1,p-obuf,stdout);}struct Reader{template<typename T>inline Reader& operator>>(T& x){x=0;short f=1;char c=gc();while(!isdigit(c)){if(c=='-')f=-1;c=gc();}while(isdigit(c))x=10*x+(c-'0'),c=gc();x*=f;return *this;}Reader(){}}cin;struct Writer{template<typename T>inline Writer& operator<<(T x){if(x < 0)pc('-'),x=-x;static short tp=0,s[40];do s[++tp]=x%10,x/=10;while(x);while(tp)pc(s[tp--] + '0');return *this;}inline Writer& operator<<(const char* s){int i=0;while(s[i])pc(s[i++]);return *this;}inline Writer& operator<<(char c){pc(c);return *this;}Writer(){}~Writer(){flush();}}cout;
}#define cin ZYQIO::cin
#define cout ZYQIO::cout
#define P pair<int,int>
#define fi first
#define se secondqueue<int>topo;const int N=5e5+9;
int n,m,d[N],a[N],vis[N];
int ql[N],qr[N],qc[N];struct node{int lt,rt;int cnt,col;vector<P>que;
};
struct SGT{#define lson(x) (x<<1)#define rson(x) (x<<1|1)node tr[N<<2];inline void pushup(int id){if(tr[lson(id)].cnt>=2 || tr[rson(id)].cnt>=2 || (tr[lson(id)].cnt==1 && tr[rson(id)].cnt==1 && tr[lson(id)].col!=tr[rson(id)].col))return tr[id].cnt=2,tr[id].col=0,void();if(tr[lson(id)].cnt==1) return tr[id].cnt=1,tr[id].col=tr[lson(id)].col,void();if(tr[rson(id)].cnt==1) return tr[id].cnt=1,tr[id].col=tr[rson(id)].col,void();tr[id].col=0;tr[id].cnt=0;return void();}inline void build(int id,int l,int r){tr[id].lt=l;tr[id].rt=r;if(l==r)return tr[id].cnt=1,tr[id].col=a[l],void();int mid=l+r>>1;build(lson(id),l,mid);build(rson(id),mid+1,r);pushup(id);}inline void change_add(int id,int l,int r,int num){if(tr[id].lt>=l && tr[id].rt<=r){tr[id].que.push_back({num,0});d[num]++;return void();}int mid=tr[id].lt+tr[id].rt>>1;if(l<=mid) change_add(lson(id),l,r,num);if(mid<r) change_add(rson(id),l,r,num);}inline void topo_push(int id){if(tr[id].cnt==0){for(auto &i:tr[id].que){if(i.se==0){--d[i.fi];i.se=1;if(!vis[i.fi] && d[i.fi]==0){topo.push(i.fi);vis[i.fi]=1;}}}}if(tr[id].cnt==1){for(auto &i:tr[id].que){if(i.se==0 && qc[i.fi]==tr[id].col){--d[i.fi];i.se=1;if(!vis[i.fi] && d[i.fi]==0){topo.push(i.fi);vis[i.fi]=1;}}}}}inline void change_del(int id,int pos){if(tr[id].lt==tr[id].rt){tr[id].col=0;tr[id].cnt=0;topo_push(id);return void();}int mid=tr[id].lt+tr[id].rt>>1;if(pos<=mid) change_del(lson(id),pos);else change_del(rson(id),pos);pushup(id);topo_push(id);}inline void topo_init(int id){topo_push(id);if(tr[id].lt==tr[id].rt) return void();topo_init(lson(id));topo_init(rson(id));}
}seg;int fa[N];
inline int Find(int x){return fa[x]==x?x:fa[x]=Find(fa[x]);}
vector<int>ans;int main(){cin>>n>>m;for(int i=1;i<=m;i++)cin>>ql[i]>>qr[i]>>qc[i];for(int i=1;i<=n;i++){cin>>a[i];if(a[i]==0)a[i]=-1;}seg.build(1,1,n);for(int i=1;i<=m;i++)seg.change_add(1,ql[i],qr[i],i);for(int i=1;i<=n;i++)fa[i]=i;seg.topo_init(1);for(int i=1;i<=(n<<2);i++){if(seg.tr[i].lt){if(seg.tr[i].cnt==0){for(auto &j:seg.tr[i].que){if(j.se==0){--d[j.fi];j.se=1;if(!vis[j.fi] && d[j.fi]==0){topo.push(j.fi);vis[j.fi]=1;}}}}if(seg.tr[i].cnt==1){for(auto &j:seg.tr[i].que){if(j.se==0 && qc[j.fi]==seg.tr[i].col){--d[j.fi];j.se=1;if(!vis[j.fi] && d[j.fi]==0){topo.push(j.fi);vis[j.fi]=1;}}}}}}while(topo.size()){int now=topo.front();topo.pop();ans.push_back(now);for(int i=Find(qr[now]);i>=ql[now];i=Find(i-1)){seg.change_del(1,i);fa[i]=i-1;}}if(ans.size()!=m || (seg.tr[1].cnt!=0 && seg.tr[1].col!=-1)) return cout<<"NE",0;reverse(ans.begin(),ans.end());cout<<"DA\n";for(auto i:ans)cout<<i<<' ';return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/943256.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多模态数据湖技术深化,Data Agent新能力发布!“认知”将决定企业上限

火山引擎AI创新巡展武汉站成功举办,在下午场的「Data +AI专场闭门会」上,近百名来自各行业的企业管理人员和技术专家共同探讨了在AI浪潮下,企业如何跨越数据应用的鸿沟,真正实现既懂数据又懂业务的智能化升级。会上…

云斗 YDR Special# 004 S 模拟赛

, Rank .拜谢大水赛。玩爽了。[YDR Special# 004] YDSP 2025 云斗 CSP-S 二轮(复赛)全真模拟 链接:link 题解:暂无 时间:4h (2025.10.22 07:40~11:40) 题目数:4 难度:A B C D\(\color{#F39C11} 橙\) \(\color{…

实用指南:网络编程之TCP协议

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年10月投资纠纷律师推荐:五强榜单对比评测与选择指南

一、引言 在私募基金、信托计划、资管产品快速扩容的当下,投资纠纷已从偶发风险演变为高净值人群、机构投资者、家族办公室乃至创业者必须直面的常规课题。一旦触发兑付危机、估值跳水或管理人失联,资金回收窗口往往…

完整教程:大模型开发 - 04 QuickStart_DeepSeek 模型调用流程源码解析:从 Prompt 到远程请求

完整教程:大模型开发 - 04 QuickStart_DeepSeek 模型调用流程源码解析:从 Prompt 到远程请求2025-10-22 12:06 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !impo…

Web刷题篇-1 [BJDCTF2020]Easy MD5

打开可以看到如下界面: 打开Burp Suite,输入111后点击提交查询,可以看到如下图所示,将其发至Repeater。 切换至Repeater,进行发送后,可以看到在Response中password=md5($pass,true).这个时候就想到md5的万能…

doris集成vertica 数据源catalog

准备:linux编译环境,需要安装好docker,使用docker编译,同时可以运行linux版本的idea idea官方 下载一个社区版本即可。并复制到虚拟机linux环境的任意目录。启动即可。需要为linux配置好mavengithub 编译doris请参…

JUnit 6.0.0发布:Java 17基线、取消API与Kotlin协程支持

JUnit 6.0.0正式发布,统一平台版本并提升最低要求至Java 17。新增Kotlin协程测试支持、取消令牌API、内置Java飞行记录器监听器,采用JSpecify空值注解并迁移至FastCSV库。Vintage模块现已弃用,为JUnit 4用户提供迁移…

2025年10月上海ICL医生推荐榜:王晓瑛领衔五强对比

想在上海做ICL晶体植入,却担心医生经验不足、术后效果不稳、价格不透明?这是不少近视患者共同的焦虑。ICL手术对医生资质、晶体定制、术前评估要求极高,一旦选择失误,可能面临二次手术或视觉质量下降。2025年,上海…

2025年10月消泡剂厂家推荐:权威榜单一网打尽

如果您正在寻找稳定供货、技术响应快、性价比高的消泡剂厂家,大概率会陷入“信息过载”:网页广告繁多、参数口径不一、小厂贴牌混杂,担心样品与批量质量不一致,又怕售后无人跟进。尤其在2025年四季度环保核查趋严、…

详细介绍:老题新解|合法C标识符

详细介绍:老题新解|合法C标识符pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&qu…

国产化Excel开发组件Spire.XLS教程:使用Python将TXT文件转换为CSV

在 Python 中处理数据时,将 TXT 文本文件转换为 CSV 是数据分析、报表生成或跨应用共享数据的常见需求。本文将详细介绍如何借助Spire.XLS使用 Python 实现 TXT 文件转 CSV,包括单文件转换、批量转换以及处理不同分隔…

VMware Holodeck 9.0.1.0 发布 - 自动化部署 VCF 实验环境

VMware Holodeck 9.0.1.0 发布 - 自动化部署 VCF 实验环境VMware Holodeck 9.0 - 自动化部署 VCF 实验环境 高效管理虚拟机 (VM) 和容器工作负载,为本地部署的全栈超融合基础架构 (HCI) 提供云的优势。 请访问原文链接…

【AI大模型前沿】HunyuanWorld-Voyager:腾讯开源的超长漫游世界模型,开启3D场景生成新纪元 - 指南

【AI大模型前沿】HunyuanWorld-Voyager:腾讯开源的超长漫游世界模型,开启3D场景生成新纪元 - 指南2025-10-22 11:52 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal …

[题解]meal

题目描述 下课铃终于响了,你和一群朋友(共 N 人)一起冲到食堂。因为你们到的非常早,现在食堂窗口前面还没有人。食堂共有两个窗口。你们每个人打饭会耗时 a i,打完立刻去座位上吃饭会耗时 b i,由于你们吃完饭要一…

CADSoftTools发布两款重要更新:CAD VCL Multiplatform 16.2 与 CAD .NET 16全新发布

近日,CADSoftTools 宣布推出两款产品更新——CAD VCL Multiplatform 16.2 与 CAD .NET 16。两款新版本均在性能与兼容性方面实现重大提升,为 Delphi、C++Builder 以及 .NET 开发者打造更加高效、现代化的 CAD 应用开…

linux常用命令 - 实践

linux常用命令 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "…

2025 年公交/乡村/不锈钢/智能候车亭厂家推荐:江苏丁一城市智能科技有限公司提供定制化方案与全流程服务

行业背景 随着城市化进程不断推进,城市街具作为公共基础设施的重要组成部分,其功能性与美观性需求持续提升。候车亭作为市民日常出行的关键节点设施,不仅需要满足基础的遮风挡雨功能,还需融入智能交互、文化特色与…

python 查看arcgis里面的模板文件都链接着啥内容在arcgis里面输入的代码

我有个arcgis里面有一堆图 在输入代码的框里面输入import arcpy import osmxd = arcpy.mapping.MapDocument("CURRENT") layers = arcpy.mapping.ListLayers(mxd)print "=" * 60 print "ALL …

2025年10月河道防撞护栏厂家全景解析报告,基于专业测评的技术、性能及市场优势深度分析

随着城市水利基础设施建设和河道治理要求的不断提升,河道防撞护栏作为保障公共安全的重要设施,其技术标准与市场需求日益提高。根据行业调研数据显示,2024年防撞护栏市场规模已达68亿元,年均增长率稳定在9.5%左右。…