CF960F Pathwalks_权值线段树_LIS
2024-08-31 08:17:32
很不错的一道思维题。
Code:
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn = 1000000 + 4;
const int inf = 100000 + 4;
int n, m;
int root[maxn], maxv[maxn << 2],ch[maxn << 2][2], cnt;
inline void get_max(int &a,int b)
{
if(b > a) a = b;
}
struct Segment_Tree
{
#define lson ch[o][0]
#define rson ch[o][1]
inline void update(int l,int r,int delta,int val,int &o)
{
if(!o) o = ++cnt;
if(l == r)
{
get_max(maxv[o], delta);
return;
}
int mid = (l + r) >> 1;
if(val <= mid)
update(l, mid, delta, val, ch[o][0]);
else
update(mid + 1, r, delta, val, ch[o][1]);
get_max(maxv[o], max(maxv[lson], maxv[rson]));
}
inline int query(int l,int r,int L,int R,int o)
{
if(!o) return 0;
if(l > r || r < L || l > R || L > R) return 0;
if(l >= L && r <= R)
return maxv[o];
int mid = (l + r) >> 1;
return max(query(l, mid, L, R, lson), query(mid + 1, r, L, R, rson));
}
}T;
int main()
{
//freopen("input.in","r",stdin);
scanf("%d%d",&n,&m);
int ans = 0;
for(int i = 1;i <= m; ++i)
{
int from, to, val;
scanf("%d%d%d",&from, &to,&val);
++ val;
int tmp = T.query(1, inf , 1, val - 1, root[from]);
T.update(1, inf, tmp + 1, val, root[to]);
get_max(ans, tmp + 1);
}
printf("%d",ans);
return 0;
}
最新文章
- 113使用FOR做九九税法表-不知道为什么自己的编译器实现不了制表符
- job
- mathematics
- GridView按钮事件
- jQuery 获取 select 值和文本
- interactive_timeout
- Spring各种注解标签作用详解
- Windows Python 2.7 安装 Numpy
- Kendo Web UI Grid添加一个html控件如(checkbox,button)
- C陷阱与缺陷(四)
- 关于一点jeesite
- Django数据模型——通用字段选项
- windows下运行Eigen
- HDU 1074 (DP + 状态压缩)
- html-div+span-4
- 自动化测试-7.selenium定位一组对象
- 并发工具CyclicBarrier
- gdb调试报错:Missing separate debuginfos, use: debuginfo-install glibc-XXX
- (转)C#垃圾回收机制详解
- .net core 实现默认图片