题目

【题目描述】
K 理事长是占卜好手,他精通各种形式的占卜。今天,他要用正面写着 `I` ,背面写着 `O` 的卡片占卜一下日本 IOI 国家队的选手选择情况。
占卜的方法如下:
1. 首先,选取五个正整数 $A,B,C,D,E$;
2. 然后,拿出 $A+B+C+D+E$ 张卡片摆成一排,从左至右摆成 $A$ 张正面,$B$ 张反面,$C$ 张正面,$D$ 张反面,$E$ 张正面的形式。也就是说,从左到右依次摆 $A$ 张 `I`,$B$ 张 `O`,$C$ 张 `I`,$D$ 张 `O`,$E$ 张 `I`;
3. 再从预先确定的 $N$ 种操作中选择 $1$ 种以上,然后按照自己喜欢的顺序进行操作,同样的操作可以进行 $1$ 次及以上。第 $i$ 种操作是「把从左到右第 $L_i$ 张卡片到第 $R_i$ 张卡片(包括两端)翻过来」,因为需要用手操作,所以翻 $1$ 张牌需要花费 $1$ 秒,完成一次操作需要花费 $R_i-L_i+1$ 秒;
4. 操作后,如果所有牌都是正面朝上的,占卜就结束了。
因为这种占卜比较费时,所以 K 理事长在占卜之前想知道占卜能否结束,如果能结束,他想知道占卜的最小耗时。
【输入格式】
第一行,五个正整数 $A,B,C,D,E$,意义如题目描述;
第二行,一个正整数 $N$,意义如题目描述;
接下来 $N$ 行描述操作,一行两个正整数 $L_i,R_i$,意义如题目描述。
【输出格式】
输出一行,如果占卜能够结束,则输出一个正整数,表示占卜的最小耗时;如不能,输出 $-1$。
【样例输入一】
1 2 3 4 5
3
2 3
2 6
4 10
【样例输出一】
12
【样例解释一】
最初的卡片序列为 `IOOIIIOOOOIIIII`;
先进行第二个操作,卡片序列变为 `IIIOOOOOOOIIIII`,花费 $5$ 秒;
再进行第三个操作,卡片序列变为 `IIIIIIIIIIII`,这个操作花费 $7$ 秒,一共花费 $12$ 秒。
可以证明,$12$ 秒为占卜的最小耗时,因此输出 $12$。
【样例输入二】
1 1 1 1 1
1
1 1
【样例输出二】
-1

题解

考虑覆盖,从 $ i $ 覆盖到 $ j $ 相当于通过那些翻转,从 $ i $ 走到 $ j $(画图手动感知)

然后就变成了最短路,分别枚举起点和终点就可以了

(本题卡 int)

代码

 #include<bits/stdc++.h>
#define LL long long
#define _(d) while(d(isdigit(ch=getchar())))
using namespace std;
int R(){
int x;bool f=;char ch;_(!)if(ch=='-')f=;x=ch^;
_()x=(x<<)+(x<<)+(ch^);return f?x:-x;}
const int N=5e5+;
int n,a[],head[N],cnt;LL dis[N],ans=2e18;
struct edge{int to,nex,w;}e[N<<];
struct node{
int x;LL w;
bool friend operator <(node a,node b){return a.w>b.w;}
};priority_queue<node>q;
void add(int s,int t,int w){e[++cnt]=(edge){t,head[s],w},head[s]=cnt;}
void dij(int s){
for(int i=;i<=a[];i++)dis[i]=2e18;
dis[s]=;
q.push((node){s,});
while(!q.empty()){
node now=q.top();q.pop();
if(now.w!=dis[now.x])continue;
for(int v,k=head[now.x];k;k=e[k].nex)
if(dis[v=e[k].to]>dis[now.x]+e[k].w)
dis[v]=dis[now.x]+e[k].w,q.push((node){v,dis[v]});
}
return;
}
int main(){
for(int i=;i<=;i++)a[i]=a[i-]+R();
n=R();
for(int i=,u,v;i<=n;i++)
u=R()-,v=R(),add(u,v,v-u),add(v,u,v-u);
dij(a[]);
LL s1=dis[a[]],s2=dis[a[]],s3=dis[a[]];
dij(a[]);
ans=min(min(ans,s2+dis[a[]]),s3+dis[a[]]);
dij(a[]);
ans=min(ans,s1+dis[a[]]);
printf("%lld\n",ans==2e18?-:ans);
return ;
}

