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); } }
相关文章推荐
- Webrtc Intro - SCTP
- Qt第三方库QCustomPlot——认识图表的各个部分
- 广告中的去重选择
- github简单使用教程_GOOD
- iOS masonry动态约束控件位置
- JavaCard开发环境搭建
- Guice 学习(四)基本属性注入(Field Inject)
- 可变字符串用不了appendFormat 方法的时候
- OpenvSwitch完全使用手册
- 字节存储排序:大端和小端的判别及转换
- JAVA学习(一):Java介绍及其平台、开发环境的配置与搭建
- 单链表(创建,打印,逆序,合并两个有序的链表)
- android: jni socket
- lcov for linux 使用
- JAVA学习(一):Java介绍及其平台、开发环境的配置与搭建
- 国内外域名商.xyz域名总量TOP10统计报告(6月30日)
- Map.putAll方法——追加另一个Map对象到当前Map集合
- ListView 中嵌套了OnClickListener事件,而本身onItemClick事件无响应的解决方案
- 互联网应用不在热闹的时候,而在沉浸的时候。
- 设计模式