U94222-循环往复【tarjan,DAGdp】

正题

题目链接:https://www.luogu.org/problem/U94222?contestId=23574


题目大意

nnn个点若条有向边,求一条路径要求

  1. 经过一个酒店
  2. 经过权值最大
  3. 消费最小
  4. 起点编号最小

按照顺序满足。


解题思路

将强连通分量缩成一个点,然后用gi,0/1g_{i,0/1}gi,0/1到达第iii个点,是否经过酒店的最大权值,fi,0/1f_{i,0/1}fi,0/1最小消费,nui,0/1nu_{i,0/1}nui,0/1最小编号即可。然后跑DAGdpDAGdpDAGdp即可


codecodecode

#include<cstdio>
#include<stack>
#include<queue>
#include<cstring>
#define ll long long
using namespace std;
const ll N=110000;
stack<ll> Stack;
queue<ll> q;
struct line{ll to,from,next;
}a[N];
ll n,m,x,y,tot,maxs,top,num;
ll in[N],ls[N],fl[N],cost[N],f[N][2],g[N][2];
ll J[N],low[N],dfn[N],anc[N],anv[N],val[N],nu[N][2];
bool ins[N],v[N],hotel[N];
void addl(ll x,ll y,ll tot)
{a[tot].to=y;a[tot].from=x;a[tot].next=ls[x];ls[x]=tot;
}
void tarjan(ll x)
{ins[x]=true;dfn[x]=low[x]=++top;Stack.push(x);for (ll i=ls[x];i;i=a[i].next)if (!dfn[a[i].to]){tarjan(a[i].to);low[x]=min(low[x],low[a[i].to]);}else if (ins[a[i].to])low[x]=min(low[x],dfn[a[i].to]);if (low[x]==dfn[x]){while (Stack.top()!=x){ll y=Stack.top();fl[y]=x;anc[x]+=cost[y];anv[x]+=val[y];hotel[x]|=hotel[y];Stack.pop();ins[y]=0;nu[x][0]=min(nu[x][0],y);}fl[x]=x;anc[x]+=cost[x];anv[x]+=val[x];ins[x]=0;nu[x][0]=min(nu[x][0],x);nu[x][1]=nu[x][0];Stack.pop();}
}
void bfs()
{while (!q.empty()){ll x=q.front();q.pop();for (ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(g[x][0]+anv[y]>g[y][hotel[y]])g[y][hotel[y]]=g[x][0]+anv[y],f[y][hotel[y]]=f[x][0]+anc[y],nu[y][hotel[y]]=nu[x][0];else if(g[x][0]+anv[y]==g[y][hotel[y]]&&f[y][hotel[y]]>f[x][0]+anc[y])f[y][hotel[y]]=f[x][0]+anc[y],nu[y][hotel[y]]=nu[x][0];else if(g[x][0]+anv[y]==g[y][hotel[y]]&&f[y][hotel[y]]==f[x][0]+anc[y])nu[y][hotel[y]]=min(nu[y][hotel[y]],nu[x][0]);if(g[x][1]+anv[y]>g[y][1])g[y][1]=g[x][1]+anv[y],f[y][1]=f[x][1]+anc[y],nu[y][1]=nu[x][1];else if(g[x][1]+anv[y]==g[y][1]&&f[y][1]>f[x][1]+anc[y])f[y][1]=f[x][1]+anc[y],nu[y][1]=nu[x][1];else if(g[x][1]+anv[y]==g[y][1]&&f[y][1]==f[x][1]+anc[y])nu[y][1]=min(nu[y][1],nu[x][1]);if(g[x][0]+anv[y]>g[y][0])g[y][0]=g[x][0]+anv[y],f[y][0]=f[x][0]+anc[y],nu[y][0]=nu[x][0];else if(g[x][0]+anv[y]==g[y][0]&&f[y][0]>f[x][0]+anc[y])f[y][0]=f[x][0]+anc[y],nu[y][0]=nu[x][0];else if(g[x][0]+anv[y]==g[y][0]&&f[y][0]==f[x][0]+anc[y])nu[y][0]=min(nu[y][0],nu[x][0]);in[y]--;if (!in[y]&&!v[y]){q.push(y);v[y]=1;}}}
}
int main()
{memset(nu,0x3f,sizeof(nu));scanf("%lld",&n);for(ll i=1;i<=n;i++)scanf("%lld",&cost[i]);for(ll i=1;i<=n;i++)scanf("%lld",&val[i]);scanf("%lld",&m);for(ll i=1;i<=m;i++)scanf("%lld",&J[i]);for(ll i=1;i<=m;i++)while(1){ll x;scanf("%lld",&x);if(!x) break;addl(x,(x+J[i]-1)%n+1,++tot);}for(ll i=1;i<=n;i++)scanf("%lld",&hotel[i]);for(ll i=1;i<=n;i++)if (!dfn[i])tarjan(i);ll Tot=tot;tot=0;memset(ls,0,sizeof(ls));for (ll i=1;i<=Tot;i++){x=a[i].from;y=a[i].to;if (fl[x]!=fl[y]){tot++;addl(fl[x],fl[y],tot);in[fl[y]]++;}}memset(g,-127,sizeof(g));for (ll i=1;i<=n;i++)if (fl[i]==i&&!in[i]){q.push(i);v[i]=true;g[i][0]=g[i][hotel[i]]=anv[i];f[i][0]=f[i][hotel[i]]=anc[i];}bfs();maxs=0;g[0][0]=g[0][1]=0;ll mark=0,Mark=0;for(ll i=1;i<=n;i++)if(fl[i]==i){if(g[i][0]>g[mark][0]) mark=i;else if(g[i][0]==g[mark][0]&&f[i][0]<f[mark][0])mark=i;else if(g[i][0]==g[mark][0]&&f[i][0]==f[mark][0]&&nu[i][0]<nu[mark][0])mark=i;if(g[i][1]>g[Mark][1]) Mark=i;else if(g[i][1]==g[Mark][1]&&f[i][1]<f[Mark][1])Mark=i;else if(g[i][1]==g[Mark][1]&&f[i][1]==f[Mark][1]&&nu[i][1]<nu[Mark][1])Mark=i;}if(!Mark)printf("%lld %lld %lld",-nu[mark][0],-g[mark][0],-f[mark][0]);else printf("%lld %lld %lld",nu[Mark][1],g[Mark][1],f[Mark][1]);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321736.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

16、java中的集合(3)

说一下双列集合&#xff0c;顶级接口是Map&#xff0c;实现类有HashMap、LinkedHashMap、TreeMap、HashTable等&#xff0c;使用键值对的格式存储数据&#xff0c;键不可以重复&#xff0c;值可以重复。接下来对实现类做一下详细介绍。 HashMap是最常用的Map集合&#xff0c;它…

搜索训练1 [8数码问题]

HDU1043、以及POJ1077上面都有这道题目&#xff0c;可以说是搜索里的非常经典的题目了。 poj上面的数据真的是弱&#xff0c;由于只有一组数据&#xff0c;简单bfs直接就可以过掉。 前前后后捣鼓了能有6个小时&#xff0c;才把这道题目在HDU上以4500ms的微弱优势通过。。。。…

【招聘(北京)】.NETCORE开发工程师(微服务方向)

组织&#xff1a;华汽集团北京研发中心位置&#xff1a;北京市朝阳区焦奥中心官网&#xff1a;www.sinoauto.com邮箱&#xff1a;taoxu.weisinoauto.com 项目&#xff1a;打造面向国内汽车后市场用户的一站式云服务平台&#xff08;华汽云&#xff09;&#xff0c;形态包括B2B、…

2017西安交大ACM小学期数据结构 [分块,区间修改,单点查询]

Problem A 发布时间: 2017年6月28日 09:29 最后更新: 2017年6月28日 13:03 时间限制: 1000ms 内存限制: 32M 描述 给定一个长度为n的序列a1, a2, ..., an给出q个操作, 操作分为两种 对于形如1xyz的操作, 将下标介于[x,y]的元素加上z, 满足1≤x≤y≤n, 1≤z≤105对于形如2…

17、java中的集合(4)

之前单列集合只说过了List系列的集合&#xff0c;接下来再说一下Set集合系列&#xff0c;Set集合是无序集合&#xff08;存取顺序不一致&#xff09;&#xff0c;不允许添加相同元素&#xff0c;Set的实现依赖于Map集合&#xff0c;可以将Set集合看作Map集合键的集合&#xff0…

U92904-画地为佬【二分,结论】

正题 题目链接:https://www.luogu.org/problem/U92904?contestId23574 题目大意 用mmm根长度为1的火柴求能够圈住的最多块的地。 解题思路 显然如果刚好能够围成一个正方形那么一定是最优的&#xff0c;那么我们先将能够围成的围成一个最大的正方形&#xff0c;然后剩下的在…

确保线程安全下使用Queue的Enqueue和Dequeue

场景是这样&#xff0c;假设有一台设备会触发类型为Alarm的告警信号&#xff0c;并把信号添加到一个Queue结构中&#xff0c;每隔一段时间这个Queue会被遍历检查&#xff0c;其中的每个Alarm都会调用一个相应的处理方法。问题在于&#xff0c;检查机制是基于多线程的&#xff0…

2017西安交大ACM小学期数据结构 [分块、二维矩阵]

Problem B 发布时间: 2017年6月28日 10:06 最后更新: 2017年6月28日 16:35 时间限制: 2000ms 内存限制: 32M 描述 给定一个nm的矩形, 其中第i行第j列的值为ai,j给出q个操作, 操作有两种 对于形如1x1y1x2y2z的操作, 将(x1,y1)-(x2,y2)这段矩形区域的所有元素加上z, 满足1≤…

18、java中的泛型

之前介绍集合时&#xff0c;可以看到有List<String>这样的写法&#xff0c;那么尖括号里的内容是什么呢&#xff1f;这是泛型&#xff0c;意思就是说声明的这个List集合只能存放String类型的元素。 泛型是什么&#xff1f; ‘泛’指一般、不深入&#xff0c;在这里可以认…

编写一个Java程序,其中包含三个线程: 厨师(Chef)、服务员(Waiter)和顾客(Customer)

编写一个Java程序&#xff0c;其中包含三个线程: 厨师(Chef)、服务员(Waiter)和顾客(Customer)。他们的行动如下: 厨师准备菜肴&#xff0c;每次准备一个。服务员等待菜肴准备好&#xff0c;然后将其送到顾客那里。顾客等待服务员送来菜看后才开始吃。所有三个角色应该循环进行…

U86650-群鸡乱舞【矩阵乘法】

正题 题目链接:https://www.luogu.org/problem/U86650?contestId23574 题目大意 第一年有nnn只鸡&#xff0c;每只大于等于两岁的鸡每年可以生一只&#xff0c;在ttt岁时不会生鸡而会暴毙。 现在给出每只鸡的年龄&#xff0c;求第mmm年鸡的总数量。 解题思路 用fif_{i}fi​…

2017西安交大ACM小学期数据结构 [线段树]

Problem B 发布时间: 2017年7月1日 02:08 最后更新: 2017年7月1日 02:10 时间限制: 1000ms 内存限制: 64M 描述 给定一个长度为n的序列a1, a2, ..., an, 满足这个序列是一个1~n的排列 如果一个序列满足: 将序列排序后, 任意两个相邻的元素的差为1, 那么就称这个序列为&qu…

19、java中枚举

枚举是什么&#xff1f; 枚举就是将一个有限集合中的所有元素列举出来&#xff0c;在java中使用可以使用enum关键字来声明一个枚举类。 为什么使用枚举&#xff1f; 之前当用到一些常量时&#xff0c;便临时声明一个&#xff0c;这样使得代码看起来很乱&#xff0c;这里一个…

Hangfire使用ApplicationInsigts监控

起因我司目前使用清真的ApplicationInsights来做程序级监控。&#xff08;ApplicationInsights相关文档: https://azure.microsoft.com/zh-cn/services/application-insights/ &#xff09;其实一切都蛮好的&#xff0c;但是我们基于Hangfire的Job系统却无法被Ai所监控到&#…

nssl1446-小智的旅行【dp】

正题 题目大意 求一条最大的权值严格上升的路径。 解题思路 将边权排序&#xff0c;然后从fxf_xfx​转移到fy1f_y1fy​1即可&#xff0c;要注意的是因为严格上升&#xff0c;所以此次转移用的fff不能是相同权值转移时转移的。 codecodecode #include<cstdio> #include…

2017西安交大ACM小学期数据结构 [树状数组]

Problem C 发布时间: 2017年6月28日 11:38 最后更新: 2017年6月28日 16:38 时间限制: 1000ms 内存限制: 32M 描述 给定一个长度为n的序列a1, a2, ..., an, 其中ai∈[1,10]给出q个操作, 操作分为两种 对于形如1xy的操作, 将ax改为y, 满足1≤x≤n, 1≤y≤10对于形如2xyz的操…

NET主流ORM框架分析

接上文我们测试了各个ORM框架的性能&#xff0c;大家可以很直观的看到各个ORM框架与原生的ADO.NET在境删改查的性能差异。这里和大家分享下我对ORM框架的理解及一些使用经验。ORM框架工作原理所有的ORM框架的工作原理都离不开下面这张图&#xff0c;只是每个框架的实现程度不同…

20、java中的类加载机制

1、类加载机制是什么&#xff1f; 类加载机制指的就是jvm将类的信息动态添加到内存并使用的一种机制。 2、那么类加载的具体流程是什么呢&#xff1f; 一般说类加载只有三步&#xff1a;加载、连接和初始化&#xff0c;其中连接包括验证、准备和解析&#xff0c;用于将运行时加…

nssl1447-小智的糖果【dp】

正题 题目大意 长度为nnn的序列&#xff0c;mmm个位置要求两边都比他大&#xff0c;kkk个位置要求两边都比他小。求序列个数。 解题思路 若第xxx个位置为山峰&#xff0c;那么ax−1<ax>ax1a_{x-1}<a_x>a_{x1}ax−1​<ax​>ax1​&#xff0c;我们用upiup_iu…

21、java中的反射机制

先推荐安装一个 eclipse 的反编译插件 Enhanced Class Decompiler 是什么&#xff1f; 在说反射之前先说一下编译时类型和运行时类型&#xff0c;大家都知道List是一个接口&#xff0c;它是不可以被实例化的&#xff0c;但是可以通过多态实现&#xff1a;List list new Arra…