Submission #1137650

#TimeUsernameProblemLanguageResultExecution timeMemory
1137650KhoaDuyAncient Machine (JOI21_ancient_machine)C++20
100 / 100
43 ms6628 KiB
#include "Anna.h"
#include<bits/stdc++.h>
using namespace std;
const int blsz=63,blcomsz=44,lim=17;
long long DP[blsz+1];
void setup(){
    DP[0]=1,DP[1]=2;
    for(int i=2;i<=blsz;i++){
        DP[i]=DP[i-1]+DP[i-2];
    }
}
string toBin(long long x,int limit){
    string s="";
    while(x>0){
        s+=((x&1)+'0');
        x>>=1;
    }
    while(s.length()<limit){
        s+='0';
    }
    reverse(s.begin(),s.end());
    return s;
}
long long toInt(string &s,int l,int r){
    long long x=0;
    for(int i=l;i<=r;i++){
        x<<=1;
        x+=(s[i]-'0');
    }
    return x;
}
void Anna(int n,vector<char> s){
    setup();
    int posX=-1,posY=-1,posZ=-1;
    for(int i=0;i<n;i++){
        if(s[i]=='X'){
            posX=i;
            break;
        }
    }
    for(int i=n-1;i>=0;i--){
        if(s[i]=='Z'){
            posZ=i;
            break;
        }
    }
    for(int i=posZ;i>=max(posX,0);i--){
        if(s[i]=='Y'){
            posY=i;
            break;
        }
    }
    if(posX==-1||posY==-1||posZ==-1){
        posX=0,posY=1,posZ=2;
    }
    string send="";
    send+=toBin(posX,lim);
    send+=toBin(posY,lim);
    send+=toBin(posZ,lim);
    int mark[n+1000]={0};
    for(int i=posX;i<posY;i++){
        if(s[i]=='Y'&&s[i+1]=='X'){
            mark[i]=1;
        }
    }
    for(int k=0;k<n;k+=blsz){
        long long pos=1;
        for(int i=k;i<k+blsz;i++){
            if(mark[i]==1){
                pos+=DP[k+blsz-1-i];
            }
        }
        send+=toBin(pos,blcomsz);
    }
    for(int i=0;i<send.size();i++){
        Send(send[i]-'0');
    }
}
#include "Bruno.h"
#include<bits/stdc++.h>
using namespace std;
const int blsz=63,blcomsz=44,lim=17;
long long DP[blsz+1];
void setup(){
    DP[0]=1,DP[1]=2;
    for(int i=2;i<=blsz;i++){
        DP[i]=DP[i-1]+DP[i-2];
    }
}
string toBin(long long x,int limit){
    string s="";
    while(x>0){
        s+=((x&1)+'0');
        x>>=1;
    }
    while(s.length()<limit){
        s+='0';
    }
    reverse(s.begin(),s.end());
    return s;
}
long long toInt(string &s,int l,int r){
    long long x=0;
    for(int i=l;i<=r;i++){
        x<<=1;
        x+=(s[i]-'0');
    }
    return x;
}
void Bruno(int n,int l,vector<int> a){
    setup();
    string trans="";
    for(int i=0;i<l;i++){
        trans+=(a[i]+'0');
    }
    bool spe[n]={false};
    spe[toInt(trans,0,lim-1)]=true;
    spe[toInt(trans,lim,2*lim-1)]=true;
    spe[toInt(trans,2*lim,3*lim-1)]=true;
    string state="";
    for(int k=3*lim;k<trans.length();k+=blcomsz){
        long long pos=toInt(trans,k,k+blcomsz-1);
        long long oripos=pos;
        assert(pos<=DP[blsz]);
        for(int len=blsz;len>0;len--){
            if(pos>DP[len-1]){
                pos-=DP[len-1];
                state+='1';
                len--;
                if(len>0){
                    state+='0';
                }
            }
            else{
                state+='0';
            }
        }
    }
    for(int i=0;i<state.length();i++){
        if(state[i]=='1'){
            spe[i]=true;
            spe[i+1]=true;
        }
    }
    for(int i=0;i<n;i++){
        if(!spe[i]){
            Remove(i);
        }
    }
    bool skip=false;
    for(int i=n-1;i>=0;i--){
        if(spe[i]){
            if(!skip){
                skip=true;
                continue;
            }
            Remove(i);
        }
    }
    for(int i=n-1;i>=0;i--){
        if(spe[i]){
            Remove(i);
            break;
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...