BZOJ2647 : [Neerc2011]Journey
$|x|+|y|=\max(x+y,x-y,-x+y,-x-y)$,设$f[i][j]$表示在$(0,0)$,朝向方向$j$,执行第$i$条指令后的信息:
$cir$:是否陷入循环
$d$:朝向
$x,y$:坐标
$v_0$:$\max(x+y)$
$v_1$:$\max(x-y)$
$v_2$:$\max(-x+y)$
$v_3$:$\max(-x-y)$
然后记忆化搜索,当陷入循环时不再执行后面的指令。
用栈维护所有正在计算的状态,若发现循环,则计算循环的$x$和$y$之和,若为$0$则是循环,否则会走到无限远处。
时间复杂度$O(n^3)$。
#include<cstdio>
#include<string>
#include<iostream>
#include<cstdlib>
using namespace std;
const int N=110,Base=100000000,MAXL=32;
int n,i,j,a[N],q[N*4][2],in[N][4];string b[N][N];bool vis[N][4],cir[N][4];
inline int max(int a,int b){return a>b?a:b;}
struct Num{
int a[MAXL],len,fu;
void init(){len=1,fu=a[1]=0;}
Num(){init();}
bool iszero(){return len==1&&!a[1];}
Num operator+(const Num&b){
Num c;
c.len=max(len,b.len)+2;
int i;
for(i=1;i<=c.len;i++)c.a[i]=0;
if(fu==b.fu){
for(i=1;i<=len;i++)c.a[i]=a[i];
for(i=1;i<=b.len;i++)c.a[i]+=b.a[i];
for(i=1;i<=c.len;i++)if(c.a[i]>=Base)c.a[i+1]++,c.a[i]-=Base;
while(c.len>1&&!c.a[c.len])c.len--;
c.fu=fu;
}else{
bool flag=0;
if(len==b.len){
for(i=len;i;i--)if(a[i]!=b.a[i]){
if(a[i]>b.a[i])flag=1;
break;
}
}else{
if(len>b.len)flag=1;
}
if(flag){
for(i=1;i<=len;i++)c.a[i]=a[i];
for(i=1;i<=b.len;i++)c.a[i]-=b.a[i];
for(i=1;i<=c.len;i++)if(c.a[i]<0)c.a[i+1]--,c.a[i]+=Base;
while(c.len>1&&!c.a[c.len])c.len--;
c.fu=fu;
}else{
for(i=1;i<=b.len;i++)c.a[i]=b.a[i];
for(i=1;i<=len;i++)c.a[i]-=a[i];
for(i=1;i<=c.len;i++)if(c.a[i]<0)c.a[i+1]--,c.a[i]+=Base;
while(c.len>1&&!c.a[c.len])c.len--;
c.fu=b.fu;
}
}
if(c.iszero())c.init();
return c;
}
void operator+=(const Num&b){*this=*this+b;}
Num operator-(const Num&b){
Num c;
c.len=max(len,b.len)+2;
int i;
for(i=1;i<=c.len;i++)c.a[i]=0;
if(fu!=b.fu){
for(i=1;i<=len;i++)c.a[i]=a[i];
for(i=1;i<=b.len;i++)c.a[i]+=b.a[i];
for(i=1;i<=c.len;i++)if(c.a[i]>=Base)c.a[i+1]++,c.a[i]-=Base;
while(c.len>1&&!c.a[c.len])c.len--;
c.fu=fu;
}else{
bool flag=0;
if(len==b.len){
for(i=len;i;i--)if(a[i]!=b.a[i]){
if(a[i]>b.a[i])flag=1;
break;
}
}else{
if(len>b.len)flag=1;
}
if(flag){
for(i=1;i<=len;i++)c.a[i]=a[i];
for(i=1;i<=b.len;i++)c.a[i]-=b.a[i];
for(i=1;i<=c.len;i++)if(c.a[i]<0)c.a[i+1]--,c.a[i]+=Base;
while(c.len>1&&!c.a[c.len])c.len--;
c.fu=fu;
}else{
for(i=1;i<=b.len;i++)c.a[i]=b.a[i];
for(i=1;i<=len;i++)c.a[i]-=a[i];
for(i=1;i<=c.len;i++)if(c.a[i]<0)c.a[i+1]--,c.a[i]+=Base;
while(c.len>1&&!c.a[c.len])c.len--;
c.fu=b.fu^1;
}
}
if(c.iszero())c.init();
return c;
}
void operator-=(const Num&b){*this=*this-b;}
bool operator<(const Num&b){
if(fu!=b.fu)return fu;
if(fu){
if(len!=b.len)return len>b.len;
for(int i=len;i;i--)if(a[i]!=b.a[i])return a[i]>b.a[i];
}else{
if(len!=b.len)return len<b.len;
for(int i=len;i;i--)if(a[i]!=b.a[i])return a[i]<b.a[i];
}
return 0;
}
void write(){
if(fu)putchar('-');
printf("%d",a[len]);
for(int i=len-1;i;i--)printf("%08d",a[i]);
}
void set(int x){
fu=0;
if(x<0)x=-x,fu=1;
len=1;
a[1]=x;
}
}zero,one,x,y;
inline void up(Num&a,const Num&b){if(a<b)a=b;}
struct E{
int d;Num x,y,v0,v1,v2,v3;
void left(){d=(d+1)&3;}
void right(){d=(d+3)&3;}
void init(int _d){
d=_d;
x.set(0);
y.set(0);
v0.set(0);
v1.set(0);
v2.set(0);
v3.set(0);
}
void go(){
if(d==0)x+=one;
if(d==1)y+=one;
if(d==2)x-=one;
if(d==3)y-=one;
up(v0,x+y);
up(v1,x-y);
up(v2,y-x);
up(v3,zero-x-y);
}
void merge(const E&b){
d=b.d;
up(v0,x+y+b.v0);
up(v1,x-y+b.v1);
up(v2,y-x+b.v2);
up(v3,zero-x-y+b.v3);
x+=b.x;
y+=b.y;
}
void write(){
up(v0,v1);
up(v0,v2);
up(v0,v3);
v0.write();
}
}f[N][4];
inline int cal(const string&s){
int t=0;
for(int i=1;i<s.size();i++)t=t*10+s[i]-'0';
return t;
}
inline void check(int l,int r){
for(x.set(0),y.set(0);l<=r;l++)x+=f[q[l][0]][q[l][1]].x,y+=f[q[l][0]][q[l][1]].y;
if(x.iszero()&&y.iszero())return;
puts("Infinity");
exit(0);
}
void cal(int x,int y,int d){
if(vis[x][y])return;
vis[x][y]=1;
q[in[x][y]=d][0]=x;
q[d][1]=y;
f[x][y].init(y);
for(int i=0;i<a[x];i++){
if(b[x][i]=="GO")f[x][y].go();
else if(b[x][i]=="LEFT")f[x][y].left();
else if(b[x][i]=="RIGHT")f[x][y].right();
else{
int A=cal(b[x][i]),B=f[x][y].d;
if(in[A][B]){
check(in[A][B],d);
cir[x][y]=1;
}else{
cal(A,B,d+1);
f[x][y].merge(f[A][B]);
if(cir[A][B])cir[x][y]=1;
}
if(cir[x][y])break;
}
}
in[x][y]=0;
}
int main(){
zero.set(0);
one.set(1);
cin>>n;
for(i=1;i<=n;i++){
cin>>a[i];
for(j=0;j<a[i];j++)cin>>b[i][j];
}
cal(1,0,1);
f[1][0].write();
return 0;
}
BZOJ2647 : [Neerc2011]Journey的更多相关文章
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 2632: [neerc2011]Gcd guessing game
2632: [neerc2011]Gcd guessing game Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 144 Solved: 84[S ...
- CF721C. Journey[DP DAG]
C. Journey time limit per test 3 seconds memory limit per test 256 megabytes input standard input ou ...
- POJ2488A Knight's Journey[DFS]
A Knight's Journey Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 41936 Accepted: 14 ...
- CF #374 (Div. 2) C. Journey dp
1.CF #374 (Div. 2) C. Journey 2.总结:好题,这一道题,WA,MLE,TLE,RE,各种姿势都来了一遍.. 3.题意:有向无环图,找出第1个点到第n个点的一条路径 ...
- POJ2488-A Knight's Journey(DFS+回溯)
题目链接:http://poj.org/problem?id=2488 A Knight's Journey Time Limit: 1000MS Memory Limit: 65536K Tot ...
- codeforces 721C C. Journey(dp)
题目链接: C. Journey time limit per test 3 seconds memory limit per test 256 megabytes input standard in ...
- A Knight's Journey 分类: POJ 搜索 2015-08-08 07:32 2人阅读 评论(0) 收藏
A Knight's Journey Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 35564 Accepted: 12119 ...
- HDOJ-三部曲一(搜索、数学)- A Knight's Journey
A Knight's Journey Time Limit : 2000/1000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other) ...
随机推荐
- python爬虫-淘宝商品密码(图文教程附源码)
今天闲着没事,不想像书上介绍的那样,我相信所有的数据都是有规律可以寻找的,然后去分析了一下淘宝的商品数据的规律和加密方式,用了最简单的知识去解析了需要的数据. 这个也让我学到了,解决问题的方法不止一个 ...
- 2017-2018-2 20165206 实验二《Java面向对象程序设计》实验报告
2017-2018-2 20165206 实验二<Java面向对象程序设计>实验报告 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:韩啸 学号:20165206 指导教 ...
- 页面布局之--Font Awesome+导航
页面布局之--Font Awesome+导航 Font Awesome为您提供可缩放的矢量图标,您可以使用CSS所提供的所有特性对它们进行更改,包括:大小.颜色.阴影或者其它任何支持的效果. 下载地址 ...
- DDD实践:领域事件
要求:修改good表,添加 organization 基础定义 用于引发和调度事件的延迟方法 AddDomainEvent Domain\SeedWork\Entity.cs public abstr ...
- k8s中的api server的ca证书,可以和front proxy ca证书一样么?
答案是: 绝对不可以! 因为请求先验证的是 --requestheader-client-ca-file CA 然后才是--client-ca-file. . 那获取的用户名就会通不过了. 所以会影响 ...
- mysql四大特性与四种隔离级别
四大特性 1:原子性.事务是一个不可分割的整体,事务开始的操作,要么全部执行,要么全部不执行. 2:隔离性.同一时间,只允许一个事务请求同一组数据.不同的事务彼此之间没有干扰. 3:一致性.事务开始前 ...
- window.open实现模式窗口
看了些文章,实现模式窗口有两种方式.window.showModalDialog以及window.open. 一.方式介绍 window.open()支持环境: JavaScript1.0+/JScr ...
- 【Android】 textview 中超出屏幕宽度的字符 省略号显示
当利用textview显示内容时,显示内容过多可能会折行或显示不全,那样效果很不好. 实现如下: <TextView android:layout_width="fill_parent ...
- python全栈开发day99-DRF序列化组件
1.解释器组件源码分析 https://www.processon.com/view/link/5ba0a8e7e4b0534c9be0c968 2.基于CBV的接口设计 1).django循环que ...
- python中super的理解(转)
原文地址:https://www.zhihu.com/question/20040039 针对你的问题,答案是可以,并没有区别.但是这题下的回答我感觉都不够好. 要谈论 super,首先我们应该无视 ...