EOJ Monthly 2019.2 E 中位数 (二分+中位数+dag上dp)
题意:
一张由 n 个点,m 条边构成的有向无环图。每个点有点权 Ai。QQ 小方想知道所有起点为 1 ,终点为 n 的路径中最大的中位数是多少。
一条路径的中位数指的是:一条路径有 n 个点,将这 n 个点的权值从小到大排序后,排在位置 ⌊n2⌋+1 上的权值。
思路(官方题解):
考虑二分答案,我们需要验证路径最大的中位数是否 ≥mid 。
我们把所有的点权做 −1/1 变换,即 ≥mid 的点权变为 1 ,否则变为 −1 。
根据题面路径中位数的定义,我们可以发现,如果这条路径的中位数 ≥mid ,那么做了 −1/1 变换以后,这条路径上的点权和 ≥0 。
而我们现在需要知道的问题是路径最大的中位数是否 ≥mid ,也就是说,最大的路径点权是否 ≥0 。
跑一遍最长路就好了。而对于 DAG ,最长路只要 dp 一下,复杂度是保证 O(m) 。
代码:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<string> #include<stack> #include<queue> #include<deque> #include<set> #include<vector> #include<map> #include<cmath> #include<functional>#define fst first #define sc second #define pb push_back #define mem(a,b) memset(a,b,sizeof(a)) #define lson l,mid,root<<1 #define rson mid+1,r,root<<1|1 #define lc root<<1 #define rc root<<1|1 #define lowbit(x) ((x)&(-x)) using namespace std;typedef double db; typedef long double ldb; typedef long long ll; typedef unsigned long long ull; typedef pair<int,int> PI; typedef pair<ll,ll> PLL;const db eps = 1e-6; const int mod = 1e9+7; const int maxn = 1e6+100; const int maxm = 1e6+100; const int inf = 0x3f3f3f3f;int a[maxn]; int b[maxn]; vector<int>v[maxn]; int dp[maxn]; int n,m; int c(int x, int mid){return a[x]>=mid?1:-1; } void dpp(int x, int va,int mid){//printf("%d %d %d\n",x,va,mid);if(va<=dp[x])return;dp[x] = max(dp[x],va);//if(x==n)return;for(int i = 0; i < (int)v[x].size(); i++){dpp(v[x][i], va+c(v[x][i],mid),mid);}return; } bool ck(int x){//x = b[x];for(int i = 1; i <= n; i++)dp[i]=-0x3f3f3f3f;dpp(1,c(1,x),x);if(dp[n]>=0)return true;return false; } int main(){scanf("%d %d",&n,&m);for(int i =1 ; i <= n; i++){scanf("%d", &a[i]);}for(int i = 1; i <= m; i++){int x, y;scanf("%d %d", &x, &y);v[x].pb(y);}//printf("%d",ck(5));int l = 0, r = 1e9;int ans=-1;while(l<=r){int mid = (r+l)>>1;//printf("%d %d %d\n",l,r,mid);if(ck(mid)){l = mid+1;ans=mid;}else r = mid-1;}printf("%d", ans);return 0; }
转载于:https://www.cnblogs.com/wrjlinkkkkkk/p/10427173.html
EOJ Monthly 2019.2 E 中位数 (二分+中位数+dag上dp)相关推荐
- EOJ Monthly 2019.11 E. 数学题(反演 + 杜教筛 + 拉格朗日插值)
EOJ Monthly 2019.11 ∑i=1n∑a1=1i∑a2=1i∑a3=1i⋯∑ak−1i∑aki[gcd(a1,a2,a3,-,ak−1,ak,i)==1]=∑i=1n∑d∣iμ(d)⌊i ...
- 【EOJ Monthly 2019.02 - E】中位数(二分 ,中位数 ,−1/1变换,dp求解DAG最长路)
题干: E. 中位数 单测试点时限: 10.0 秒 内存限制: 256 MB "你的地图是一张白纸,所以即使想决定目的地,也不知道路在哪里." QQ 小方最近在自学图论.他突然想出 ...
- 【EOJ Monthly 2019.02 - A】回收卫星(交互题型,二分)
题干: 单测试点时限: 1.0 秒 内存限制: 256 MB "这个世上没有无用的齿轮,也只有齿轮本身能决定自己的用途." 就像太空中的卫星,虽然不计其数,但都各司其职. 但没有一 ...
- EOJ Monthly 2019.3 (based on March Selection) -D .宇恒棋
D.宇恒棋 EOJ传送门 Q小方以前不会下宇恒棋,现在他会了,所以他急切的想教会你. 宇恒棋的规则是这样的:在一个 n×m 的棋盘上,QQ小方和你各有一枚棋子.你们轮流行动,每一次轮到一方的回合时,他 ...
- EOJ Monthly 2019.3 A. 钝角三角形(大力模拟)(重载set)
题目链接 QQ 小方以前不会判断钝角三角形,现在他会了,所以他急切的想教会你. 如果三角形的三边长分别为 a, b, c (a≤b≤c),那么当满足 a2+b2<c2 且 a+b>c 的时 ...
- EOJ Monthly 2019.2 (based on February Selection) D.进制转换
题目链接: https://acm.ecnu.edu.cn/contest/140/problem/D/ 题目: 思路: 我们知道一个数在某一个进制k下末尾零的个数x就是这个数整除kx,这题要求刚好末 ...
- EOJ Monthly 2019.2 (based on February Selection) D 进制转换 【数学 进制转换】
任意门:https://acm.ecnu.edu.cn/contest/140/problem/D/ D. 进制转换 单测试点时限: 2.0 秒 内存限制: 256 MB "他觉得一个人奋斗 ...
- 【EOJ Monthly 2019.01 - E】唐纳德先生与假骰子(假概率问题)
题干: 单测试点时限: 6.0 秒 内存限制: 1024 MB 嗨,唐纳德先生又来了. 他又带了一枚假骰子,这个骰子的各个面的点数依然是 1,2,3,4,5,6 ,但是六个面向上的概率却不一定都是 1 ...
- 【EOJ Monthly 2019.02 - D】进制转换(思维,取模,高精度大数)
题干: 单测试点时限: 2.0 秒 内存限制: 256 MB "他觉得一个人奋斗更轻松自在.跟没有干劲的人在一起厮混,只会徒增压力." QQ 小方决定一个人研究研究进制转换. 很快 ...
最新文章
- Linux 运维笔试题(一)
- 哪里可以找到python的免费教程-哪里可以找到比较靠谱的Python教程?
- 关于规则引擎一些基本理论的积累
- Spring对事务管理的支持的发展历程--转
- kubernetes1.30集群部署+dashboard+heapster
- nodejs——URL 基础API
- 通讯网关 api网关_API网关正在经历身份危机
- 本周任务asp.net 1.1老系统移植升级到asp.net 2.0,又是一个浩大的工程啊?
- 微信 iOS 版正式支持深色模式;谷歌宣布彻底取消I/O开发者大会;Visual Studio 2019 16.5发布|极客头条...
- dataframe 如何选中某列的一行_Spark中的RDD、DataFrame和DataSet讲解
- 分享33个超棒的海洋地貌风光图片
- golang 实现 syn_sent flood洪水攻击
- 京东敌不过阿里、腾讯岌岌可危,都是因为商业模式出了问题
- 路由器 OSPF 路由汇总配置
- 皮尔逊相关系数和检验P值
- 【文献学习】Analysis of Deep Complex-Valued Convolutional Neural Networks for MRI Reconstruction
- 详解自定义钉钉机器人推送消息(一) PHP篇
- 上溯造型和下溯造性(解耦合)
- java数字时钟_Java实现动态数字时钟
- 4G模块AT指令发送中英文短信详细流程