hdu6899 Xor 2020ccpcネットワーク競争

http://acm.hdu.edu.cn/showproblem.php?pid=6899

ゲーム中、私は2時間しゃがんで、前回どこで負けたか、今度はどこに行きたいかを考えました。しかし、あなたが書くほど、あなたはより混沌とします、私は0406を読んでさえいませんでした

これは古い質問であると言われています。Cometojiと以前のdlsの質問では| xy |が議論されています。つまり、前の質問は-1 0 1として次の質問に渡されるため、減算のキャリーが保証されます。詳細を表示この問題の解決策https://cometoj.com/contest/71/problem/D?problem_id=4019

hduojに管理者アカウントを提供していただきありがとうございます。学ぶためにゲームのACコードにアクセスしてください

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int a,b,k,w;ll ans;
ll dp[35][3][3][2][2][2];

inline void prework()
{
	scanf("%d%d%d%d",&a,&b,&k,&w);
}

inline ll dfs(int ind,int v1,int v2,bool fa,bool fb,bool fw)
{
	v1=min(v1,1);v2=min(v2,1);
	if(v1<-1 || v2<-1) 
		return 0;
	if(ind<0) 
		return v1>=0 && v2>=0;
	if(dp[ind][v1+1][v2+1][fa][fb][fw]>=0)
		return dp[ind][v1+1][v2+1][fa][fb][fw];
	ll ret=0;
	int upa=fa?(a>>ind&1):1;
	int upb=fb?(b>>ind&1):1;
	int upw=fw?(w>>ind&1):1;
	int t=k>>ind&1;
	for(int i=0;i<=upa;i++)
		for(int j=0;j<=upb;j++)
		{
			if((i^j)>upw)
				continue;
			ret+=dfs(ind-1,v1*2+i-j+t,v2*2+j-i+t,fa&&i==upa,fb&&j==upb,fw&&(i^j)==upw);
		}
	return dp[ind][v1+1][v2+1][fa][fb][fw]=ret;
}

inline void mainwork()
{
	memset(dp,-1,sizeof(dp));
	ans=dfs(30,0,0,1,1,1);
}

inline void print()
{
	printf("%lld\n",ans);
}

int main()
{
	int t;
	scanf("%d",&t);
	for(int i=1;i<=t;i++)
	{
		prework();
		mainwork();
		print();
	}
	return 0;
}

 

おすすめ

転載: blog.csdn.net/liufengwei1/article/details/108720635