题目传送门:960F

思路:

题目给人的感觉很像最长上升子序列,自然而然想到用dp的思路去处理

题目中给的限制条件是,要接上前面的边,前面的边权一定要小于当前的边权(题目按照输入的顺序,因此只找前面的边)

对于每个结点,我们要维护的信息是:

  当前状态下,w的边权到达这个点,最多能有几条边

如何维护这个信息呢?如果对每个点开一个maxn的数组,每次暴力修改,显然是过不去的

一种处理办法是:对每个点建动态线段树(可是本菜鸡不会!!。。我马上去学

另一种简单的处理办法:用map以及map内置的函数

对每个点建立一个map<int,int> 保存对应边权下,能达到的最大的边数

vector< map<int,int> > s;
...
s.resize(n+);

对于每条边(a,b,w), 查a点的map里,小于w 的最大的边数

 int get_edge_no(int a,int w){
auto t = s[a].lower_bound(w);
if(t == s[a].begin())return ;
--t;
return t->second;
}

然后得到b对应的w的结果,再保存至b的map里

         int t = get_edge_no(a,w) + ;
if(t < get_edge_no(b,w+))continue;
s[b][w] = t;

保存之后,一定要将map里w大 val小的元素删除(因为这部分数据也需要更新)

         auto it = s[b].upper_bound(w);
while(it != s[b].end() && it->second < t){
it = s[b].erase(it);
}
ans = max(ans,t);

完整代码:

 #include <bits/stdc++.h>

 using namespace std;
#define _____ ios::sync_with_stdio(false);cin.tie(0);
int n,m;
const int maxn = ;
vector< map<int,int> > s;
int get_edge_no(int a,int w){
auto t = s[a].lower_bound(w);
if(t == s[a].begin())return ;
--t;
return t->second;
}
int main(){
//freopen("data.in","r",stdin);
_____
cin >> n >> m;
s.resize(n+);
int a,b,w;
int ans = ;
for(int i = ; i <= m; i++){
cin >> a >> b >> w;
int t = get_edge_no(a,w) + ;
if(t < get_edge_no(b,w+))continue;
s[b][w] = t;
auto it = s[b].upper_bound(w);
while(it != s[b].end() && it->second < t){
it = s[b].erase(it);
}
ans = max(ans,t);
}
cout << ans << '\n';
return ;
}

下面整理一下map里好用的内置函数:

添加元素:

map<typename,typename>.insert( pair<typename,typename> ); // 注意参数是pair类型
返回一个pair类型,first成员是一个迭代器,second成员是一个bool值,true:插入成功 false:已存在
 
删除元素:
 
map.erase( k ); 
删除关键字为k的元素,返回删除的元素数量
map.erase( p );
删除迭代器p指定的元素,返回指向p之后的元素
map.erase(b,e);
删除迭代器对b,e之间的元素,返回e
 
查找元素:
 
map.upper_bound( k ); map.lower_bound( k );
以第一关键字比较大小,返回一个迭代器
map.equal_range(k);
返回一个迭代器pair,表示关键字等于k的范围。若不存在,都等于map.end()
 

[C++ map & dp]codeforces 960F. Pathwalks的更多相关文章

  1. Codeforces 960F - Pathwalks

    960F - Pathwalks 思路: ORZ 杜老师 用map写1e5个树状数组,骚操作 记Q为query和update次数,则节点个数约为Q*log(N) 代码: #include<bit ...

  2. CodeForces - 960F Pathwalks —— 主席树(n棵线段树)

    题目链接:https://vjudge.net/problem/CodeForces-960F You are given a directed graph with n nodes and m ed ...

  3. Codeforces 960F Pathwalks ( LIS && 树状数组 )

    题意 : 给出若干个边,每条边按照给出的顺序编号,问你找到一条最长的边权以及边的编号同时严格升序的一条路径,要使得这条路径包含的边尽可能多,最后输出边的条数 分析 :  这题和 LIS 很相似,不同的 ...

  4. Codeforces 960 二进制构造子序列 完全二叉树shift模拟 主席树/MAP DP

    A #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #def ...

  5. Pathwalks CodeForces - 960F(主席树 || 树状数组)

    题意: 求树上最长上升路径 解析: 树状数组版: 998ms edge[u][w] 代表以u为一条路的终点的小于w的最长路径的路的条数 · 那么edge[v][w] = max(edge[u][w-1 ...

  6. dp --- Codeforces 245H :Queries for Number of Palindromes

    Queries for Number of Palindromes Problem's Link:   http://codeforces.com/problemset/problem/245/H M ...

  7. 树形DP ---- Codeforces Global Round 2 F. Niyaz and Small Degrees引发的一场血案

    Aspirations:没有结果,没有成绩,acm是否有意义?它最大的意义就是让我培养快速理解和应用一个个未知知识点的能力. ————————————————————————————————————— ...

  8. 数学+DP Codeforces Round #304 (Div. 2) D. Soldier and Number Game

    题目传送门 /* 题意:这题就是求b+1到a的因子个数和. 数学+DP:a[i]保存i的最小因子,dp[i] = dp[i/a[i]] +1;再来一个前缀和 */ /***************** ...

  9. dp - Codeforces Round #313 (Div. 1) C. Gerald and Giant Chess

    Gerald and Giant Chess Problem's Link: http://codeforces.com/contest/559/problem/C Mean: 一个n*m的网格,让你 ...

随机推荐

  1. 微信小程序 | 未来O2O电商的“阴谋”

    发展历史 2016年1月11日,微信之父张小龙时隔多年的公开亮相,提出了公众号服务的短板,而透露微信内部正在研发的新形态工具,称之"微信小程序". 2016年9月21日,微信小程序 ...

  2. iOS 自定义任意形状加载进度条(水波纹进度条)

    1. 项目中要做类似下面的加载动画: 先给出安卓的实现方式 2.iOS的实现方式参考了下面两位的,感谢. 以任意底部图片为背景的加载动画 和 水波纹动画 最后附上自己的demo

  3. c和c++单链表

    c++版 #include<iostream> #include<malloc.h> using namespace std; struct node{ int data; n ...

  4. Filebeat使用模块收集日志

    1.先决条件 在运行Filebeat模块之前: 安装并配置Elastic stack 完成Filebeat的安装 检查Elasticsearch和Kibana是否正在运行,以及Elasticsearc ...

  5. JS 匿名函数或自执行函数总结

    JS引擎在遇到function关键字时做如下两种处理: 1.当语句是以function关键字开头:此时的JS语句解释为函数声明,因此function关键字后面必须要跟函数名字,如果写成匿名函数,则会报 ...

  6. Asp.Net Core使用Log4Net优化日志【项目开源】

    我在前一篇文章中介绍了一种使用Log4Net的方法,但是那种方法打出来的日志不是很直观 然后我前不久阅读了一篇非常不错的博客:https://www.cnblogs.com/guolianyu/p/9 ...

  7. Flask中那些特殊的装饰器

    模板相关的装饰器 @app.template_global() 用法: @app.template_global() # 记得加括号 def jiafa(a, b): # 这个方法每调用一次就需要传一 ...

  8. day30 进程

    推荐两本书:现代操作系统和操作系统原来,学习好python以后再去研究.   并发:任务的切换,保存状态,存在io的是实现空间和时间的 重复利用 操作系统的发展历史: 第一代(1940-1955)手工 ...

  9. 在树莓派上用 python 做一个炫酷的天气预报

    教大家如何在树莓派上自己动手做一个天气预报.此次教程需要大家有一定的python 基础,没有也没关系,文末我会放出我已写好的代码供大家下载. 首先在开始之前 需要申请高德地图API,去高德地图官网注册 ...

  10. buck型DC-DC分析

    BUCK型DC/DC电源分析 这种buck型DC/DC电路的拓扑结构:( 1N5822叫续流二极管!) LM2756相当于高速断开和闭合的开关,连接在Vin与Vout脚之间. 1. 在开关闭合时,电流 ...