【JOI Camp 2015】IOIO卡片占卜——最短路的更多相关文章

  1. IOIOI卡片占卜(Atcoder-IOIOI カード占い)(最短路)

    题目描述: K 理事長は占いが好きで,いつも様々な占いをしている.今日は,表の面に ‘I’ が,裏の面に ‘O’ が書か れたカードを使って今年の IOI での日本選手団の出来を占うことにした. 占い ...

  2. 「JOISC 2015 Day 1」卡片占卜

    题目描述 K 理事长是占卜好手,他精通各种形式的占卜.今天,他要用正面写着 I ,背面写着 O 的卡片占卜一下日本 IOI 国家队的选手选择情况. 占卜的方法如下: 首先,选取五个正整数 A,B,C, ...

  3. [BZOJ4103][Thu Summer Camp 2015]异或运算 可持久化Trie树

    4103: [Thu Summer Camp 2015]异或运算 Time Limit: 20 Sec  Memory Limit: 512 MB Description 给定长度为n的数列X={x1 ...

  4. [Thu Summer Camp 2015]解密运算

    4104: [Thu Summer Camp 2015]解密运算 Time Limit: 10 Sec  Memory Limit: 512 MB Description 对于一个长度为N的字符串,我 ...

  5. 【BZOJ 4104】 4104: [Thu Summer Camp 2015]解密运算 (智商)

    4104: [Thu Summer Camp 2015]解密运算 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 370  Solved: 237 De ...

  6. 【BZOJ 4103】 4103: [Thu Summer Camp 2015]异或运算 (可持久化Trie)

    4103: [Thu Summer Camp 2015]异或运算 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 474  Solved: 258 De ...

  7. 【NOIP2015模拟11.3】IOIOI卡片占卜

    题目 K理事长很喜欢占卜,经常用各种各样的方式进行占卜.今天,他准备使用正面写着"I",反面写着"O"的卡片为今年IOI的日本代表队占卜最终的成绩. 占卜的方法 ...

  8. 【题解】LOJ2759. 「JOI 2014 Final」飞天鼠(最短路)

    [题解]LOJ2759. 「JOI 2014 Final」飞天鼠(最短路) 考虑最终答案的构成,一定是由很多飞行+一些上升+一些下降构成. 由于在任何一个点上升或者下降代价是一样的,所以: 对于上升操 ...

  9. bzoj:4105: [Thu Summer Camp 2015]平方运算

    Description   Input 第一行有三个整数N,M,p,分别代表序列的长度.平方操作与询问操作的总次数以及在平方操作中所要模的数.   接下来一行N个数代表一开始的序列{X1,X2,... ...

随机推荐

  1. Redis——慢查询分析

    核心知识点: 1.什么是慢查询? 2.客户端执行一条命令的步骤? 3.阈值和慢查询日志的设置? 4.慢查询日志的操作命令:slowlog get.slowlog len.slowlog reset. ...

  2. Wannafly挑战赛12 A 银行存款 【DP】【DFS】

    链接:https://www.nowcoder.com/acm/contest/79/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...

  3. python输出shell命令执行结果

    import os,subprocess p = subprocess.Popen("df -h", shell=True, stdout=subprocess.PIPE) out ...

  4. C# 操作SQLServer SMO中遇到的几个问题

    业务需求:需要读取数据库中的所有库,得到库之后可以再做后续操作.(win 7  vs2010 sqlserver2008r2) 在读取数据库名的时候,就需要用到Microsoft.SqlServer. ...

  5. Visual Studio "无法查找或打开PDB文件"解决方法

       1.问题: 使用C#语言时遇到的问题(C/C++类似,方法一致),我用qt和VS2013也遇到这种问题 编译链接都没问题,调试时出现以下错误提示:      2.解决方法 第一步: 第二步:[调 ...

  6. BZOJ 3709 [PA2014]Bohater:贪心【反过来考虑】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3709 题意: 在一款电脑游戏中,你需要打败n只怪物(从1到n编号). 为了打败第i只怪物, ...

  7. C++(一)— stringstream的用法

    输入输出的头文件 <iostream>  string流的头文件 <sstream>  文件流的头文件   <fstream> 1.利用输入输出做数据转换 stri ...

  8. spring2.5和struts1.3.8整合

    第一步:导入对应jar文件 第二步: 1.在web容器中实例化spring容器 <!-- 指定spring的配置文件,默认从web根目录寻找配置文件,我们可以通过spring提供的classpa ...

  9. DBSCAN 聚类分析

    DBSCANCLUSTER DBSCAN(Density-basedspatial clustering ofapplications with noise)Martin.Ester, Hans-Pe ...

  10. python 动态添加属性及方法及“__slots__的作用”

    1.动态添加属性 class Person(object): def __init__(self, newName, newAge): self.name = newName self.age = n ...