首页 > 其他分享 >大胆假设小心验证——cf_922_C. XOR-distance

大胆假设小心验证——cf_922_C. XOR-distance

时间:2024-02-03 22:11:53浏览次数:26  
标签:distance arr XOR ... ll brr cf const define

目录

问题概述

给出整数a、b、r,要求输出|(a^x) - (b^x)|的绝对值,其中0<=x<=r(取值都是[0, 1e18])

思路想法

首先是一个位置关系,由于求的是绝对值,所以我们可以假定a > b;第二,我们要做的是异或操作,因此可以将a和b的二进制数写出来,结合异或的特点,可以发现,当a和b的相应位数上相同时,无论该位取0/1,不影响最小值,当然,我们肯定取0最好,比较x是有范围的;当a和b的相应位数上的值不同时,我们考虑取x位数取1的效果,可以发现,当a的位数为1时,会导致a-(1<<idx),b+(1<<idx),idx为相应的位数,即差值会减小,相反的,当该位数为0时,差值会变大。但是由于我们做的绝对值,不知道什么时候停止,2和-1这种类型的不好做出来,当时就卡住了
假如a和b的大小关系恒定,即a恒大于b的话,这个题就好写了,是否可以恒定呢,我们只需要保证首位不相同的位数上的值不变就可以保证a恒大于b,假如a = 1a1a2
...an,b = 1b1b2...bn,改变第一位我们可以得到a = 0a1a2...an,b = 0b1b...bn,但是我们发现,我们可以通过改变第一位之后的值将a和b变成相应的模样,因此我们得出结论改变第一位得到的最小值一定可以通过不改变第一位,而是修改其他位得到最小值,那么这样的话,a和b的大小关系就恒定了,只需要求出最小的正整数解即可,那就是从高位向低位不断逼近就行了

参考代码

#include <bits/stdc++.h>
using namespace std;
#define FAST_IO ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define endl '\n'
#define pll pair<long long, long long>
#define pii pair<int, int>
#define vi vector<int>
#define vl vector<long long>
#define ll long long
#define ull unsigned long long
const ll INF = 9187201950435737471;
const int inf = 2139062143;
const ll mod = 1e9 + 7;
const double eps = 1e-6;
const double PI = acos(-1.0);
ll a, b, r;
int arr[67], brr[67];
void solve() {
    cin >> a >> b >> r;
    if(b > a) swap(a, b);
    ll p1 = a, p2 = b;
    int idx = 0;
    memset(arr, 0, sizeof arr);
    memset(brr, 0, sizeof brr);
    while(true) {
        if(!p1 && !p2) break;
        if(p1 & 1) arr[idx] = 1;
        if(p2 & 1) brr[idx] = 1;
        ++idx;
        p1 >>= 1, p2 >>= 1;
    }
    bool first = true;
    ll change = 0;
    for(int i=64; i>=0; i--) {
        if(arr[i] != brr[i]) {
            if(!first) {
                if(!brr[i]) {
                    ll tmp = (1ll << i);
                    if(change+tmp <= r) change += tmp;
                }
            }
            else first = false;
        }
    }
    cout << abs((a-change) - (b+change)) << endl;
}
int main() {
#ifdef xrl
    freopen("in.txt", "r", stdin), freopen("out.txt", "w", stdout);
#endif
    FAST_IO;
    int t = 1;
    cin >> t;
    while(t --) solve();
#ifdef xrl
    cout << "Time used = " << (double)(clock() * 1.0 / CLOCKS_PER_SEC) << "s";
#endif
    return 0;
}

问题反思

刚开始还想着用01背包来做的,就是将r作为拥有的体积,将各位作为消耗体积,改变值作为价值,求最大价值,但是这玩意在没有想通a恒大于b之前也是没有什么意义的,因为最小值不一定在最大值处取得,可能负数嘛,取绝对值就越来越大了,总的来说就是想明白a的b的大小关系恒定就好做了,也就是做题遇到困难要想做假设,然后验证该假设是否可以成立,就会好做很多

标签:distance,arr,XOR,...,ll,brr,cf,const,define
From: https://www.cnblogs.com/notalking569/p/18005286

