欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

HDU - 5661 Claris and XOR(数位)

程序员文章站 2022-03-25 20:26:01
...

题目链接:https://cn.vjudge.net/contest/180311#problem/F

题目意思就不说了吧。

题意:

就是说:0<=X、Y<=10^18,这道题一开始啃了好久别人的代码都没有啃懂,打算去学一下数位相关的东西,于是看到了这两篇文章:

感觉学到很多。

回头再去看这道题发现虽然没用上什么,但是可能思维开阔了吧,知道了怎么去思考这类问题,还有就是能知道别人说的是什么了= =。

思路:

就是贪心的让这一位是“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用计算器算之后就是HDU - 5661 Claris and XOR(数位)


60.

接下来自己想一下吧,要是跟看小说似得都写的清楚就锻炼不到思维啦,不过有实在哪里不太明白想不通,欢迎评论提出。

如果哪里写的不妥还请各位前辈指出



这道题目跟2016合肥CCPC很像,签到题目。