CF1245 E. Hyakugokuとはしご
効果の対象に
10あります\(\タイムズ\)グリッド10は、あなたが歩くように、パスを押しする必要があります。
いくつかのグリッド一方向転送ゲート、同じ列内の2つのセルのそれぞれに接続されたトランスファゲート。ポータル方向が下から来なければならない、と各グリッドの程度は最大で1であり、グリッドの一番上の行は、ポータルの外ではありません。
:あなたはステップがあり歩き
、さらに前方の点にさらに前方のエンドポイントよりも行かない場合は、1が6面体のサイコロを研磨し、そうでない場合は、まだステップと地位をスキップし
、この場合は2ポータルがあることを、ポータルが入るか入らないように選択することができます。
終了間際さあ、あなたは上記の手順を繰り返していきます。
最善の戦略とポータルに求めている場合は、上記の手順を何度も繰り返して期待。
問題の解決策
セット\(F(i、j)は \) 座標を表し\((i、j)を\ ) 端に所望のグリッドの数回。
問題の意味を持つシミュレーション。
コード
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<iomanip>
#include<iostream>
#include<map>
#include<queue>
#include<stack>
#include<vector>
#define LL long long
#define D double
#define rep(i,x,y) for(int i=(x);i<=(y);++i)
#define dwn(i,x,y) for(int i=(x);i>=(y);--i)
#define view(u,k) for(int k=fir[u];~k;k=nxt[k])
using namespace std;
int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)&&ch!='-')ch=getchar();
if(ch=='-')f=-1,ch=getchar();
while(isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return x*f;
}
void write(int x)
{
char ch[20];int f=0;
if(!x){putchar('0'),putchar('\n');return;}
if(x<0)putchar('-'),x=-x;
while(x)ch[++f]=x%10+'0',x/=10;
while(f)putchar(ch[f--]);
putchar('\n');
}
D f[107];
int h[17][17],to[107],px[107],py[107],bac[17][17],cntp;
int main()
{
dwn(i,10,1)
{
if(!(i&1)){rep(j,1,10)cntp++,bac[i][j]=cntp;}
else {dwn(j,10,1)cntp++,bac[i][j]=cntp;}
}
rep(i,1,10)
rep(j,1,10)
{
h[i][j]=read();int x=i-h[i][j],y=j;
to[bac[i][j]]=bac[x][y];
}
f[100]=0;
dwn(i,99,1)
{
D tmp=1.0;int li=min(6,100-i);
if((100-i)<6)tmp=6.0/(100.0-(D)i),f[i]+=(6.0-(D)li)/6.0;
rep(j,1,li)
{
D x=min(f[i+j],f[to[i+j]]);
f[i]+=(x+1.0)/6.0;
}
f[i]*=tmp;
}
printf("%.10lf",f[1]);
return (0-0);
}
CF1245F。ダニエルと春の大掃除
効果の対象に
間隔に\([L、R&LT] \) 、何尋ね\([L、で\ R]、[L、R]のB \ \) を満足\(\スペースのXOR \空間 B = A + Bを\) 。
\(0 \のLeq L \ R&LTのLeq \ 1当量9 ^ 10 \) 。
問題の解決策
セット\(F(x、y)が \) 番号を示している\を(で\ [0、 x]は、中のB \ [0、y]は\) を満足する\(\空間XOR \空間 B = A + B \ )。
答え= \(F(R&LT、R&LT)-2 \タイムズF(1-L、R&LT)+ F(1-L、L-1)\) 。
コンピューティング(\ F)\はバイナリ桁ビットDPができます。
コード
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<iomanip>
#include<iostream>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define rep(i,x,y) for(register int i=(x);i<=(y);++i)
#define dwn(i,x,y) for(register int i=(x);i>=(y);--i)
#define view(u,k) for(int k=fir[u];~k;k=nxt[k])
#define LL long long
#define maxn 37
using namespace std;
int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)&&ch!='-')ch=getchar();
if(ch=='-')f=-1,ch=getchar();
while(isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return x*f;
}
void write(LL x)
{
if(x==0){putchar('0'),putchar('\n');return;}
int f=0;char ch[20];
if(x<0)putchar('-'),x=-x;
while(x)ch[++f]=x%10+'0',x/=10;
while(f)putchar(ch[f--]);
putchar('\n');
return;
}
int t,l,r,a[maxn],b[maxn],len;
LL f[maxn];
LL getf(int i,int yes1,int yes2)
{
if(i==-1){return 1;}
if(f[i]!=-1&&yes1&&yes2)return f[i];
int li1=yes1?1:a[i],li2=yes2?1:b[i];
LL res=0;
res=getf(i-1,yes1|a[i],yes2|b[i]);
if(li1==1)res+=getf(i-1,yes1,yes2|b[i]);
if(li2==1)res+=getf(i-1,yes1|a[i],yes2);
if(yes1&&yes2)f[i]=res;
return res;
}
LL work(int x,int y)
{
if(x<0||y<0)return 0;
memset(f,-1,sizeof(f));
len=0;
while(((1ll<<(len+1))-1ll)<(LL)x)len++;
while(((1ll<<(len+1))-1ll)<(LL)y)len++;
rep(i,0,len)a[i]=(x&(1<<i))?1:0;
rep(i,0,len)b[i]=(y&(1<<i))?1:0;
return getf(len,0,0);
}
int main()
{
t=read();
while(t--)
{
l=read(),r=read();
write(work(r,r)-2ll*work(r,l-1)+work(l-1,l-1));
}
return 0;
}