「JOISC 2015 Day 1」卡片占卜
题目描述
K 理事长是占卜好手,他精通各种形式的占卜。今天,他要用正面写着 I
,背面写着 O
的卡片占卜一下日本 IOI 国家队的选手选择情况。
占卜的方法如下:
- 首先,选取五个正整数 A,B,C,D,EA,B,C,D,EA,B,C,D,E;
- 然后,拿出 A+B+C+D+EA+B+C+D+EA+B+C+D+E 张卡片摆成一排,从左至右摆成 AAA 张正面,BBB 张反面,CCC 张正面,DDD 张反面,EEE 张正面的形式。也就是说,从左到右依次摆 AAA 张
I
,BBB 张O
,CCC 张I
,DDD 张O
,EEE 张I
; - 再从预先确定的 NNN 种操作中选择 111 种以上,然后按照自己喜欢的顺序进行操作,同样的操作可以进行 111 次及以上。第 iii 种操作是「把从左到右第 LiL_iLi 张卡片到第 RiR_iRi 张卡片(包括两端)翻过来」,因为需要用手操作,所以翻 111 张牌需要花费 111 秒,完成一次操作需要花费 Ri−Li+1R_i-L_i+1Ri−Li+1 秒;
- 操作后,如果所有牌都是正面朝上的,占卜就结束了。
因为这种占卜比较费时,所以 K 理事长在占卜之前想知道占卜能否结束,如果能结束,他想知道占卜的最小耗时。
输入格式
第一行,五个正整数 A,B,C,D,EA,B,C,D,EA,B,C,D,E,意义如题目描述;
第二行,一个正整数 NNN,意义如题目描述;
接下来 NNN 行描述操作,一行两个正整数 Li,RiL_i,R_iLi,Ri,意义如题目描述。
输出格式
输出一行,如果占卜能够结束,则输出一个正整数,表示占卜的最小耗时;如不能,输出 −1-1−1。
样例
样例输入 1
1 2 3 4 5
3
2 3
2 6
4 10
样例输出 1
12
样例说明 1
最初的卡片序列为 IOOIIIOOOOIIIII
;
先进行第二个操作,卡片序列变为 IIIOOOOOOOIIIII
,花费 555 秒;
再进行第三个操作,卡片序列变为 IIIIIIIIIIII
,这个操作花费 777 秒,一共花费 121212 秒。
可以证明,121212 秒为占卜的最小耗时,因此输出 121212。
样例输入 2
1 1 1 1 1
1
1 1
样例输出 2
-1
数据范围与提示
对于全部测试点,满足 1≤A,B,C,D,E,N≤105,1≤Li≤Ri≤A+B+C+D+E1\le A,B,C,D,E,N\le 10^5,1\le L_i\le R_i\le A+B+C+D+E1≤A,B,C,D,E,N≤105,1≤Li≤Ri≤A+B+C+D+E。
solution
我们把区间改成(l-1,r] ,这样子修改一段区间就相当于从l-1走到r。
有两个起点两个终点,那就枚举配对就行。
当时考场我居然不会把区间转化成左开右闭的,真的很菜。
有一点要注意:0也是一个合法的点,所以dist也得清inf
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define maxn 500005
#define inf 1e15
#define ll long long
using namespace std;
int n,m,head[maxn],A,B,C,D,E,tot,flag[maxn];
ll d[maxn],dis[][];
struct node{
int v,nex;
}e[maxn];
void lj(int t1,int t2){
e[++tot].v=t2;e[tot].nex=head[t1];head[t1]=tot;
}
struct no{
int x;ll dist;
};
bool operator <(no a,no b){
return a.dist>b.dist;
}
void dij(int S){
priority_queue<no>q;
q.push((no){S,});
for(int i=;i<=n;i++)d[i]=inf,flag[i]=;d[S]=;
while(!q.empty()){
no k=q.top();q.pop();
if(flag[k.x])continue;
flag[k.x]=;
for(int i=head[k.x];i;i=e[i].nex){
if(d[e[i].v]>d[k.x]+abs(k.x-e[i].v)){
d[e[i].v]=d[k.x]+abs(k.x-e[i].v);
q.push((no){e[i].v,d[e[i].v]});
}
}
}
}
int main()
{
scanf("%d%d%d%d%d",&A,&B,&C,&D,&E);
n=A+B+C+D+E;
cin>>m;
for(int i=,t1,t2;i<=m;i++){
scanf("%d%d",&t1,&t2);t1--;
lj(t1,t2);lj(t2,t1);
}
dij(A);
dis[][]=d[A];dis[][]=d[A+B];dis[][]=d[A+B+C];dis[][]=d[A+B+C+D];
dij(A+B);
dis[][]=d[A];dis[][]=d[A+B];dis[][]=d[A+B+C];dis[][]=d[A+B+C+D];
dij(A+B+C);
dis[][]=d[A];dis[][]=d[A+B];dis[][]=d[A+B+C];dis[][]=d[A+B+C+D];
dij(A+B+C+D);
dis[][]=d[A];dis[][]=d[A+B];dis[][]=d[A+B+C];dis[][]=d[A+B+C+D];
ll ans=min(dis[][]+dis[][],min(dis[][]+dis[][],dis[][]+dis[][]));
if(ans>=inf)puts("-1");
else cout<<ans<<endl;
return ;
}
「JOISC 2015 Day 1」卡片占卜的更多相关文章
- Loj #2731 「JOISC 2016 Day 1」棋盘游戏
Loj 2731 「JOISC 2016 Day 1」棋盘游戏 JOI 君有一个棋盘,棋盘上有 \(N\) 行 \(3\) 列 的格子.JOI 君有若干棋子,并想用它们来玩一个游戏.初始状态棋盘上至少 ...
- 「JOISC 2016 Day 1」棋盘游戏
「JOISC 2016 Day 1」棋盘游戏 先判无解:第1,3行有连续的空格或四个角有空格. 然后可以发现有解的情况第1,3行可以在任意时间摆放. 对于某一列,若第2行放有棋子,那么显然可以把棋盘分 ...
- 「JOISC 2017 Day 3」幽深府邸
题解: 和hnoi2018day2t1基本一样 我想了半小时想出了一个很麻烦的做法 写了之后发现假掉了 刚开始想的是 先预处理出每个门要打开至少要在左边的哪个点$L[]$,右边的哪个点$R[]$ 对每 ...
- 「JOISC 2018 Day 3」比太郎的聚会
题解: 很套路的题目 我们按照询问中的不算的个数是否大于$block$分类 如果大于,就$O(n)dp$一下 如果小于,就预处理出到每个点前$block$小的点 $block取\sqrt{n}$的话复 ...
- LOJ #2731. 「JOISC 2016 Day 1」棋盘游戏(dp)
题意 JOI 君有一个棋盘,棋盘上有 \(N\) 行 \(3\) 列 的格子.JOI 君有若干棋子,并想用它们来玩一个游戏.初始状态棋盘上至少有一个棋子,也至少有一个空位. 游戏的目标是:在还没有放棋 ...
- LOJ 2737 「JOISC 2016 Day 3」电报 ——思路+基环树DP
题目:https://loj.ac/problem/2737 相连的关系形成若干环 / 内向基环树 .如果不是只有一个环的话,就得断开一些边使得图变成若干链.边的边权是以它为出边的点的点权. 基环树的 ...
- LOJ 2736 「JOISC 2016 Day 3」回转寿司 ——堆+分块思路
题目:https://loj.ac/problem/2736 如果每个询问都是 l = 1 , r = n ,那么每次输出序列的 n 个数与本次操作的数的最大值即可.可以用堆维护. 不同区间的询问,可 ...
- loj2734「JOISC 2016 Day 2」女装大佬 || 洛谷P3615 如厕计划
loj2734 洛谷P3615 http://218.5.5.242:9021/problem/185 不会做... 题解(来自ditoly): 这一步更详细的解释(来自kkksc03): 还是从后面 ...
- 【LOJ2838】「JOISC 2018 Day 3」比太郎的聚会(设阈值预处理/分块)
点此看题面 大致题意: 给你一张\(DAG\),多组询问,每次问你在起点不为某些点的前提下,到达给定终点的最大距离是多少. 设阈值 由于限制点数总和与\(n\)同阶,因此容易想到去设阈值. 对于限制点 ...
随机推荐
- HDU2837 Calculation(扩展欧拉定理)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- A的B次幂
Description 给出两个正整数A和B 请输出A的B次幂 结果可能很大,请对1000000007求模 Input A和B,两个整数均不大于10^18 Output A的B次幂对100000000 ...
- NuGet管理和还原程序包
在很多开源的程序下载下来不能使用,一般都是平台X86 和X64没有修改,还一个就是程序缺少资源包文件.用Nuget还原即可: 一般建议先修改好平台,然后用NuGet还原程序包.
- 《Redis设计与实现》- RDB持久化
Redis RDB持久化功能可以将Redis内存中的数据库状态保存到磁盘里面,避免数据意外丢失. 1. 手动生成 RDB 文件 有两个Redis命令可以用于生成RDB文件: SAVE,该命令会阻塞Re ...
- 移动端h5页面meta标签设置
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable= ...
- php精华之独孤九剑
首先分享一个地址 https://segmentfault.com/a/1190000013696265(这个是主要的分享,人家作者写的非常棒
- 学习python第十三天,函数5 装饰器decorator
定义:装饰器本质是函数,(装饰其他函数)就是为其他函数添加附加功能原则:1.不能修改被装饰的函数的源代码 2.不能修改装饰的函数的调用方式 实现装饰器知识储备1函数即变量2.高阶函数,满足2个条件之一 ...
- 正则表达式,regular expression, regex, RE
正则表达式是用来简洁表达一组字符串的表达式 正则表达式可以用来判断某字符串的特征归属
- mac上MySQLdb问题解决
早上有个同学问题python访问mysql的问题,之前的写得脚步突然不能运行了,找了很多文章总算解决问题了O(∩_∩)O哈哈~,希望下次不要浪费这么多时间搞这么坑的问题了. mac上MySQLdb ...
- HEXO next live2d插件删除问题
title: HEXO next live2d插件删除问题 date: 2018-03-06 13:09:12 updated: tags: [hexo,next,建站,学习,前端技术,疑问] des ...