zoukankan      html  css  js  c++  java
  • 集合 题解

    image

    要求输出方案。

    好丧啊...

    首先我们可以发现两个pattern...

    ①(2k)^(2k+1)=1

    ②(2k)^(2k+1)^(2k+3)^(2k+4)=0

    接下来对于k>=4的时候,先把l令为一个大一点的偶数,看一下中间有没有四个。

    否则就暴力一波找到有没有三个异或和为0,否则就直接输1。那么我们就枚举这个pattern就可以了。

    k=1时显然答案就是l。

    k=2时还是要把l变成大一点的偶数,然后如果此时l!=r,那么就直接用第一个pattern输1即可。否则现在就两个数l、r,l为奇数,那么就l^r和l二选一即可。

    对于k=3的时候,显然答案也<=1,那么我们能不能构出一个答案为0呢?

    考虑这个pattern:

    110000000
    101111111
    011111111

    可以发现这个玩意儿是最优的(因为你改第二个不会影响,改第一或第三个只会使区间变大)

    如果不能用这个pattern,那就套用k=2的做法就行。

    码风略鬼畜...

    #include <iostream>
    #include <stdio.h>
    #include <math.h>
    #include <string.h>
    #include <time.h>
    #include <stdlib.h>
    #include <string>
    #include <vector>
    #include <set>
    #include <map>
    #include <queue>
    #include <algorithm>
    #include <sstream>
    #include <stack>
    #include <iomanip>
    using namespace std;
    typedef long long ll;
    ll l,r,k,t;
    ll gll_()
    {
        ll ans;
        scanf("%I64d",&ans);
        return ans;
    }
    #define FO(x) {freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);}
    #define gll gll_()
    int main()
    {
        FO(set)
        t=gll;
        while(t--)
        {
            l=gll, r=gll, k=gll;
            k=min(k,r-l+1);
            if(k==1)
            {
                cout<<l<<"
    1
    "<<l<<"
    ";
                continue;
            }
            if(k==2)
            {
                bool s=l&1; l+=s;
                if(r-l+1>=2) cout<<1<<"
    2
    "<<l<<" "<<l+1<<"
    ";
                else
                {
                    l-=s;
                    if((l^r)>l) cout<<l<<"
    1
    "<<l<<"
    ";
                    else cout<<(l^r)<<"
    2
    "<<l<<" "<<r<<"
    ";
                }
                continue;
            }
            if(k>=4)
            {
                bool s=l&1; l+=s;
                if(r-l+1>=4) cout<<0<<"
    4
    "<<l<<" "<<l+1<<" "<<l+2<<" "<<l+3<<"
    ";
                else
                {
                    l-=s;
                    for(ll a=l;a<=r;a++)
                    {
                        for(ll b=l+1;b<=r;b++)
                        {
                            for(ll c=b+1;c<=r;c++)
                            {
                                if((a^b^c)==0)
                                {
                                    cout<<"0
    3
    "<<a<<" "<<b<<" "<<c<<"
    ";
                                    goto gg;
                                }
                            }
                        }
                    }
                    cout<<1<<"
    2
    "<<l+1<<" "<<l+2<<"
    ";
                    gg:;
                }
                continue;
            }
            bool ok=0;
            for(ll x=1;x<=r;x<<=1)
            {
                ll a=x+x*2,b=a-1,c=a^b;
                if(a<=r&&b<=r&&c<=r&&a>=l&&b>=l&&c>=l);else continue;
                cout<<0<<"
    3
    "<<a<<" "<<b<<" "<<c<<"
    ";
                ok=1; break;
            }
            if(ok) continue;
            bool s=l&1; l+=s;
            if(r-l+1>=2) cout<<1<<"
    2
    "<<l<<" "<<l+1<<"
    ";
            else
            {
                l-=s;
                if((l^r)>l) cout<<l<<"
    1
    "<<l<<"
    ";
                else cout<<(l^r)<<"
    2
    "<<l<<" "<<r<<"
    ";
            }
        }
    }
  • 相关阅读:
    C#学习笔记一类型转换、枚举、foreach
    C#学习笔记四ref out参数
    SQL学习笔记一SQL基础
    C#学习笔记七索引器
    QUIC和TCP
    接口测试——测试点
    linux下 服务器资源监控工具nmon安装与使用
    Python执行.sh脚本cataline环境变量配置
    linux 常用命令之运行.sh文件
    jacoco+ant安装部署篇
  • 原文地址:https://www.cnblogs.com/zzqsblog/p/5712040.html
Copyright © 2011-2022 走看看