JZOJ 4302【NOIP2015模拟11.3】IOIOI卡片占卜
来源:互联网 发布:2016淘宝开店教程视频 编辑:程序博客网 时间:2024/06/04 01:35
Description
K理事长很喜欢占卜,经常用各种各样的方式进行占卜。今天,他准备使用正面写着”I”,反面写着”O”的卡片为今年IOI的日本代表队占卜最终的成绩。
占卜的方法如下所示:
首先,选择5个正整数A,B,C,D,E。
将A+B+C+D+E张IOI卡片排成一行,最左侧的A张卡片正面朝上,接下来B张反面朝上,接下来C张卡片正面朝上,接下来D张反面朝上,最后E张正面朝上。如此排列的话,从左侧开始顺次为A张“I”,B张“O”,C张“I”,D张“O”,E张“I”。
在预先决定的N种操作中选出至少1种,然后按照任意顺序执行。(注:同种操作执行多次也是可以的。)这里,第i种操作(1<=i<=N)为【将从左数第Li张卡片到第Ri张卡片全部翻转】。翻转一张卡片需要1秒的时间,因此第i种操作耗时Ri-Li+1秒。
操作结束后,如果所有卡片都是正面朝上则占卜成功。K理事长不想翻多余的牌,因此在实际使用卡片占卜之前会先计算出是否存在占卜成功的可能性。进一步,如果占卜可能成功,他会计算出能使占卜成功所消耗的时间的最小值。
现在给出卡片的排列信息和预先决定的操作信息,请你写一个程序,计算出占卜能否成功,如果能成功,输出消耗时间的最小值。
Analysis
首先把I变成1,O变成0。(长得好像)
这道题的特点是“IOIOI”,是固定的格式。可以发现,对于01串,可以对于相邻的两位异或一下。因为只有在I和O的转折点xor值为一,所以异或后的串是由4个1和插在其中的一堆0组成的。
例如:
111011000011(原串)
异或之后变成:
00110100010 (A)
我们模拟一个操作,例如在原串中的
110100000011
异或一下试试:
01110000010 (B)
找一找(A)和(B)的关系。
可以发现,将区间
一般地,把区间
那么目标串(IIII…IIIII)中异或起来是没有一个1的。所以可以把每个位置抽象成点,一个操作自然成了边。边权即为
Code
#include<cstdio>#include<queue>#include<cstring>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)using namespace std;typedef long long ll;const int N=500010,M=N*2;const ll INF=4340410370284600380;int tot,to[M],next[M],last[N];ll wei[M],dis[3][N];bool bz[N];queue<int> q;void link(int u,int v,ll w){ to[++tot]=v; wei[tot]=w; next[tot]=last[u]; last[u]=tot;}void SPFA(int u,int p){ memset(bz,0,sizeof(bz)); memset(dis[p],60,sizeof(dis[p])); dis[p][u]=0,bz[u]=1; q.push(u); while(!q.empty()) { int u=q.front();q.pop(); for(int i=last[u];i;i=next[i]) { int v=to[i]; if(dis[p][u]!=INF && dis[p][u]+wei[i]<dis[p][v]) { dis[p][v]=dis[p][u]+wei[i]; if(!bz[v]) { bz[v]=1; q.push(v); } } } bz[u]=0; }}int main(){ freopen("card.in","r",stdin); freopen("card.out","w",stdout); int A,B,C,D,E,n,u,v; scanf("%d %d %d %d %d %d",&A,&B,&C,&D,&E,&n); int v0=A,v1=A+B,v2=A+B+C,v3=A+B+C+D; fo(i,1,n) { scanf("%d %d",&u,&v),u--; link(u,v,v-u),link(v,u,v-u); } SPFA(v0,0);SPFA(v1,1);SPFA(v2,2); ll ans=dis[0][v1]+dis[2][v3]; ans=min(ans,dis[0][v2]+dis[1][v3]); ans=min(ans,dis[0][v3]+dis[1][v2]); printf("%lld",ans>=INF?-1:ans); fclose(stdin);fclose(stdout); return 0;}
- JZOJ 4302【NOIP2015模拟11.3】IOIOI卡片占卜
- JZOJ.4302[NOIP2015模拟11.3]IOIOI卡片占卜 解题报告
- 【NOIP2015模拟11.3】IOIOI卡片占卜
- 【NOIP2015模拟11.3】IOIOI卡片占卜
- 【NOIP2015模拟11.3】IOIOI卡片占卜
- 【NOIP2015模拟11.3】IOIOI卡片占卜
- 【NOIP2015】IOIOI卡片占卜
- IOIOI卡片占卜
- 【JZOJ4302】IOIOI卡片占卜
- JZOJ.4300[NOIP2015模拟11.3]装饰大楼 解题报告
- JZOJ.4301[NOIP2015模拟11.3]备用钥匙 解题报告
- JZOJ 4307. 【NOIP2015模拟11.3晚】喝喝喝
- 【NOIP2015 11.3模拟】总结
- JZOJ 4294【NOIP2015模拟11.2】复制&粘贴2
- JZOJ 4295【NOIP2015模拟11.2】愉快的logo设计
- JZOJ 4298. 【NOIP2015模拟11.2晚】我的天
- jzoj. 4298. 【NOIP2015模拟11.2晚】我的天
- jzoj 4298【NOIP2015模拟11.2晚】我的天
- 次方求模
- hdu——1556Color the ball(树状数组)
- 山东省第五届ACM大学生程序设计竞赛-angry_birds_again_and_again(积分)
- 面试题89:字符串数组首尾字符相同
- 关于QT中自动添加槽函数编译出错的问题
- JZOJ 4302【NOIP2015模拟11.3】IOIOI卡片占卜
- urllib2 cookielib
- C# OOP程序设计目录
- [HNOI2004]树的计数(prufer编码+组合数学)
- 一些概念
- 数列极差问题
- FJNUOJ1156
- 综合案例 第80课:Spark SQL网站搜索综合案例实战 以京东找出搜索平台上用户每天搜索排名5名的产品,The hottest!
- 客户端储存