zoukankan      html  css  js  c++  java
  • BZOJ2144 跳跳棋[建模+LCA]

    思维题,思路比较神仙。

    个人思路过程:个人只想到了只要中间棋子开始向外跳了,以后就不应该向内跳了,这样很蠢。所以应该要么先向内跳一会,要么直接开始中间的向外跳。不知道怎么处理,就卡住了。

    20pts:暴力BFS。

    事实上,这题的解题关键就在于一次只允许跳过1颗棋子,这表明向内跳只能是距离中间棋子近的那个向内跳,跳法唯一

    再看向外跳是有两种的,中间的子越过左子,或者越过右子。发现中间的子向外跳和外侧的子向内跳是一个可逆过程

    假设向外跳中,向左跳是左儿子,向右跳是右儿子,那么这两个儿子有共同且唯一的父亲,也就是向内跳的操作,这样的一棵二叉树恰好与上述情形相对应。

    这样,如果要判断是否有解,只要看这两个状态一直向内跳,到不能再向内(与中间子距离相等)时,也就是到了树根,如果树根相同,则有解,不同的话肯定无解。因为树根所有向外跳的状态构成了一个封闭的状态集合,不同集合无交集。

    有解的话也就是求树上两点最短距离了。但是由于数据过大,没办法建树,而且一步一步跳显得很慢,$O(depth)$。为了加速,可以采用取模,在纸上画一下即可发现当两个棋子反复互相跳过的时候,实际可以取模处理,详见code。

    这样,采用倍增lca思想,不断向上跳即可。$O(depth ext{log}depth)$。

    WA*1:line32code手残打错。。以后敲代码敲错的情况尽量少犯

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 #define dbg(x) cerr << #x << " = " << x <<endl
     7 using namespace std;
     8 typedef long long ll;
     9 typedef double db;
    10 typedef pair<int,int> pii;
    11 template<typename T>inline T _min(T A,T B){return A<B?A:B;}
    12 template<typename T>inline T _max(T A,T B){return A>B?A:B;}
    13 template<typename T>inline char MIN(T&A,T B){return A>B?(A=B,1):0;}
    14 template<typename T>inline char MAX(T&A,T B){return A<B?(A=B,1):0;}
    15 template<typename T>inline void _swap(T&A,T&B){A^=B^=A^=B;}
    16 template<typename T>inline T read(T&x){
    17     x=0;int f=0;char c;while(!isdigit(c=getchar()))if(c=='-')f=1;
    18     while(isdigit(c))x=x*10+(c&15),c=getchar();return f?x=-x:x;
    19 }
    20 struct sangen{
    21     int x,y,z;
    22     sangen(int x=0,int y=0,int z=0):x(x),y(y),z(z){}
    23     inline bool operator ==(const sangen&B)const{return x==B.x&&y==B.y&&z==B.z;}
    24     inline bool operator !=(const sangen&B)const{return (x^B.x)||(y^B.y)||(z^B.z);}
    25     inline void shiage(){if(x>y)swap(x,y);if(x>z)swap(x,z);if(y>z)swap(y,z);}
    26     inline void print(){printf("x=%d  y=%d  z=%d
    ",x,y,z);}
    27 };
    28 inline sangen tobi(sangen A,int k){
    29     int a=A.y-A.x,b=A.z-A.y,tmp;
    30     while((a^b)&&k){
    31         if(a>b)tmp=(a-1)/b,k>=tmp?(k-=tmp,a%=b,!a&&(a=b)):(a-=k*b,k=0),A.y=A.x+a,A.z=A.y+b;
    32         else tmp=(b-1)/a,k>=tmp?(k-=tmp,b%=a,!b&&(b=a)):(b-=k*a,k=0),A.y=A.z-b,A.x=A.y-a;
    33     }
    34     return A;
    35 }
    36 int d1,d2,k;
    37 inline sangen get_root(sangen A){
    38     int a=A.y-A.x,b=A.z-A.y;k=0;
    39     while(a^b){
    40         if(a>b)k+=(a-1)/b,a%=b,!a&&(a=b),A.y=A.x+a,A.z=A.y+b;
    41         else k+=(b-1)/a,b%=a,!b&&(b=a),A.y=A.z-b,A.x=A.y-a;
    42     }
    43     return A;
    44 }
    45 sangen A,B,tmp1,tmp2;
    46 inline int lca(){
    47     if(d1<d2)B=tobi(B,d2-d1);
    48     else A=tobi(A,d1-d2);//A.print(),B.print();
    49     if(A==B)return abs(d1-d2);
    50     int d=_min(d1,d2),ret=abs(d1-d2);
    51     for(register int i=__lg(d);~i;--i){//dbg(i);
    52         tmp1=tobi(A,1<<i);tmp2=tobi(B,1<<i);//tmp1.print(),tmp2.print();
    53         if(tmp1!=tmp2)A=tmp1,B=tmp2,ret+=2<<i;
    54     }
    55     return ret+2;
    56 }
    57 
    58 int main(){//freopen("test.in","r",stdin);//freopen("test.ans","w",stdout);
    59     read(A.x),read(A.y),read(A.z),read(B.x),read(B.y),read(B.z);
    60     A.shiage(),B.shiage();
    61     sangen tmp1=get_root(A);d1=k;
    62     sangen tmp2=get_root(B);d2=k;//dbg(d1),dbg(d2);
    63     if(tmp1!=tmp2){puts("NO");return 0;}
    64     printf("YES
    %d
    ",lca());
    65     return 0;
    66 }
    View Code

    启示:应当根据性质发现这样一种树形关系。当发现这种变换问题且数据较大,考虑图论建模

  • 相关阅读:
    WCF后续之旅(3): WCF Service Mode Layer 的中枢—Dispatcher
    .Net 2.0对文件传输协议(FTP)操作(上传,下载,新建,删除,FTP间传送文件等)
    我的WCF之旅(13):创建基于MSMQ的Responsive Service
    .net程序集强名称签名实践
    WCF后续之旅(8):通过WCF Extension 实现与MS Enterprise Library Policy Injection Application Block 的集成
    .Net 2.0对文件传输协议(FTP)操作(上传,下载,新建,删除,FTP间传送文件等) 2
    WCF后续之旅(6): 通过WCF Extension实现Context信息的传递
    SilverlightCatchWcfError
    WCF后续之旅(7):通过WCF Extension实现和Enterprise Library Unity Container的集成
    WCF后续之旅(4):WCF Extension Point 概览
  • 原文地址:https://www.cnblogs.com/saigyouji-yuyuko/p/11571201.html
Copyright © 2011-2022 走看看