HDU - 5661 Claris and XOR(数位)
程序员文章站
2022-03-25 20:26:01
...
题目链接:https://cn.vjudge.net/contest/180311#problem/F
题目意思就不说了吧。
题意:
就是说:0<=X、Y<=10^18,这道题一开始啃了好久别人的代码都没有啃懂,打算去学一下数位相关的东西,于是看到了这两篇文章:
https://wenku.baidu.com/view/d2414ffe04a1b0717fd5dda8.html
http://www.matrix67.com/blog/archives/263#comment-1176041
回头再去看这道题发现虽然没用上什么,但是可能思维开阔了吧,知道了怎么去思考这类问题,还有就是能知道别人说的是什么了= =。
思路:
就是贪心的让这一位是“1”,分几种情况,当“temp + sumx” 在所给的范围之内就让他(sumx或sumy)是“1”,这样XOR为“1”,如果不在范围之内(如果该位比范围大好说,直接略过,如果比范围小)必须让(哪个不在范围之内让哪个的)这一位置“1”。因为是从高位往低位枚举的这一位是“1”都比范围的左边界小,那么后面几位都是“1”,也没用了,还是小(比如1000
和0111),所以必须是“1”。
嘛嘛嘛~感觉说的不太清楚
上代码:
#include<cstdio>
#include<iostream>
using namespace std;
long long a, b, c, d;
int n;
long long sumx, sumy;
int main()
{
scanf("%d", &n);
while(n --)
{
sumx = 0, sumy = 0;
scanf("%lld%lld%lld%lld", &a, &b, &c, &d);
for(int i = 60; i >= 0; i --)
{
long long int temp = 1;
temp = temp << i;
if(temp + sumx <= b && temp + sumy <= d)
{
if(temp + sumx < a && temp + sumy < c)
{
sumx += temp;
sumy += temp;
}
else if(temp + sumx < a)
sumx += temp;
else if(temp + sumy < c)
sumy += temp;
else
sumx += temp;
}
else if(temp + sumx <= b)
sumx += temp;
else if(temp + sumy <= d)
sumy += temp;
}
long long int ans = sumx ^ sumy;
printf("%lld\n", ans);
}
}
WA哭一次是因为这里:
long long int temp = 1;
temp = temp << i;
“1”默认是int类型,必须在"<<"操作之前将他定成long long int 类型。因为10^18用计算器算之后就是
60.
接下来自己想一下吧,要是跟看小说似得都写的清楚就锻炼不到思维啦,不过有实在哪里不太明白想不通,欢迎评论提出。
如果哪里写的不妥还请各位前辈指出
这道题目跟2016合肥CCPC很像,签到题目。