相关文章

  • CF1677E Tokitsukaze and Beautiful Subsegments
    (题目传送门)你就算再怎么套路我也做不出来……看到\(\maxa_k\),根据套路想到用单调栈处理出\(a_i\)左边第一个比它大的位置\(pre_i\),右边第一个比它大的位置\(nxt_i\)。枚举最大值\(a_i\)考虑它的贡献,显然若存在\(j,k\)满足\(nxt_i<j,k<pre_i\)且\(a_j\timesa_k=a......
  • CF522D Closest Equals 离线扫描 + 线段树
    CF522DClosestEquals题意:m个询问,求[l,r]内相同元素的最小距离。离线询问,按右端点排序。对于每一个a[i],如果last[a[i]]存在,将线段树last[a[i]]的位置改为i-last[a[i]]。查询区间最小值。当然这题也可以回滚莫队。注:本题一路从黑题堕落到绿题#include<bits/stdc......
  • CF1454F Array Partition 题解
    题目链接:CF或者洛谷感觉很多人写太复杂了,其实感觉这题性质很好的。。询问是否可以分为三段\(max_1=min_2=max_3\)。考虑枚举\(max_1\),由于后缀\(max_3\)具有单调性,所以我们可以双指针轻松拿到这样一个模型:因为后缀\(max\)具有单调性,通过双指针我们可以拿到\(j\)后缀......
  • CF1789F Serval and Brain Power 题解
    题目链接点击打开链接题目解法好有技巧性的题(感觉\(n\le80\)这个数据范围就很奇怪啊)首先可以发现\(k\le3\)是好做的,只要枚举断点,然后\(dp\)做一遍\(lcs\)即可,时间复杂度为\(O(n^{2k+1})\),不过严重跑不满,所以可以跑\(k=4\)的情况和\(k=2\)的情况是相同的,所以不......
  • CF887E Little Brother
    (题目传送门)迟到的模拟赛补题。考场上二分写shi了,于是学习一下优秀的二分写法。做法很显然,圆心必然在线段的中垂线上,预处理与每个圆相交的圆心的在中垂线上的范围,打到数轴上,最后扫描线。自己写时对二分预处理圆心范围的讨论过于复杂,结合计算几何的知识,运用同向法可大大减少分......
  • CF1765C
    请看一副扑克牌。每张牌有\(4\)种花色,每种花色正好有\(n\)张牌--因此,这副牌的总数是\(4n\)。这副扑克牌是随机洗牌的,因此扑克牌中\((4n)!\)种可能的牌序都有相同的概率成为洗牌的结果。假设\(c_i\)是一副牌中\(i\)的第3张牌(从上到下)。Monocarp开始从一副牌中一张......
  • 恒虚警检测器CFAR
    问题的引出:雷达目标检测雷达在接收到回波信号后,需要区分目标与噪声。目标检测方法的核心是阈值法。如果雷达回波大于阈值,则显示检测到目标,否则视为噪声。假设将当前单元的功率为\(Y\),噪声功率为\(\mu\),使用的阈值因子为\(\alpha\),则:\[\begin{cases}\text{target}&Y\ge\al......
  • CF1542E2 题解
    一、题目描述:设$\pi(x)$为全排列$x$的逆序对数。给定$n,m$,求有多少对长度为$n$ 的排列$p,q$,使得$p$的字典序小于$q$,且$\pi(p)>\pi(q)$答案对$m$取模。数据范围:$1\len\le500,1\lem\le10^9$。 二、解题思路:一开始列出计算式个人感觉是......
  • 字符串构建问题——cf_921_C. Did We Get Everything Covered?
    目录问题概述思路想法参考代码include<bits/stdc++.h>defineFAST_IOios::sync_with_stdio(false),cin.tie(0),cout.tie(0)defineendl'\n'definepllpair<longlong,longlong>definepiipair<int,int>definevivectordefinevlvectordefinelllo......
  • 数学概率拆分——cf_921_D.Good Trip
    目录问题概述思路想法参考代码问题反思问题概述原题参考:D.GoodTrip大致意思就是一个老师带着n个孩子,其中有m对是朋友,每对朋友之间有一个友谊值,不是朋友的则是0,这个老师要出去玩k次,每次可以带上两个小朋友(为什么不能一起带,这是偏爱!!!),如果这两个小朋友是朋友关系的话,那么他们的......