T25990 [Wind Festival]Running In The Sky

题目背景

[Night - 20:02[Night−20:02 P.M.]P.M.]

夜空真美啊……但是……快要结束了呢……

题目描述

一天的活动过后,所有学生都停下来欣赏夜空下点亮的风筝。 CurtisCurtis NishikinoNishikino 想要以更近的视角感受一下,所以她跑到空中的风筝上去了(这对于一个妹子来说有点匪夷所思)! 每只风筝上的灯光都有一个亮度 k_ik

i

​ . 由于风的作用,一些风筝缠在了一起。但是这并不会破坏美妙的气氛,缠在一起的风筝会将灯光汇聚起来,形成更亮的光源!

CurtisCurtis NishikinoNishikino 已经知道了一些风筝间的关系,比如给出一对风筝 (a,b)(a,b) , 这意味着她可以从 aa 跑到 bb 上去,但是不能返回。

现在,请帮她找到一条路径(她可以到达一只风筝多次,但只在第一次到达时她会去感受上面的灯光), 使得她可以感受到最多的光亮。同时请告诉她这条路径上单只风筝的最大亮度,如果有多条符合条件的路径,输出能产生最大单只风筝亮度的答案。


Tarjan缩点途中处理圈内最大值和圈内和,变成DAG然后dp就好

Code

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
typedef long long LL;
using namespace std;
int RD(){
int out = 0,flag = 1;char c = getchar();
while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
return flag * out;
}
const int maxn = 1000019,INF = 1e9;
int head[maxn][2],nume;
struct Node{
int v,dis,nxt;
}E[maxn << 3][2];
void add(int u,int v,int dis,int o){
E[++nume][o].nxt = head[u][o];
E[nume][o].v = v;
E[nume][o].dis = dis;
head[u][o] = nume;
}
int num,nr,v[maxn];
int DFN[maxn],LOW[maxn],INDEX;
int S[maxn],top;
bool ins[maxn];
int col[maxn],numc,vc[maxn],MAX[maxn];
void Tarjan(int u){
DFN[u] = LOW[u] = ++INDEX;
S[++top] = u;ins[u] = 1;
for(int i = head[u][0];i;i = E[i][0].nxt){
int v = E[i][0].v;
if(!DFN[v]){Tarjan(v);LOW[u] = min(LOW[u],LOW[v]);}
else if(ins[v])LOW[u] = min(LOW[u],DFN[v]);
}
if(DFN[u] == LOW[u]){
numc++;
while(S[top + 1] != u){
col[S[top]] = numc;
vc[numc] += v[S[top]];
MAX[numc] = max(MAX[numc],v[S[top]]);
ins[S[top--]] = 0;
}
}
}
int fam[maxn];
int dp[maxn];
int DP(int u){
if(dp[u] > 0)return dp[u];
dp[u] = vc[u];int now = 0;
for(int i = head[u][1];i;i = E[i][1].nxt){
int v = E[i][1].v;
if(DP(v) > now){
now = DP(v);
fam[u] = fam[v];
}
}
dp[u] += now;
fam[u] = max(fam[u],MAX[u]);
return dp[u];
}
int main(){
num = RD();nr = RD();
for(int i = 1;i <= num;i++)v[i] = RD();
for(int i = 1;i <= nr;i++){
int u = RD(),v = RD();
add(u,v,1,0);
}
for(int i = 1;i <= num;i++)if(!DFN[i])Tarjan(i);
for(int u = 1;u <= num;u++){
for(int i = head[u][0];i;i = E[i][0].nxt){
int v = E[i][0].v;
if(col[u] != col[v])add(col[v],col[u],1,1);
}
}
int ans = 0,maxx = 0;
for(int i = 1;i <= numc;i++){
int cmp = DP(i);
if(cmp > ans){
ans = cmp;
maxx = fam[i];
}
else if(cmp == ans)maxx = max(maxx,fam[i]);
}
printf("%d %d\n",ans,maxx);
return 0;
}

Upd 两分钟以后

