首页 > 其他分享 >Xum题解

Xum题解

时间:2023-07-29 21:46:25浏览次数:38  
标签:Node int 题解 back tag push Xum putout

Xum

洛谷传送门

  • 题意:

    简化来说就是给你一个奇数 \(x\),而你只能使用 \(+\) 或 \(\bigoplus\),让你构造出一个包含 \(1\) 的数集。

  • Analysis:

    首先为了得到 \(1\),我们一般有两种思路,第一种是构造出 \(n\) 与 \(n+1\) 这种“出解情况”,这种思路考场寄掉了,先咕。
    那么来说说正解思路:
    对于一个数 \(x\),我们考虑它的运算集:“\(+\)”可以实现二进制数的左移操作,而 \(\bigoplus\) 本身就是二进制操作,因此,我们考虑以下转移:

    说明:未知位用a代替,设二进制数长度为 \(k\)。

    \[1aaaaaaa1\tag{1} \]

    左移 \(k\) 位得:

    \[1aaaaaaa100000000\tag{2} \]

    \(1\) 式 \(\bigoplus\) \(2\) 式得:

    \[1aaaaaaa0aaaaaaa1\tag{3} \]

    \(3\) 式 \(+\) \(2\) 式得:

    \[1aaaaaaa10aaaaaaa1\tag{4} \]

    \(2\) 式自加后与 \(\bigoplus\) \(4\) 式得:

    \[aaaaaaa1\tag{5} \]

    \(5\) 式 \(\bigoplus\) \(1\) 式即可得最高位:

    \[100000000\tag{6} \]

  • 实现:

    经过上述分析,我们已经实现了消去最高位,接下来只要一直循环求解下去即可。

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
#define lowbit(x) (x&(-x))
int x;
struct Node{
    int opt,x,y;
};
vector<Node> putout;
int solve(int x){
    int y=x,ans=x>>1;
    while(ans){
        putout.push_back((Node){1,y,y});
        y<<=1;
        ans>>=1;
    }
    int z=x^y;
    putout.push_back((Node){2,x,y});
    int r=y+z;
    putout.push_back((Node){1,y,z});
    int s=y+y;
    putout.push_back((Node){1,y,y});
    int t=r^s;
    putout.push_back((Node){2,r,s});
    int u=t^x; 
    putout.push_back((Node){2,t,x});
    while(y!=lowbit(y)){
        if(y&u){
            putout.push_back((Node){2,y,u});
            y^=u;
        }
        putout.push_back((Node){1,u,u});       
        u+=u;
    }
    putout.push_back((Node){2,x,y});
    x^=y;
    return x;
}
signed main(){
    scanf("%lld",&x);
    while(x!=1) x=solve(x);
    printf("%lld\n",putout.size());
    for(int i=0;i<putout.size();i++){
        if(putout[i].opt==1) printf("1 %lld %lld\n",putout[i].x,putout[i].y);
        else if(putout[i].opt==2) printf("2 %lld %lld\n",putout[i].x,putout[i].y);
    }
    return 0;
}

标签:Node,int,题解,back,tag,push,Xum,putout
From: https://www.cnblogs.com/shen666zxcmt/p/17590595.html

