您的位置:首页 > 其它

hdu 5208 Where is Bob

2015-07-01 10:18 316 查看
题目链接

数论,或者说与异或相关的数论题貌似首选想到按位考虑,不多说了(剪枝部分需要注意)

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;

int solve (int p,int l1,int r1,int l2,int r2) {
if(p==-1) return 0;
if(l1>=l2&&r1<=r2) return 0;
int mm=1<<p;
if(r1<mm) {
if(l2>=mm) return mm+solve(p-1,l1,r1,l2^mm,r2^mm);
return solve(p-1,l1,r1,l2,min(mm-1,r2));
}
if(l1>=mm) {
if(r2<mm) return mm+solve(p-1,l1^mm,r1^mm,l2,r2);
return solve(p-1,l1^mm,r1^mm,max(0,l2-mm),r2^mm);
}
if(l2>=mm) return mm+solve(p-1,l1,mm-1,l2^mm,r2^mm);      //一开始没有这两行就t了。。。
if(r2<mm) return mm+solve(p-1,0,r1^mm,l2,r2);
return max(solve(p,l1,mm-1,l2,r2),solve(p,mm,r1,l2,r2));
}

int main ()
{
//	freopen("aa.txt","r",stdin);
int T,cas,l1,l2,r1,r2,ans,i;
scanf("%d",&T);
for(cas=1;cas<=T;cas++) {
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
int r=max(r1,r2);
for(i=29;i>=0;i--)
if((1<<i)&r)
break;
ans=solve(i,l1,r1,l2,r2);
printf("Case #%d: %d\n",cas,ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: