题意:n点m边,然后要求走最多的路,走路的时候经过的边权必须是严格递增。

解法1:传统的区间更新

解法2:发现区间更新只是对两个固定的点所延长形成的区间段,所以问题可以退化成单点更新单点查询。

然后动态开辟线段树就行了

线段树有1e5个然后每个都是权值线段树

解法一所需要的空间会比解法二大很多很多,甚至一度以为我写错了.....

#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5+;
int rt[N],L[N*],R[N*],V[N*],lz[N*];
int n,m,tot;
void update(int &k,int pos,int l,int r,int y){
if(!k) k=++tot;
if(l>=pos) {
V[k]=max(y,V[k]);
lz[k]=max(y,lz[k]);
return;
}
if(lz[k]) {
if(!L[k]) L[k]=++tot;if(!R[k]) R[k]=++tot;
lz[L[k]]=max(lz[L[k]],lz[k]);
lz[R[k]]=max(lz[k],lz[R[k]]);
V[L[k]]=max(V[L[k]],lz[k]);
V[R[k]]=max(V[R[k]],lz[k]);
lz[k]=;
}
int m=(l+r)>>;
if(pos<=m) update(L[k],pos,l,m,y);
update(R[k],pos,m+,r,y);
V[k]=max(V[L[k]],V[R[k]]);
}
int query(int l,int r,int w,int k){
if(!k) return ;
if(r<=w) return V[k];
int m=(l+r)>>;
if(lz[k]) {
if(!L[k]) L[k]=++tot;if(!R[k]) R[k]=++tot;
lz[L[k]]=max(lz[L[k]],lz[k]);
lz[R[k]]=max(lz[k],lz[R[k]]);
V[L[k]]=max(V[L[k]],lz[k]);
V[R[k]]=max(V[R[k]],lz[k]);
lz[k]=;
}
int ans=query(l,m,w,L[k]);
if(w>m) ans=max(ans,query(m+,r,w,R[k]));
return ans;
}
int main(){
scanf("%d%d",&n,&m);
int x,y,z,ans=;
for(int i=;i<=m;++i) {
scanf("%d%d%d",&x,&y,&z);
z+=;
int Q=query(,,z-,rt[x])+;
ans=max(ans,Q);
update(rt[y],z,,,Q);
}
printf("%d\n",ans);
}
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+;
int rt[N],L[N*],R[N*],V[N*];
int n,m,tot;
void update(int &k,int pos,int l,int r,int y){
if(!k) k=++tot;
V[k]=max(V[k],y);
if(l==r) return;
int m=(l+r)>>;
if(pos<=m) update(L[k],pos,l,m,y);
else update(R[k],pos,m+,r,y);
}
int query(int l,int r,int w,int k){
if(!k) return ;
if(l==r) return V[k];
int m=(l+r)>>;
if(w<=m) return query(l,m,w,L[k]);
else return max(V[L[k]],query(m+,r,w,R[k]));
}
int main(){
scanf("%d%d",&n,&m);
int x,y,z,ans=;
for(int i=;i<=m;++i) {
scanf("%d%d%d",&x,&y,&z);
z+=;
int Q=query(,,z-,rt[x])+;
ans=max(ans,Q);
update(rt[y],z,,,Q);
}
printf("%d\n",ans);
}

