热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Codeforces1389F.BicoloredSegments——DP+线段树,有丶东西

Thisway题意:现在有n个线段,每个线段有一种颜色,定义一对线段是“坏的”,当且仅当这对线段i,j满足以下条件&#x

This way

题意:

现在有n个线段,每个线段有一种颜色,定义一对线段是“坏的”,当且仅当这对线段i,j满足以下条件:
1.c[i]!=c[j]
2.i和j相交(包括边界)
问你最多能选择多少线段使得其中没有任何一对线段是坏的

题解:

先后想了三种方法,花了我两个半小时
接下来假设颜色为0,1
首先我得到一个结论,就是c[i]只会从c[i]^1的地方转移过来。
因为如果从相同颜色的地方转移过来,会有很多很烦的情况(或许是我菜了),刷掉了我前两个想法。
那么怎么找这个转移的位置,可以用线段树来查询最大值。
因为我们是从相反颜色转移过来的,所以这个转移的位置后面可能会有一些相同颜色的线段,当然这两个要合在一起才能查询最大值。
那么我们只需要在这个做之前,对c[i]^1这棵线段树的0~e[i].l-1区间+1即可。
最后还需要更新c[i]线段树的e[i].r位置。
当然这是两种更新,我们需要不同处理方法:
在这里插入图片描述
有人可能会问,为什么在op=1的时候,不需要加上那些+1的线段。
因为我是按右端点排序的,所以+1的那些位置一定不会影响到后面的点,因此不需要处理这种情况。

#include
using namespace std;
#define pa pair
const int N=6e5+5;
struct Segment_Tree{int mx[N*4],ad[N*4],f[N*4];void push_down(int root){if(!f[root])return ;mx[root<<1]&#43;&#61;f[root];mx[root<<1|1]&#43;&#61;f[root];f[root<<1]&#43;&#61;f[root];f[root<<1|1]&#43;&#61;f[root];f[root]&#61;0;}void update(int l,int r,int root,int ql,int qr,int op,int v){if(l>&#61;ql&&r<&#61;qr){if(op&#61;&#61;1)mx[root]&#61;max(mx[root],v);elsemx[root]&#43;&#61;v,f[root]&#43;&#61;v;return ;}push_down(root);int mid&#61;l&#43;r>>1;if(mid>&#61;ql)update(l,mid,root<<1,ql,qr,op,v);if(mid<qr)update(mid&#43;1,r,root<<1|1,ql,qr,op,v);mx[root]&#61;max(mx[root<<1],mx[root<<1|1]);}int query(int l,int r,int root,int ql,int qr){if(l>&#61;ql&&r<&#61;qr)return mx[root];push_down(root);int mid&#61;l&#43;r>>1;int ans&#61;0;if(mid>&#61;ql)ans&#61;query(l,mid,root<<1,ql,qr);if(mid<qr)ans&#61;max(ans,query(mid&#43;1,r,root<<1|1,ql,qr));return ans;}
}t[2];
struct edge{int l,r,c;bool operator< (const edge& a)const {return r<a.r;}
}e[N];
int a[N*2];
int main()
{int n,tot&#61;0;scanf("%d",&n);for(int i&#61;1;i<&#61;n;i&#43;&#43;)scanf("%d%d%d",&e[i].l,&e[i].r,&e[i].c),e[i].c--,a[&#43;&#43;tot]&#61;e[i].l,a[&#43;&#43;tot]&#61;e[i].r;sort(a&#43;1,a&#43;1&#43;tot);tot&#61;unique(a&#43;1,a&#43;1&#43;tot)-a-1;sort(e&#43;1,e&#43;1&#43;n);for(int i&#61;1;i<&#61;n;i&#43;&#43;){e[i].l&#61;lower_bound(a&#43;1,a&#43;1&#43;tot,e[i].l)-a;e[i].r&#61;lower_bound(a&#43;1,a&#43;1&#43;tot,e[i].r)-a;}int ans&#61;0,val,num[2]&#61;{0};for(int i&#61;1;i<&#61;n;i&#43;&#43;){int col&#61;e[i].c;num[col]&#43;&#43;;t[col^1].update(0,tot,1,0,e[i].l-1,2,1);val&#61;0;val&#61;t[col^1].query(0,tot,1,0,e[i].l-1);val&#61;max(num[col],val);t[col].update(0,tot,1,e[i].r,e[i].r,1,val);ans&#61;max(ans,val);}printf("%d\n",ans);return 0;
}


推荐阅读
  • 题面:P3178[HAOI2015]树上操作好像其他人都嫌这道题太容易了懒得讲,好吧那我讲。题解:第一个操作和第二个操作本质上是一样的&# ... [详细]
  • 本文探讨了如何利用数组来构建二叉树,并介绍了通过队列实现的二叉树层次遍历方法。通过具体的C++代码示例,详细说明了构建及打印二叉树的过程。 ... [详细]
  • 题目概述:Sereja 拥有一个由 n 个整数组成的数组 a1, a2, ..., an。他计划执行 m 项操作,这些操作包括更新数组中的特定元素、增加数组中所有元素的值,以及查询数组中的特定元素。 ... [详细]
  • 本文详细解析 Skynet 的启动流程,包括配置文件的读取、环境变量的设置、主要线程的启动(如 timer、socket、monitor 和 worker 线程),以及消息队列的实现机制。 ... [详细]
  • 本文介绍了一种使用链剖分(Link-Cut Tree, LCT)来维护动态树结构的方法,特别是如何通过 LCT 来高效地管理子树的信息,如子树大小等。 ... [详细]
  • 2022年4月15日的算法练习题,包括最长公共子序列和线段树的应用。 ... [详细]
  • 本题要求计算从起点到终点所有最短路径的总权重,使用SPFA算法进行求解。 ... [详细]
  • 基于51单片机的多项目设计实现与优化
    本文探讨了基于51单片机的多个项目的设计与实现,包括PID控制算法的开关电源设计、八音电子琴仿真设计、智能抽奖系统控制设计及停车场车位管理系统设计。每个项目均采用先进的控制技术和算法,旨在提升系统的效率、稳定性和用户体验。 ... [详细]
  • ED Tree HDU4812 点分治+逆元
    这道题非常巧妙!!!我们进行点分治的时候,算出当前子节点的所有子树中的节点,到当前节点节点的儿子节点的距离,如下图意思就是当前节点的红色节点,我们要求出红色节点的儿子节点绿色节点, ... [详细]
  • 来自FallDream的博客,未经允许,请勿转载,谢谢。一天一套noi简直了.昨天勉强做完了noi2011今天教练又丢出来一套noi ... [详细]
  • Day4今天继续复习搞基础课,加油!树形DP每一个节点都分为选和不选两种状态,选为f[i,1],不选为f[i,0]&# ... [详细]
  • STM32代码编写STM32端不需要写关于连接MQTT服务器的代码,连接的工作交给ESP8266来做,STM32只需要通过串口接收和发送数据,间接的与服务器交互。串口三配置串口一已 ... [详细]
  • 题目描述:Balala Power! 时间限制:4000/2000 MS (Java/Other) 内存限制:131072/131072 K (Java/Other)。题目背景及问题描述详见正文。 ... [详细]
  • 本文详细介绍了 Node.js 中 OS 模块的 arch 方法,包括其功能、语法、参数以及返回值,并提供了具体的使用示例。 ... [详细]
  • 本文详细介绍了Golang中string类型的内部结构及其特性,包括字符串的定义、表示方式、数据结构以及相关的操作方法,如字符串拼接和类型转换等。 ... [详细]
author-avatar
手机用户2602915671
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有