F. Pathwalks动态开辟线段树
题意: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动态开辟线段树的更多相关文章
- E. Physical Education Lessons 动态开辟线段树区间更新
E. Physical Education Lessons time limit per test 1 second memory limit per test 256 megabytes input ...
- [动态dp]线段树维护转移矩阵
背景:czy上课讲了新知识,从未见到过,总结一下. 所谓动态dp,是在动态规划的基础上,需要维护一些修改操作的算法. 这类题目分为如下三个步骤:(都是对于常系数齐次递推问题) 1先不考虑修改,不考虑区 ...
- luoguP4719 【模板】动态 DP 线段树+树链剖分+矩阵乘法+动态DP
题目描述 给定一棵n个点的树,点带点权. 有m次操作,每次操作给定x,y,表示修改点x的权值为y. 你需要在每次操作之后求出这棵树的最大权独立集的权值大小. 输入输出格式 输入格式: 第一行,n,m分 ...
- SP1716 GSS3 - Can you answer these queries III - 动态dp,线段树
GSS3 Description 动态维护最大子段和,支持单点修改. Solution 设 \(f[i]\) 表示以 \(i\) 为结尾的最大子段和, \(g[i]\) 表示 \(1 \sim i\) ...
- AGC001 F - Wide Swap【线段树+堆+拓扑排序】
给出的模型很难搞,所以转换一下,记p[i]为i这个数的位置,然后相邻两个p值差>k的能交换,发现使原问题字典序最小也需要使这里的字典序最小 注意到p值差<=k的前后顺序一定不変,那么可以n ...
- 2019牛客多校第八场 F题 Flowers 计算几何+线段树
2019牛客多校第八场 F题 Flowers 先枚举出三角形内部的点D. 下面所说的旋转没有指明逆时针还是顺时针则是指逆时针旋转. 固定内部点的答案的获取 anti(A)anti(A)anti(A)或 ...
- 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+ ...
- arc073 F many moves(dp + 线段树)
设dp[i][y]表示一个点在x[i],另一个点在y时最小要走的步数 那么有以下转移 对于y != x[i-1]的状态,可以证明,他们直接加|x[i] - x[i-1]|即可(如果有其他方案,不符合对 ...
- 【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) ...
随机推荐
- Pytorch中自定义神经网络卷积核权重
1. 自定义神经网络卷积核权重 神经网络被深度学习者深深喜爱,究其原因之一是神经网络的便利性,使用者只需要根据自己的需求像搭积木一样搭建神经网络框架即可,搭建过程中我们只需要考虑卷积核的尺寸,输入输出 ...
- 源码安装nginx 方法二
yum 仓库不能用大写字母 [root@oldboy conf.d]# gzip * 压缩当前目录下的所有文件 gzip ./* gzip . gzip./ # 关闭防火墙和selinux [root ...
- Pycharm中设置encoding
在Pycharm专业版中,为了防止文件在别的机器上出现乱码,所以需要进行字符编码的设置. 首先在Pycharm中的View中将下图中的Toolbar打上勾. 接着,工具栏就会出现,选中settings ...
- Hyperf基础教程
前提说明 本教程适用于新手.老手,也适用于任何操作系统,包括Windows.linux.MacOS 介绍 Hyperf 是基于 Swoole 4.4+ 实现的高性能.高灵活性的 PHP 协程框架,内置 ...
- 看了就会的VScode给C++的配置编译环境(Visual Studio Code)
我看了网上的大佬们配的我是在是看不懂啊?我是一个小白啊?这太难了,这阻挡不了我,想使用这很骚的IDE,于是在不断的摸索下,终于配置成功,小白们也不用慌,这次非常简单.一定可以的. 1.下载 VS Co ...
- Spring 注解注入—@Qualifier 注释
当创建多个具有相同类型的 bean 时,并且想要用一个属性只为它们其中的一个进行装配,在这种情况下,你可以使用 @Qualifier 注释和 @Autowired 注释通过指定哪一个真正的 bean ...
- 支付宝小程序serverless---获取用户信息(头像)并保存到云数据库
支付宝小程序serverless---获取用户信息(头像)并保存到云数据库 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 我又 ...
- P1191 矩形
------------恢复内容开始------------ 题意 给出一个\(n*n\)的矩阵,矩阵中,有些格子被染成白色,有些格子被染成黑色,现要求矩阵中白色矩形的数量 分割线 Ⅰ.暴力出奇迹!! ...
- 线段树 扫描线 L - Atlantis HDU - 1542 M - City Horizon POJ - 3277 N - Paint the Wall HDU - 1543
学习博客推荐——线段树+扫描线(有关扫描线的理解) 我觉得要注意的几点 1 我的模板线段树的叶子节点存的都是 x[L]~x[L+1] 2 如果没有必要这个lazy 标志是可以不下传的 也就省了一个pu ...
- 按照这些优化技巧来写 SQL,连公司 DBA 也鼓掌称赞!
原文链接:按照这些优化技巧来写 SQL,连公司 DBA 也鼓掌称赞! 刚毕业的我们,都以为使用 MySQL 是非常的简单的,无非都是照着 [select from where group by ord ...