[C++ map & dp]codeforces 960F. Pathwalks
题目传送门: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里好用的内置函数:
添加元素:
删除迭代器p指定的元素,返回指向p之后的元素
[C++ map & dp]codeforces 960F. Pathwalks的更多相关文章
- Codeforces 960F - Pathwalks
960F - Pathwalks 思路: ORZ 杜老师 用map写1e5个树状数组,骚操作 记Q为query和update次数,则节点个数约为Q*log(N) 代码: #include<bit ...
- CodeForces - 960F Pathwalks —— 主席树(n棵线段树)
题目链接:https://vjudge.net/problem/CodeForces-960F You are given a directed graph with n nodes and m ed ...
- Codeforces 960F Pathwalks ( LIS && 树状数组 )
题意 : 给出若干个边,每条边按照给出的顺序编号,问你找到一条最长的边权以及边的编号同时严格升序的一条路径,要使得这条路径包含的边尽可能多,最后输出边的条数 分析 : 这题和 LIS 很相似,不同的 ...
- 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 ...
- Pathwalks CodeForces - 960F(主席树 || 树状数组)
题意: 求树上最长上升路径 解析: 树状数组版: 998ms edge[u][w] 代表以u为一条路的终点的小于w的最长路径的路的条数 · 那么edge[v][w] = max(edge[u][w-1 ...
- dp --- Codeforces 245H :Queries for Number of Palindromes
Queries for Number of Palindromes Problem's Link: http://codeforces.com/problemset/problem/245/H M ...
- 树形DP ---- Codeforces Global Round 2 F. Niyaz and Small Degrees引发的一场血案
Aspirations:没有结果,没有成绩,acm是否有意义?它最大的意义就是让我培养快速理解和应用一个个未知知识点的能力. ————————————————————————————————————— ...
- 数学+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;再来一个前缀和 */ /***************** ...
- 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的网格,让你 ...
随机推荐
- springBoot+mybatisPlus小demo
项目介绍:采用restful api进行接口规范 / 项目框架SpringBoot+mybatis Plus / 采用mysql进行数据存储 / 采用swaggerUI进行前后端业务分离式开发. 开发 ...
- Extjs 环境安装【转】
Sencha Cmd安装 在使用前端框架ExtJs前,需对其环境加以部署,对自己的安装过程加以记录. 建议大家在安装时,最好使用VPN,个中缘由,生在跳槽的程序袁应该都懂吧.不然ruby相关命令执行时 ...
- 丑数(Ugly Numbers, UVa 136)
丑数(Ugly Numbers, UVa 136) 题目描述 我们把只包含因子2.3和5的数称作丑数(Ugly Number).求按从小到大的顺序的第1500个丑数.例如6.8都是丑数,但14不是,因 ...
- php与java
作者:eechen链接:https://www.zhihu.com/question/20377398/answer/141328982来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...
- linux系统基础之--进程计划(基于centos7.4 1708)
- 虚拟机下linux 系统网卡配置、固定IP地址
1.进入该目录下修改内容 vi /etc/sysconfig/network-scripts/ ifcfg-eth0 TYPE=Ethernet BOOTPROTO=static DEF ...
- python应用:爬虫框架Scrapy系统学习第一篇——xpath详解
HTML的三大概念:标签.元素以及属性 标签:尖括号中的文本 例:<head>……</head> 标签通常成对出现 元素:标签中的所有内容 元素中可包 ...
- Qt——事件
1.常见事件 [1]鼠标事件 (1)坐标 x(),y(), 相对windows globalX() globalY() (2)获得点击 button() [2]键盘事件 [3]定时器事件 timerI ...
- 北京Uber优步司机奖励政策(3月24日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 广州Uber优步司机奖励政策(1月4日~1月10日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...