题目描述

K 理事长是占卜好手,他精通各种形式的占卜。今天,他要用正面写着 I ,背面写着 O 的卡片占卜一下日本 IOI 国家队的选手选择情况。

占卜的方法如下:

  1. 首先,选取五个正整数 A,B,C,D,EA,B,C,D,EA,B,C,D,E;
  2. 然后,拿出 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
  3. 再从预先确定的 NNN 种操作中选择 111 种以上,然后按照自己喜欢的顺序进行操作,同样的操作可以进行 111 次及以上。第 iii 种操作是「把从左到右第 LiL_iLi​ 张卡片到第 RiR_iRi​ 张卡片(包括两端)翻过来」,因为需要用手操作,所以翻 111 张牌需要花费 111 秒,完成一次操作需要花费 Ri−Li+1R_i-L_i+1Ri​−Li​+1 秒;
  4. 操作后,如果所有牌都是正面朝上的,占卜就结束了。

因为这种占卜比较费时,所以 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」卡片占卜的更多相关文章

  1. Loj #2731 「JOISC 2016 Day 1」棋盘游戏

    Loj 2731 「JOISC 2016 Day 1」棋盘游戏 JOI 君有一个棋盘,棋盘上有 \(N\) 行 \(3\) 列 的格子.JOI 君有若干棋子,并想用它们来玩一个游戏.初始状态棋盘上至少 ...

  2. 「JOISC 2016 Day 1」棋盘游戏

    「JOISC 2016 Day 1」棋盘游戏 先判无解:第1,3行有连续的空格或四个角有空格. 然后可以发现有解的情况第1,3行可以在任意时间摆放. 对于某一列,若第2行放有棋子,那么显然可以把棋盘分 ...

  3. 「JOISC 2017 Day 3」幽深府邸

    题解: 和hnoi2018day2t1基本一样 我想了半小时想出了一个很麻烦的做法 写了之后发现假掉了 刚开始想的是 先预处理出每个门要打开至少要在左边的哪个点$L[]$,右边的哪个点$R[]$ 对每 ...

  4. 「JOISC 2018 Day 3」比太郎的聚会

    题解: 很套路的题目 我们按照询问中的不算的个数是否大于$block$分类 如果大于,就$O(n)dp$一下 如果小于,就预处理出到每个点前$block$小的点 $block取\sqrt{n}$的话复 ...

  5. LOJ #2731. 「JOISC 2016 Day 1」棋盘游戏(dp)

    题意 JOI 君有一个棋盘,棋盘上有 \(N\) 行 \(3\) 列 的格子.JOI 君有若干棋子,并想用它们来玩一个游戏.初始状态棋盘上至少有一个棋子,也至少有一个空位. 游戏的目标是:在还没有放棋 ...

  6. LOJ 2737 「JOISC 2016 Day 3」电报 ——思路+基环树DP

    题目:https://loj.ac/problem/2737 相连的关系形成若干环 / 内向基环树 .如果不是只有一个环的话,就得断开一些边使得图变成若干链.边的边权是以它为出边的点的点权. 基环树的 ...

  7. LOJ 2736 「JOISC 2016 Day 3」回转寿司 ——堆+分块思路

    题目:https://loj.ac/problem/2736 如果每个询问都是 l = 1 , r = n ,那么每次输出序列的 n 个数与本次操作的数的最大值即可.可以用堆维护. 不同区间的询问,可 ...

  8. loj2734「JOISC 2016 Day 2」女装大佬 || 洛谷P3615 如厕计划

    loj2734 洛谷P3615 http://218.5.5.242:9021/problem/185 不会做... 题解(来自ditoly): 这一步更详细的解释(来自kkksc03): 还是从后面 ...

  9. 【LOJ2838】「JOISC 2018 Day 3」比太郎的聚会(设阈值预处理/分块)

    点此看题面 大致题意: 给你一张\(DAG\),多组询问,每次问你在起点不为某些点的前提下,到达给定终点的最大距离是多少. 设阈值 由于限制点数总和与\(n\)同阶,因此容易想到去设阈值. 对于限制点 ...

随机推荐

  1. Python——列表

    应用场景,要统计大量的人员信息.就可以用列表的形式进行.name = ['邱秀','玄永俊','杨栋豪']查:print(name[2],name[0]) #取号码进行识别print(name[1:3 ...

  2. js函数的默认参数

    function f(flag, start, end, msg){ flag = flag == false ? flag : true; start = start || null; start ...

  3. linux安装openldap步骤

    目录 虚拟机环境:centos 7 一.环境准备 1.关闭 selinux firewalld 临时: setenforce 0  永久: vi /etc/sysconfig/selinux SELI ...

  4. JAVA / MySql 编程—— 第四章 高级查询(二)

    1.        EXISTS和NOT EXISTS子查询:EXISTS关键字用来检测数数据库对象是否存在.                  ★EXISTS和NOT EXISTS的结果只取决于是否 ...

  5. 彻底弄懂session,cookie,token

    session,cookie和token究竟是什么 简述 我在写之前看了很多篇session,cookie的文章,有的人说先有了cookie,后有了session.也有人说先有session,后有co ...

  6. JAVAOOP接口

    狭义接口:用来约束实现类中方法的长相的. 广义接口:已将编写好的功能. 1.接口中的方法都是抽象方法,没有方法体,必须被子类重写 2.java的接口变量都是静态常量 3.接口方法只不过是用来约束现实类 ...

  7. 中通快递股份有限公司.net高级面试题

    中通快递分布式技术开发   gc垃圾回收原理 .net中,托管代码的内存管理是自动的,由GC进行管理,而对于非托管代码,则需要.net手动处理 CLR运行时,内存分为:托管堆和栈,其中栈用于存储值类型 ...

  8. 阿里云Linux服务器,挂载硬盘并将系统盘数据迁移到数据盘

    因为之前用宝塔上线,宝塔只挂载了系统盘50G,打开阿里云云盘列表发现系统盘无法直接升级,故另买一块数据盘挂载到Linux服务器下,下面根据网上教程再结合我实际情况讲解一下实际操作,其实非常easy l ...

  9. &、|、~与&&、||、! 谬误

    按位运算符(&.|.~)的操作是被默认为一个二进制的位序列,分别对其中的每个位进行操作. 逻辑运算符(&&.||.!)将操作数当成非真及假,非假及真.通常就是将0当成假,非0即 ...

  10. 2016 ACM-ICPC Asia China-Final D 二分

    题意:一共有N个冰淇淋球,做一个冰淇淋需要K个球,并且由于稳定性,这K个球还必须满足上下相邻的下面比上面大至少两倍.先给出N个球的质量,问最多能做出多少个冰淇淋? 思路:二分答案并对其检验. 检验标准 ...