F. Pathwalks动态开辟线段树的更多相关文章

  1. E. Physical Education Lessons 动态开辟线段树区间更新

    E. Physical Education Lessons time limit per test 1 second memory limit per test 256 megabytes input ...

  2. [动态dp]线段树维护转移矩阵

    背景:czy上课讲了新知识,从未见到过,总结一下. 所谓动态dp,是在动态规划的基础上,需要维护一些修改操作的算法. 这类题目分为如下三个步骤:(都是对于常系数齐次递推问题) 1先不考虑修改,不考虑区 ...

  3. luoguP4719 【模板】动态 DP 线段树+树链剖分+矩阵乘法+动态DP

    题目描述 给定一棵n个点的树,点带点权. 有m次操作,每次操作给定x,y,表示修改点x的权值为y. 你需要在每次操作之后求出这棵树的最大权独立集的权值大小. 输入输出格式 输入格式: 第一行,n,m分 ...

  4. SP1716 GSS3 - Can you answer these queries III - 动态dp,线段树

    GSS3 Description 动态维护最大子段和,支持单点修改. Solution 设 \(f[i]\) 表示以 \(i\) 为结尾的最大子段和, \(g[i]\) 表示 \(1 \sim i\) ...

  5. AGC001 F - Wide Swap【线段树+堆+拓扑排序】

    给出的模型很难搞,所以转换一下,记p[i]为i这个数的位置,然后相邻两个p值差>k的能交换,发现使原问题字典序最小也需要使这里的字典序最小 注意到p值差<=k的前后顺序一定不変,那么可以n ...

  6. 2019牛客多校第八场 F题 Flowers 计算几何+线段树

    2019牛客多校第八场 F题 Flowers 先枚举出三角形内部的点D. 下面所说的旋转没有指明逆时针还是顺时针则是指逆时针旋转. 固定内部点的答案的获取 anti(A)anti(A)anti(A)或 ...

  7. The 2019 ICPC China Nanchang National Invitational and International Silk-Road Programming Contest - F.Sequence(打表+线段树)

    题意:给你一个长度为$n$的数组,定义函数$f(l,r)=a_{l} \oplus a_{l+1} \oplus...\oplus a_{r}$,$F(l,r)=f(l,l)\oplus f(l,l+ ...

  8. arc073 F many moves(dp + 线段树)

    设dp[i][y]表示一个点在x[i],另一个点在y时最小要走的步数 那么有以下转移 对于y != x[i-1]的状态,可以证明,他们直接加|x[i] - x[i-1]|即可(如果有其他方案,不符合对 ...

  9. 【Educational Codeforces Round 37】F. SUM and REPLACE 线段树+线性筛

    题意 给定序列$a_n$,每次将$[L,R]$区间内的数$a_i$替换为$d(a_i)$,或者询问区间和 这题和区间开方有相同的操作 对于$a_i \in (1,10^6)$,$10$次$d(a_i) ...

随机推荐

  1. 怎么在java 8的map中使用stream

    怎么在java 8的map中使用stream 简介 Map是java中非常常用的一个集合类型,我们通常也需要去遍历Map去获取某些值,java 8引入了Stream的概念,那么我们怎么在Map中使用S ...

  2. 【JAVA基础】02 Java基础语法

    一.内容 注释 关键字 标识符 常量.进制和进制转换 变量 数据类型和类型转换 运算符 语句 二.注释 注释概述 用于解释说明程序的文字 Java中注释分类格式 单行注释 格式://注释文字 多行注释 ...

  3. ELSE 技术周刊(2017.12.25期)

    业界动态 V8 release v6.4 V8引擎发布v6.4,在速度和内存优化上又带来了一些提升.对于instanceof操作符的优化,带来了3.6x速度提升,同时使得uglify-js提高了15- ...

  4. 基于UDP的客户端和服务器端的代码设计

    实验平台 linux 实验内容 编写UDP服务器和客户端程序,客户端发送消息,服务器接收消息,并打印客户端的IP地址和端口号. 实验原理 UDP是无需连接的通信,其主要实现过程如下: 同样,我们可以按 ...

  5. 金钱货币用什么类型--(Java)

    0.前言 项目中,基本上都会涉及到金钱:那么金钱用什么数据类型存储呢? 不少新人都会认为用double,因为它是双精度类型啊,或者float, 其实,float和double都是不能用来表示精确的类型 ...

  6. windows下flume 采集如何支持TAILDIR和tail

    一.问题:Windows 下 flume采集配置TAILDIR的时候,会报如下错误: agent.sources.seqGenSrc.type = TAILDIR agent.sources.seqG ...

  7. 软件——IDEA主题美化

    前言 IntelliJ IDEA主要用于支持 Java.Scala.Groovy 等语言的开发工具,同时具备支持目前主流的技术和框架,擅长于企业应用.移动应用和 Web 应用的开发. IntelliJ ...

  8. Tarjan缩点割点(模板)

    描述:https://www.luogu.com.cn/problem/P3387 给定一个 nn 个点 mm 条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权 ...

  9. leetcode_课程表(BFS、拓扑排序)

    题目描述: 你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 .在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹 ...

  10. OpenWrt R2020.03.05 去广告 抗污染 加速 UnPnP NAS

    固件版本已经更新,新版本链接:https://www.cnblogs.com/zlAurora/p/12500932.html   容我啰嗦一下,为什么会有这个固件.   从KoolShare LED ...