其实之前结构体的写法是完全没有错的!!!,学会了重载,这里贴一下

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
typedef long long LL;
using namespace std;
int RD(){
int out = 0,flag = 1;char c = getchar();
while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
return flag * out;
}
const int maxn = 1000019,INF = 1e9;
int head[maxn][2],nume;
struct Node{
int v,dis,nxt;
}E[maxn << 3][2];
void add(int u,int v,int dis,int o){
E[++nume][o].nxt = head[u][o];
E[nume][o].v = v;
E[nume][o].dis = dis;
head[u][o] = nume;
}
int num,nr,v[maxn];
int DFN[maxn],LOW[maxn],INDEX;
int S[maxn],top;
bool ins[maxn];
int col[maxn],numc,vc[maxn],MAX[maxn];
void Tarjan(int u){
DFN[u] = LOW[u] = ++INDEX;
S[++top] = u;ins[u] = 1;
for(int i = head[u][0];i;i = E[i][0].nxt){
int v = E[i][0].v;
if(!DFN[v]){Tarjan(v);LOW[u] = min(LOW[u],LOW[v]);}
else if(ins[v])LOW[u] = min(LOW[u],DFN[v]);
}
if(DFN[u] == LOW[u]){
numc++;
while(S[top + 1] != u){
col[S[top]] = numc;
vc[numc] += v[S[top]];
MAX[numc] = max(MAX[numc],v[S[top]]);
ins[S[top--]] = 0;
}
}
}
int ing[maxn],outg[maxn];
struct Dp{
int sum,maxx;
Dp (int sum,int maxx):sum(sum), maxx(maxx){}
Dp(){}
bool operator > (const Dp &a)const{
if(a.sum != sum)return sum > a.sum;
return maxx > a.maxx;
}
Dp operator + (const Dp &a){
Dp ans;
ans.sum = sum + a.sum;
ans.maxx = max(maxx,a.maxx);
return ans;
}
}dp[maxn];
Dp DP(int u){
if(dp[u].sum > 0)return dp[u];
dp[u] = Dp(vc[u],MAX[u]);
Dp max = dp[u];
for(int i = head[u][1];i;i = E[i][1].nxt){
int v = E[i][1].v;
Dp temp = DP(v);
if(temp + dp[u] > max)max = temp + dp[u];
}
dp[u] = max;
return dp[u];
}
int main(){
num = RD();nr = RD();
for(int i = 1;i <= num;i++)v[i] = RD();
for(int i = 1;i <= nr;i++){
int u = RD(),v = RD();
add(u,v,1,0);
}
for(int i = 1;i <= num;i++)if(!DFN[i])Tarjan(i);
for(int u = 1;u <= num;u++){
for(int i = head[u][0];i;i = E[i][0].nxt){
int v = E[i][0].v;
if(col[u] != col[v])add(col[v],col[u],1,1);
}
}
Dp ans = Dp(0,0);
for(int i = 1;i <= numc;i++){
if(DP(i) > ans)ans = DP(i);
}
//for(int i = 1;i <= numc;i++)printf("col=%d,sum=%d,max=%d\n",i,dp[i].sum,dp[i].maxx);
printf("%d %d\n",ans.sum,ans.maxx);
//printf("judge=%d\n",Dp(100000,10000) > Dp(0,0));
return 0;
}

