题意: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. KVM基本功能管理

    一.KVM基础功能管理 1.查看命令帮助 virsh -h 2.查看 KVM 的配置文件存放目录(CENTOS7.0.xml是虚拟系统实例的配置文件) ls /etc/libvirt/qemu     ...

  2. 三、通过Vue基础属性做一个Table的增加、删除、姓名音位吗查询

    html头文件包括css,和vue.js的文件的引用 <!DOCTYPE html> <html lang="en"> <head> <m ...

  3. solr7.4创建core,导入MySQL数据,中文分词

    #solr版本:7.4.0 一.新建Core 进入安装目录下得server/solr/,创建一个文件夹,如:new_core 拷贝server/solr/configsets/_default/con ...

  4. mybatis源码学习(三):MappedStatement的解析过程

    我们之前介绍过MappedStatement表示的是XML中的一个SQL.类当中的很多字段都是SQL中对应的属性.我们先来了解一下这个类的属性: public final class MappedSt ...

  5. SQL SERVER 性能优化二: 数据库初始值大小及增长方式设置

    数据库增长方式主要有两种,按百分比自动增长和按固定大小自动增长,设置初始大小和增长方式需谨慎. 初始大小就是建库的大小,设小了,容易造成磁盘碎片,频繁增长也会影响IO响应.设大了,也不行,设大了,每次 ...

  6. Hadoop学习笔记(二)——插件安装和使用(Hadoop Eclipse)

    1. Hadoop Eclipse @ 配置 需注意 在写Hadoop的根目录时,路径不能有空格 http://blog.sina.com.cn/s/blog_56d8111101014mlg.htm ...

  7. codeforce 270B Multithreading

    B. Multithreading Emuskald is addicted to Codeforces, and keeps refreshing the main page not to miss ...

  8. python(MD5 单向加密)

    import hashlib m3 = hashlib.md5() #定义加密方式 src = bytes(", encoding="utf-8") #定义一个需要加密的 ...

  9. Ajax各参数介绍及使用

    Ajax各参数介绍及使用 1. url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2. type: 要求为String类型的参数,请求方式(post或get)默认为get. ...

  10. WCF(一)

    在学习WCF之前要知道几个术语: 一:终结点 终结点由3个要素组成:契约,绑定,地址. 1.契约:契约属于一个服务公开接口的一部分.一个服务的契约,定义了服务端公开的服务方法,使用的传输协议,可访问的 ...