CERC2016 爵士之旅 Jazz Journey
题目大意
给定$n$个位置,和一个长为$m$的序列$A$,你需要经过一条直接的边从第$A_i$个位置到第$A_{i+1}$个位置。
每条有向边$(u,v)$分为两种,第一种可以花费$C$的代价从$u$到达$v$。
第二种可以花费$C'$的代价从$u$到达$v$,并使得下一次从$v$到$u$的代价变为$0$。
保证操作一定能完成。$n,m\leq 3\times 10^5$。
题解
考虑每两个位置之间$(a,b)$或$(b,a)$的若干次移动式独立的,不同的位置对之间互不影响。
所以对于每一个点对$(a,b)$分开处理。
先将这$m-1$次移动中在$(a,b)$之间的移动按照顺序拿出来构成一个$01$序列,其中$0$表示从$a$到$b$,$1$表示从$b$到$a$(不妨设$a<b$)。
接下来可以直接贪心。
设$A$表示直接从$a$到$b$的最小代价,设$B$表示直接从$b$到$a$的最小代价。
设$AA$表示从$a$到$b$并使得下一次从$b$到$a$的代价为$0$的最小代价。
设$BB$表示从$b$到$a$并使得下一次从$a$到$b$的代价为$0$的最小代价。
若$A+B\leq \min\{AA,BB\}$,那么每一次操作一定选择直接走,用$0,1$的数量分别乘以$A,B$即可。
若$AA<A+B\leq BB$,那么每一次操作一定优先尽可能地将每一个$0$匹配一个位于它后面的$1$,每个最前面的$0$贪心地取后方最靠近它的$1$,这样匹配出的$1$地数量一定是最多的,那么省下来的$0$和$1$一定花费$A,B$的代价。
$BB<A+B\leq AA$与上一情况同理。
若$AA\leq BB<A+B$,这样一定在优先将每一个$1$匹配的基础上再将这些匹配到的$1$用在最后的位置上,尽可能不让前置的$1$被消耗。然后我们再类比上一情况的方法贪心取让每一个前置的$1$取它后面最接近的,没有被消耗的$0$,这样取完后剩下的部分要以相同的方法删掉。
$BB<AA<A+B$与上一情况同理。
#include<bits/stdc++.h>
#define LL long long
#define pii pair<int,int>
#define mp(a,b) make_pair(a,b)
#define dw(x,y) x=min(x,y)
#define M 300200
#define link(a,b) nt[++tmp]=fs[a],fs[a]=tmp,kd[tmp]=b
using namespace std;
namespace IO{
const int BS=(1<<20)+5; char Buffer[BS],*HD,*TL;
char Getchar(){if(HD==TL){TL=(HD=Buffer)+fread(Buffer,1,BS,stdin);} return (HD==TL)?EOF:*HD++;}
int read(){
int nm=0,fh=1; char cw=Getchar();
for(;!isdigit(cw);cw=Getchar()) if(cw=='-') fh=-fh;
for(;isdigit(cw);cw=Getchar()) nm=nm*10+(cw-'0');
return nm*fh;
}
int gc(){
int cw=Getchar();
while(cw!='R'&&cw!='O') cw=Getchar();
return cw=='R';
}
}using namespace IO;
map<pii,int> P; LL ans,F[M],c[M][2][2];
int n,m,A[M],tot,cnt,top,K[M],s[M][2],pre[M][2];
int fs[M],kd[M],nt[M],tmp; char C[20];
LL solve(int x){
dw(c[x][0][0],c[x][0][1]),dw(c[x][1][0],c[x][1][1]);
LL cst=c[x][0][0]+c[x][1][0];
if(cst<=min(c[x][0][1],c[x][1][1]))
return (LL)s[top][0]*c[x][0][0]+(LL)s[top][1]*c[x][1][0];
if(c[x][0][1]>c[x][1][1]){
swap(c[x][0][1],c[x][1][1]),swap(c[x][0][0],c[x][1][0]);
for(int i=1;i<=top;i++) swap(s[i][0],s[i][1]),K[i]^=1;
}
for(int k=0;k<2;k++){
for(int i=1,now=1;i<=top;i++){
pre[i][k]=pre[i-1][k]; if(K[i]^k) continue;
while(now<i||(now<=top&&(K[now]^k^1))) now++;
if(now<=top) now++,pre[i][k]++;
}
}
LL pos,rem=pre[top][0],t1,t2; t1=s[top][0]-rem,t2=s[top][1]-rem;
if(cst<=c[x][1][1]) return rem*c[x][0][1]+t1*c[x][0][0]+t2*c[x][1][0];
for(pos=1;pos<=top&&s[pos][1]<=s[top][1]-rem;pos++); pos--;
LL num=min(s[top][0]-rem,(LL)pre[pos][1]);
t1=s[top][0]-rem-num,t2=s[top][1]-rem-num;
return t1*c[x][0][0]+t2*c[x][1][0]+rem*c[x][0][1]+num*c[x][1][1];
}
int main(){
n=read(),m=read(),memset(c,0x3f,sizeof(c));
for(int i=1;i<=m;i++) A[i]=read();
for(int T=read();T;T--){
int x=read(),y=read(),tg=0,k,typ;
typ=gc(),k=read(); if(x>y) swap(x,y),tg=1;
if(!P.count(mp(x,y))) P[mp(x,y)]=++cnt;
dw(c[P[mp(x,y)]][tg][typ],(LL)k);
}
for(int i=m;i>=2;i--) link(P[mp(min(A[i-1],A[i]),max(A[i-1],A[i]))],A[i-1]>A[i]);
for(int j=1;j<=cnt;j++){
if(!fs[j]) continue; top=0;
for(int i=fs[j];i;i=nt[i]){
K[++top]=kd[i],s[top][0]=s[top-1][0];
s[top][1]=s[top-1][1],s[top][kd[i]]++;
} ans+=solve(j);
} printf("%lld\n",ans); return 0;
}
CERC2016 爵士之旅 Jazz Journey的更多相关文章
- JAZZ
今天知道公司中的JAZZ是变形金刚中的“爵士”,如果写内部代码,就好像在操作“爵士”,还是蛮有意思的.先是接触了jQuery,然后是jQuery-ui,然后jazz,继续中...... JAZZ: 爵 ...
- ThoughtWorks University之旅 —— 印度游记
ThoughtWorks University是ThoughtWorks为新加入的员工提供的入职培训项目之一,会将世界各地office新入职的员工一起带到印度浦那,参加一次为期5周的培训,内容涵盖了公 ...
- CQRS之旅——旅程2(分解领域)
旅程2:分解领域 设计停靠站点 "没有石头就没有拱门" --马可波罗 在本章中,我们将对Contoso会议管理系统进行一个高层次的概述.这将帮助您理解应用程序的结构.集成点以及应用 ...
- CQRS之旅——旅程4(扩展和增强订单和注册限界上下文)
旅程4:扩展和增强订单和注册限界上下文 进一步探索订单和注册的有界上下文. "我明白,如果一个人想看些新鲜的东西,旅行并不是没有意义的."儒勒·凡尔纳,环游世界80天 对限界上下文 ...
- CQRS之旅——前言(翻译)
探索CQRS和Event Sourcing 本项目聚焦在使用命令和查询分离模式和事件溯源(CQRS+Event Sourcing)构建一个具有高扩展,高可用和高维护性的应用程序. 本项目定位为一个学习 ...
- C语言编译器开发之旅(开篇)
编译器写作之旅 最近在Github上看到一个十分有趣的项目acwj(A Compiler Writing Journey),一个用C语言编写编译器的项目.身为一个程序员,这在我看来是一件十分酷的事 ...
- Linq之旅:Linq入门详解(Linq to Objects)
示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...
- WCF学习之旅—第三个示例之四(三十)
上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) WCF学习之旅—第三个示例之三(二十九) ...
- 【C#代码实战】群蚁算法理论与实践全攻略——旅行商等路径优化问题的新方法
若干年前读研的时候,学院有一个教授,专门做群蚁算法的,很厉害,偶尔了解了一点点.感觉也是生物智能的一个体现,和遗传算法.神经网络有异曲同工之妙.只不过当时没有实际需求学习,所以没去研究.最近有一个这样 ...
随机推荐
- VS 无法调试 IIS
用附加的方式断点无效时. 解决方案: 一.VS设置的 .Net版本 与 IIS应用程序池的版本 不一致. 操作步骤: 1. 在VS-> 项目属性, 配置 自定义Web服务器 , 这里 ...
- Centos---linux配置 集群搭建
网络配置 1.创建虚拟机mini1: 1.1.网络配置 NAT网络模式模式 直接修改 /etc/sysconfig/network-script/ifcfg-eth0 输入service netwo ...
- windows下客户端开发hdf--环境搭建
1.引入依赖 <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop- ...
- iOS 11 Xcode9开发 新特性学习 (警告篇)
最新版本SDK优化了开发体验,编译过程会提供更多提示警告,建议你修改.这些功能也可以自主选择用或者不用,当然,苹果喜欢你用他推荐的东西... 1 . @avalibale 语法,同步判断当前iOS系统 ...
- 面对 to B 业务该如何构建研发管理体系?
未来离我们越来越近,而过去并未走远,我们发现科技公司2B业务兴起,腾讯认为互联网下半场属于产业互联网,需要进行一次重要的战略升级.它们在国庆节最后一天进行新一轮组织架构调整,最亮眼的就是新成立云与智慧 ...
- JVM内存的堆、栈和方法区
JVM的内存分为堆.栈.方法区和程序计数器4个区域 存储内容:基本类型,对象引用,对象本身,class,常量,static变量 堆: 拥有者:所有线程 内容:对象本身,不存放基本类型和对象引用 垃圾回 ...
- win7 与 Ubuntu 16.04 文件传送
win7 与 Ubuntu 16.04 文件传送 环境:主机系统为win7,虚拟机为vmware12, 虚拟系统为ubuntu 16.04 方案一: 通过虚拟机vmware的共享文件夹实现. 方案二: ...
- JZ2440专用dnw 支持xp、win7、win8和win10系统【转】
本文转载自:https://blog.csdn.net/czg13548930186/article/details/76999152 学习于韦东山百问网公司 本文用于解决win7以上系统使用dnw难 ...
- 斯坦福机器学习视频笔记 Week4 & Week5 神经网络 Neural Networks
神经网络是一种受大脑工作原理启发的模式. 它在许多应用中广泛使用:当您的手机解释并理解您的语音命令时,很可能是神经网络正在帮助理解您的语音; 当您兑现支票时,自动读取数字的机器也使用神经网络. Non ...
- Why does typeof array with objects return “Object” and not “Array”?
https://stackoverflow.com/questions/4775722/check-if-object-is-an-array One of the weird behaviour a ...