T25990 [Wind Festival]Running In The Sky的更多相关文章

  1. 洛谷P4742 [Wind Festival]Running In The Sky [Tarjan缩点,DAGDP]

    题目传送门 Running In The Sky 格式难调,题面就不放了. 分析: 一句话题意:给定一张带点权的有向图,求最长点权路径及该路径上的最大点权. 很明显的$DAGDP$,因此需要缩点,将该 ...

  2. P4742 【[Wind Festival]Running In The Sky】

    相信来做这道题的人肯定都学过\(Tarjan\)缩点吧,如果没有建议先去做P3387 [模板]缩点,如果你忘了,建议也去看看 满足上面要求后,你会惊奇发现,这两道题基本一样,唯一的差别就是这道题需要记 ...

  3. luogu P4744 [Wind Festival]Iron Man

    再次感谢题解区大佬的指点 规定\(pre[i]\)表示前缀\(i\)的前缀和,\(sum[i][j]\)表示区间\([i,j]\)之和 令\(f[i][j]\)表示前i个数选出j段的最大值,\(g[i ...

  4. 图论初步-Tarjan算法及其应用

    暑假刷了一堆Tarjan题到头来还是忘得差不多. 这篇博客权当复习吧. 一些定义 无向图 割顶与桥 (划重点) 图G是连通图,删除一个点表示删除此点以及所有与其相连的边. 若删除某点u后G不再连通,那 ...

  5. 浅谈 Tarjan 算法之强连通分量(危

    引子 果然老师们都只看标签拉题... 2020.8.19新初二的题集中出现了一道题目(现已除名),叫做Running In The Sky. OJ上叫绮丽的天空 发现需要处理环,然后通过一些神奇的渠道 ...

  6. UVALive 7281 Saint John Festival (凸包+O(logn)判断点在凸多边形内)

    Saint John Festival 题目链接: http://acm.hust.edu.cn/vjudge/contest/127406#problem/J Description Porto's ...

  7. sky简介

    sky简介 sky是一种构建高性能.跨平台手机APP的新的途径.更值得关注的是,sky是一种渲染引擎.脚本引擎.一个框架和一系列的材料设计模式的窗体组件.sky是当前以及未来手机APP的一种优化手段. ...

  8. 【React Native开发】React Native应用设备执行(Running)以及调试(Debugging)(3)

    ),React Native技术交流4群(458982758),请不要反复加群.欢迎各位大牛,React Native技术爱好者加入交流!同一时候博客左側欢迎微信扫描关注订阅号,移动技术干货,精彩文章 ...

  9. java并发编程基础---Sky

    1.线程及启动和终止 1.1 线程 -进程/优先级 操作系统调度的最小单元是线程,线程是轻量级进程. 线程优先级由setPriority(int)方法来设置,默认优先级是5,等级1~10.等级越高分的 ...

随机推荐

  1. Pearson Distance

    Pearson Distance: where: 1.  is the covariance 2.  is the standard deviation of 3.  is the standard ...

  2. 直接抱过来dd大牛的《背包九讲》来做笔记

    P01: 01背包问题 题目 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. 基本思路 这是最 ...

  3. mysql数据库工具

    1.navicat12 中文版及破解 链接:https://pan.baidu.com/s/1TH8m6lduHJybUGhmjFPIAA 提取码:kwcd 2.旧版本mysql-front(连接可选 ...

  4. 【数位dp】Enigma

    http://codeforces.com/gym/101889 E 与一般数位dp不同,保存的是能否满足条件,而非记录方案数 代码: #include <iostream> #inclu ...

  5. 《IT小小鸟》的阅读心得

    新年过后我们迎来大一下学期,想想刚迈入大学的我们,充满着好奇与兴奋,仿佛就在昨天.时光飞逝而今,虽经过一学期的学习,仍对计算机专业充满困惑,对未来充满迷茫. 在我感到迷茫的时候,老师给我们介绍了这样的 ...

  6. Java中的网络编程-1

    计算机网络:将分布在不同地区的计算机与专门的外部设备用通信线路互连成一个规模大.功能强的网络系统, 从而使众多计算机 可以方便的互相传递信息, 共享硬件.软件.数据信息等资源. 计算机网络的主要功能: ...

  7. CSS中px和em属性的特点与区别

    详解px和em的特点和区别象素px是我们在定义CSS中经常用到的尺寸大小单位,而em在国外网站中经常被使用,px和em之间究竟有什么区别和特点呢?◆px像素(Pixel),相对长度单位.像素px是相对 ...

  8. vim 末行模式简单练习

    练习 1 . 复制/etc/grub2.cfg文件至/tmp目录中,用查找替换命令删除/tmp/grub2.cfg文件中以空白字符开头的行的行首的空白字符 :%s#^[[:space:]]\+##g ...

  9. JavaScript设计模式学习之路——面向对象的思想

    今天,我拿到了张容铭写的这本<JavaScript设计模式>这本书,开始了关于JavaScript更深一点的学习. 看到这本书开始的时候,虽然之前通过看书.一些比较好的视频的讲解,对Jav ...

  10. php获取指定div内容

    <?php $p="http://127.0.0.1:8080/website/index.html"; $ch = curl_init(); curl_setopt($ch ...