hdu 5661
来源:互联网 发布:如何靠网络挣钱 编辑:程序博客网 时间:2024/06/04 18:24
考虑从高位到低位贪心,对于每一位,如果x,y只有唯一的取法,那么只能这么取;否则贪心地必须使答案的这一位等于1。如果x,y都是0,1都能取,则设这是从右向左数第len位,因为x,y能取的值一定都是连续的一段,因此x,y的后len位都能取0111...1(len-1个1)和1000...0(len-1个0)(否则做不到从右向左数第len位都能取0,1)。也就是说,后len位的贡献一定能达到可能的上界111...1(len个1)。此时不必继续考虑后面的位。
如果x,y在这一位并不是0,1都能取,那么由于要使得答案的这一位等于1,也只有唯一的取法。
至此,这一位考虑完毕,然后根据选取的方案,修正一下x和y的范围,然后对后一位做即可。
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <queue>#include <map>#include <set>#include <vector>#include <stack>#include <cmath>using namespace std;typedef long long ll;typedef pair<int,int> pii;#define rep(i , n) for(int i =0 ;i<(int)n;i++)#define rep1(i,x,y) for(int i =(int)x;i<=(int)y;i++)ll a , b , c , d;ll f[62];void show(int x){ while(x > 0){ cout<<(x&1); x>>=1; } cout<<endl;}int main(){ f[0] = 1; for(int i =1 ; i<62 ; i++) f[i] = f[i - 1] * 2; int T; scanf("%d",&T); while(T--) { scanf("%I64d %I64d %I64d %I64d",&a,&b,&c,&d); ll ans = 0; int ok = 0; ll now1 = 0, now2 = 0; ll hav1 = 0, hav2 = 0; for(int i = 61; i>=0 ; i--) { int num11 = ((b>>i)&1); int num21 = ((d>>i)&1); int num10 = (num11==0 || (now1 * 2 + 1)*f[i] - 1 >= a); int num20 = (num21==0 || (now2 * 2 + 1)*f[i] - 1 >= c); ll kong1 , kong2 ; if(hav1 ) { num11 = 1; num10 = (now1 * 2 + 1) * f[i] - 1 >= a; kong1 = (now1 * 2 + 1) * f[i] - a; } if(hav2) { num21 = 1; num20 = (now2 * 2 + 1) * f[i] - 1 >= c; kong2 = (now2 * 2 + 1) * f[i] - c; } // if(i == 2) cout<<now1<<" "<<now2<<" "<<(now1 * 2 + 1)*f[i] - 1<<" "<<(now2 * 2 + 1)*f[i] - 1<<endl; if(num11 + num21 == 1) { now1 = now1 * 2 + num11; now2 = now2 * 2 + num21; ans = ans * 2 + 1; } else if(num11 + num21 == 0) { now1 = now1 * 2 + num11; now2 = now2 * 2 + num21; ans = ans * 2 + 0; } else { if(num10 + num20 == 0) { // if(i == 3) cout<<"****\n"; ans = ans * 2 + 0; now1 = now1 * 2 + 1; now2 = now2 * 2 + 1; } else if(num10 + num20 == 1){ if(num10 == 1) { hav1 = 1; ans = ans * 2 + 1; now1 = now1 * 2 + 0; now2 = now2 * 2 + 1; } else { hav2 = 1; ans = ans * 2 + 1; now1 = now1 * 2 + 1; now2 = now2 * 2 + 0; } } else { if(kong1 > kong2){ hav1 = 1; ans = ans * 2 + 1; now1 = now1 * 2 + 0; now2 = now2 * 2 + 1; } else { hav2 = 1; ans = ans * 2 + 1; now1 = now1 * 2 + 1; now2 = now2 * 2 + 0; } } } }// int max_ = 0;// for(int i = a ; i<=b ; i++)// for(int j =c ; j<=d ; j++)// max_= max(max_ , i ^j);// cout<<max_<<endl; printf("%I64d\n",ans); } return 0;}
0 0
- hdu 5661
- hdu 5661贪心二进制
- hdu 5661 异或
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- Hdu
- hdu
- hdu-
- hdu
- javascript继承
- hadoop架构
- struts标签不显示
- Java中的Integer、Long等实例的比较
- Java集合框架之Map--Hashtable和Properties源码分析
- hdu 5661
- REST APIs must be hypertext-driven——Posted by Roy T. Fielding
- ACM总结——最长公共子序列 & 最长不减(不增)子序列
- FOJ Common Tangents
- 02.Java 集合 - ArrayList
- WPF 绑定中的TargetNullValue
- hihoCoder 九十二周 数论一·Miller-Rabin质数测试 (数论 筛素数)
- 什么是码率?
- java常见运行时错误