相关文章

  • Sctf2023 Re 部分题解
    re是谁不复习计网和数据库写reSyclang给出两个文件一个是ir一个是编译器直接看ir即可拿vscode正则匹配替换relpace:(var\d+)\(@exp.([XLRXkey]+)(\[\d\])\)$1.$2$3#(\d+)$1<\+\d+>""(var\d+)\(@exp(.key\[\d+\])\)$1$2LABEL""GOTOgoto#!te......
  • 暑期竞赛配训 Day 1,本蒟蒻的第一篇题解qwq!
    洛谷P8725[蓝桥杯2020省AB3]画中漂流:-[1]读题:在梦境中,你踏上了一只木䇝,在江上漂流。根据对当地的了解,你知道在你下游D米处有一个峡谷,如果你向下游前进大于等于D米则必死无疑。现在你打响了急救电话,T秒后救援队会到达并将你救上岸。水流速度是1m/s,你现在有M点体力......
  • P9387 [THUPC 2023 决赛] 巧克力 题解
    这篇题解会只讲怎么dp,所以我们这里跳过博弈论的部分。Let'srephrasetheproblemstatementasfollows:给定\(n,m\),设\(x=1\oplus2\oplus\cdots\oplusn\oplusm\)。求有多少个有序三元组\((a,b,c)\)满足:\(a+b+c\len\)或\(a+b+c=m\)(如果都满足需要算两遍)。\((a+b......
  • Educational Codeforces Round 152 (Rated for Div. 2) 题解
    \(6\)题做出来\(3\)题,这一次的D题没能复刻上一次Round888Div.3最后几分钟AC的奇迹A.MorningSandwich大水题,5min时间4min都在翻译题面直接拿\(b\)和\(c+h\)进行比较分类讨论即可单次操作时间复杂度\(O(1)\)B.Monsters首先有一个特别显然、复杂度特别高的......
  • luogu P4069 [SDOI2016] 游戏 题解【李超树+树剖】
    目录题目描述解题思路code题目描述P4069[SDOI2016]游戏一棵树,树上有\(n\)个节点,最初每个节点上有\(1\)个数字:\(123456789123456789\)。有两种操作:\(\centerdot\)选择\(s,t\)两个节点,将路径上的每一个点都变多(\(1\)个变\(2\)个)数字:\(a\timesdis+b\),其中\(dis\)表示该节点......
  • P3979 遥远的国度 题解
    P3979遥远的国度题意一棵树,\(n\le10^5\),三个操作,\(m\le10^5\),点带权。换根路径推平子树查最小值思路如果没有换根,操作2,3是裸的树剖,考虑换根后的询问如何处理。显然不能再做一遍树剖,只能假装我们换根了,询问可以分成四种情况,令原根为\(root\),新根为\(id\),查询点......
  • luogu P3733 [HAOI2017] 八纵八横 题解【线段树分治+线性基+可撤销并查集+bitset】
    目录题目大意解题思路code题目大意题目链接给出一张\(n\)个点\(m\)条边的连通无向图,边带边权\(w_i\)。有以下三种操作,共\(q\)次:\(\centerdot\)在点\(x,y\)之间加入一条边权为\(w_i\)的边,如果这是第\(i\)个此种操作,则记这条新边为第\(i\)条。\(\centerdot\)将第\(k......
  • P9459 浴眼盯真 题解
    由于我不会使用正则表达式,所以我只能使用基础Python语法QwQ。[input().split()for_inrange(int(input()))]是个列表生成器,效果是产生一个长度为\(T\)的列表,列表的元素是以每一行以空格为分割符的字符串列表。for(a,b,c,d)in[]可以用\(a,b,c,d\)来复制列表中每个元素......
  • P9451 [ZSHOI-R1] 新概念报数 题解
    满足\(\operatorname{popcount}(x)<3\)的数实际上很少,直接把所有这些数扔到set里面,询问就返回set中\(x\)的下一个元素即可。记得开longlong。set内的元素数量是\(\log^2w\),所以复杂度是\(\mathcalO(\log^2w\log\log^2w+T\log\log^2w)=\mathcalO(\log^2w\log\logw......
  • 【题解】Luogu[P4711] 「化学」相对分子质量
    Link一道简单的模拟题,评绿可能有点高了。因为没有括号嵌套,难度瞬间降了一个档次,我们直接对着化学式扫一遍即可。若扫到左括号,说明接下来都是在括号内的,我们标记一下。若扫到大写字母,说明出现了一个新的元素,那么我们就看后面是否有下标,若有则类似于快读的方式直接处理后面的数......