Codeforces 459E Pashmak and Graph

http://www.codeforces.com/problemset/problem/459/E

题意:

给出n个点,m条边的有向图,每个边有边权,求一条最长的边权上升的路径的长度。

思路:用f存边,g存点,然后排序转移,注意相同的要延迟转移

 1 #include<cstdio>
 2 #include<cmath>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<iostream>
 6 struct edge{
 7     int u,v,w;
 8 }e[300005];
 9 int n,m,f[300005],g[300005];
10 int read(){
11     int t=0,f=1;char ch=getchar();
12     while (ch<‘0‘||ch>‘9‘){if (ch==‘-‘) f=-1;ch=getchar();}
13     while (‘0‘<=ch&&ch<=‘9‘){t=t*10+ch-‘0‘;ch=getchar();}
14     return t*f;
15 }
16 bool cmp(edge a,edge b){
17     return a.w<b.w;
18 }
19 int main(){
20     n=read();m=read();
21     for (int i=1;i<=m;i++){
22         e[i].u=read();e[i].v=read();e[i].w=read();
23     }
24     std::sort(e+1,e+1+m,cmp);
25     int t=1,ans=0;
26     for (int i=1;i<=m;i++){
27         f[i]=g[e[i].u]+1;
28         if (e[i].w!=e[i+1].w){
29             for (int j=t;j<=i;j++)
30              g[e[j].v]=std::max(g[e[j].v],f[j]);
31             t=i+1;
32         }
33         ans=std::max(ans,f[i]);
34     }
35     printf("%d\n",ans);
36     return 0;
37 }
时间: 2024-12-26 18:42:37

Codeforces 459E Pashmak and Graph的相关文章

Codeforces 459E Pashmak and Graph(dp+贪心)

题目链接:Codeforces 459E Pashmak and Graph 题目大意:给定一张有向图,每条边有它的权值,要求选定一条路线,保证所经过的边权值严格递增,输出最长路径. 解题思路:将边按照权值排序,每次将相同权值的边同时加入,维护每个点作为终止点的最大长度即可. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 3

codeforces 459E E. Pashmak and Graph(dp)

题目链接: codeforces 459E 题目大意: 给出n个点,m条边的有向图,每个边有边权,求一条最长的边权上升的路径的长度. 题目分析: 定义dp[i]表示第i条边结尾的情况下的最长路径. 定义g[i]表示点i结尾的情况的最长路径. 对所有的边进行排序,那么前面的边只可能小于等于后面的边. 所以dp[i] = g[e[i].u]+1 然后只需要特殊考虑一下边相等的情况,更新g[i]即可,具体见代码. AC代码: #include <iostream> #include <cstr

Codeforces Round 261 Div.2 E Pashmak and Graph --DAG上的DP

题意:n个点,m条边,每条边有一个权值,找一条边数最多的边权严格递增的路径,输出路径长度. 解法:先将边权从小到大排序,然后从大到小遍历,dp[u]表示从u出发能够构成的严格递增路径的最大长度. dp[u] = max(dp[u],dp[v]+1),因为有重复的边权值,所以用dis数组先记录,到不重复时一起更新重复的那些边权. 代码: (非原创) #include <iostream> #include <cstdio> #include <cstring> #incl

Codeforces Round #261 (Div. 2)——Pashmak and Graph

题目链接 题意: n个点,m个边的有向图,每条边有一个权值,求一条最长的路径,使得路径上边值严格递增.输出路径长度 (2?≤?n?≤?3·105; 1?≤?m?≤?min(n·(n?-?1),?3·105)) 分析: 因为路径上会有重复点,而边不会重复,所以最开始想的是以边为状态进行DP,get TLE--后来想想,在以边为点的新图中,边的个数可能会很多,所以不行. 考虑一下裸的DP如何做:路径上有重复点,可以将状态详细化,dp[i][j]表示i点以j为结束边值的最长路,但是数据不允许这样.想想

CodeForces 459D Pashmak and Parmida&#39;s problem

Pashmak and Parmida's problem Time Limit:3000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Practice CodeForces 459D Description Parmida is a clever girl and she wants to participate in Olympiads this year. Of course she

codeforces 459C - Pashmak and Buses 【构造题】

题目:codeforces 459C - Pashmak and Buses 题意:给出n个人,然后k辆车,d天时间,然后每天让n个人选择坐一辆车去上学,要去d天不能有任意两个人乘同一辆车,不能的话输出 -1 分类:数学,构造 分析:这个题目首先得分析,我开始想到的是首先用相同的放在一起,比如 7 2 3 这样构造 1 1 1 1 2 2 2 1 1 1 2 2 2 1 1 1 2 2 2 1 1 1 2 2 2 1 1 1 就是需要的天数跟每一行出现次数最多的数的出现次数相等,但是发现还有更优

Codeforces 459D Pashmak and Parmida&#39;s problem(树状数组)

题目链接:Codeforces 459D Pashmak and Parmida's problem 题目大意:给定一个序列,定义f(l,r,x)为l≤k≤r并且ak=x的k的个数,求1≤i<j≤n的情况下,f(1,i,ai)<f(j,n,aj)的个数. 解题思路:预处理出f(1,i,ai),f(j,n,aj)值,然后用树状数组维护个数. #include <cstdio> #include <cstring> #include <algorithm> us

codeforces 459D - Pashmak and Parmida&#39;s problem【离散化+处理+逆序对】

题目:codeforces 459D - Pashmak and Parmida's problem 题意:给出n个数ai,然后定义f(l,?r,?x) 为ak = x,且l<=k<=r,的k的个数,求 i,?j (1?≤?i?<?j?≤?n) ,f(1,?i,?ai)?>?f(j,?n,?aj).,有多少对满足条件的i,j. 分类:逆序数,线段树,离散化, 分析:这是一道不错的数据结构题目,比较灵活.推一下第一组样例之后发现时让求一个逆序数的题目,但是不是单纯的求逆序数. 第一组

CF459E Pashmak and Graph【贪心+dp】

题目:CF459E Pashmak and Graph 题意:给出n个点,m条边的图,然后让你每次只能向权值更大边走,求最大的边数.可以走多次 分析:由于点比较多,我们可以先对权值从小到大排序,然后从小的开始,更新它的到的节点的值为前一个节点值+1,但是还会出现权值相等成环的情况,所以我们可以对相等的先不更新,保存起来,等相等的结束了再更新. 代码: #include<cstdio> #include<algorithm> using namespace std; const in