题意: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. 计算机网络 之 Cisco packet tracer 的安装及汉化

    可以去官网下载最新版本的Cisco packet tracer 免费 汉化包及7.1版本百度云链接:链接: https://pan.baidu.com/s/1XudelgnMu6XysCZ36csl7 ...

  2. CentOS7虚拟机安装vmtools

    直接开始: 在安装vmtools之前,需要先安装两个小部件,否则将安装失败. 下面是步骤: 1.切换为root模式,需要输入root密码,但是不显示. 命令为: su 2.安装gcc 命令为: yum ...

  3. 对话Roadstar投资人:一家自动驾驶公司之死(三) ...

    11. Roadstar 如何收场? 雷锋网:你觉得 Roadstar 造成今天这样的局面,是什么导致的? 投资人代表 1:刚才我们也数次表达了,在每个人身上,可能每个人的诉求,不能达到同步,与公司的 ...

  4. JS的String()、toString()、valueOf()的一些隐秘特性

    toString()方法 要把一个值转换为一个字符串,最常用的就是,使用几乎每个值都有的toString()方法,这个方法唯一要做的就是返回相应值的字符串表现. 数值.布尔值.对象和字符串值(没错,每 ...

  5. python-函数变量与方法公有、私有整理

    关于函数与方法的区别: 函数: def funname(): 括号里面可以有形参,也可以没有,为空 在函数里面的参数整理: 方法: def funcname(self): 括号里面必须有个self,因 ...

  6. Scrapy爬虫框架基本使用

    scrapyhub上有些视频简单介绍scrapy如何学习的(貌似要FQ):https://helpdesk.scrapinghub.com/support/solutions/articles/220 ...

  7. kafka可插拔增强如何实现?

    导弹拦截,精准防御. 背景 拦截器:在不修改应用程序业务逻辑的情况下,一组基于事件的可插拔的逻辑处理链: 类比springMVC的拦截器: 这些都是通过配置拦截器,插入到应用程序中,实现可插拔的修改业 ...

  8. qt creator源码全方面分析(4-2)

    目录 global头文件 global.h xx.h global头文件 插件的本质就是动态链接库,对于库,需要导出符号,供用户导入使用.在qt creator的源码中,存在固定的导入导出模式. gl ...

  9. JavaScript 循环判断练习题

    JavaScript 循环判断练习题 小明有一组水果("苹果","梨子","香蕉","葡萄","西瓜" ...

  10. AbstractList源码分析

    AbstractList 1 类图 2 字段 // 默认容量 private static final int DEFAULT_CAPACITY = 10; // 共享的空数组 private sta ...