Codeforces 460D Little Victor and Set(构造)

题目链接:Codeforces 460D Little Victor and Set

题目大意:给定范围l,r,选小于k个数,使得这些数的亦或和最小。

解题思路:加入k为偶数,那么kXOR(k+1)=1

根据这个可以处理掉k≠3的所有情况。

对于k=3的情况,找到一个大于l的2k,如果满足2k+1≤r,那么就可以构造出三个数亦或值为0的情况。

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
typedef long long ll;

ll l, r, k;

void solve (int n) {
    int s = 1;
    ll ret = l;

    for (int i = 2; i < (1<<n); i++) {
        ll u = 0;
        for (int j = 0; j < n; j++)
            if (i&(1<<j))
                u ^= (l+j);

        if (u < ret) {
            ret = u;
            s = i;
        }

    }

    int x = 0;
    ll arr[10];
    for (int i = 0; i < n; i++)
        if (s&(1<<i))
            arr[x++] = l + i;

    printf("%lld\n%d\n", ret, x);
    printf("%lld", arr[0]);
    for (int i = 1; i < x; i++)
        printf(" %lld", arr[i]);
    printf("\n");
}

void fuck () {
    ll x = 1;
    while (x <= l) x <<= 1;

    if ((x | (x>>1)) <= r) {
        printf("0\n3\n");
        printf("%lld %lld %lld\n", l, x | (x>>1), (x | (x>>1)) ^ l);
        return;
    }

    printf("1\n2\n");
    if (l&1)
        l++;
    printf("%lld %lld\n", l, l+1);
}

int main () {
    scanf("%lld%lld%lld", &l, &r, &k);

    if (k == 1)
        printf("%lld\n1\n%lld\n", l, l);
    else if (k >= 5) {

        if (l&1)
            l++;
        printf("0\n4\n%lld %lld %lld %lld\n", l, l+1, l+2, l+3);
    } else if (k == 4 && (r - l + 1 > 4 || l%2 == 0)) {

        if (l&1)
            l++;
        printf("0\n4\n%lld %lld %lld %lld\n", l, l+1, l+2, l+3);
    } else if (k == 2 && (r - l + 1 > 2 || l%2 == 0)) {

        if (l&1)
            l++;
        printf("1\n2\n%lld %lld\n", l, l+1);
    } else if (k == 2) {

        if ((l^r) > l)
            printf("%lld\n1\n%lld\n", l, l);
        else
            printf("%lld\n2\n%lld %lld\n", l^r, l, r);
    } else if (k == 4) {
        solve(k);
    } else {
        fuck();
    }
    return 0;
}
时间: 2024-10-21 03:32:18

Codeforces 460D Little Victor and Set(构造)的相关文章

Codeforces 460D Little Victor and Set --分类讨论+构造

题意:从区间[L,R]中选取不多于k个数,使这些数异或和尽量小,输出最小异或和以及选取的那些数. 解法:分类讨论. 设选取k个数. 1. k=4的时候如果区间长度>=4且L是偶数,那么可以构造四个数(L,L+1,L+2,L+3),这样的话(L^(L+1)) ^ ((L+2)^(L+3)) = 0,最优 如果L不是偶数,那么看从L+1到R有没有四个数,如果有则取该四个数,否则最小异或和达不到0,也达不到1了,不再考虑k=4,k=3时还有可能等于0,所以转到k=3 2. k=3时,要使异或和为0,那

codeforces 460D Little Victor and Set(构造、枚举)

最近的CF几乎都没打,感觉挺水的一个题,不过自己仿佛状态不在,看题解才知道做法. 输入l, r, k (1 ≤ l ≤ r ≤ 1012; 1 ≤ k ≤ min(106, r - l + 1)). 从[l,r]选至多k个数使得选出的数的异或值最小,输出最小异或值和方案. 分类讨论,首先如果r-l+1<=4,枚举集合解决之. 先面讨论r-l+1>=5的情况: 此时有至少5个数可以选择,故至少有连续的4个数满足2x,2x+1,2x+2,2x+3. k==1时显然方案为{l}.k==2时,显然方案

Codeforces 460D Little Victor and Set(看题解)

Little Victor and Set 其他都很好求, 只有k == 3的时候很难受.. 我们找到第一个不大于l的 t, 答案为 l, 3 * t, (3 * t) ^ l 感觉好像是对的, 感觉又不会证明, 啊, 我好菜啊. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define PLL pair<LL, LL> #

codeforces 848B - Rooter&#39;s Song(构造+几何)

原题链接:http://codeforces.com/problemset/problem/848/B 题意:好多个人分别从x,y轴不同位置不同时间往垂直坐标轴方向移动,一旦相遇他们转向,问所有人的到达边缘的位置. 思路:即使相遇后没有改变方向,终点位置还是不变的. 1.首先可以根据开始移动的时间将每个人的初始位置往后移动ti单位,这样就可以看作所有人都同时开始移动了. 2.接下来,假设两个人i,j在t时刻(x, y)处相撞,那么可以推知两个人的初始位置分别为(x-t, y),(x, y-t),

codeforces 459C - Pashmak and Buses 【构造题】

题目:codeforces 459C - Pashmak and Buses 题意:给出n个人,然后k辆车,d天时间,然后每天让n个人选择坐一辆车去上学,要去d天不能有任意两个人乘同一辆车,不能的话输出 -1 分类:数学,构造 分析:这个题目首先得分析,我开始想到的是首先用相同的放在一起,比如 7 2 3 这样构造 1 1 1 1 2 2 2 1 1 1 2 2 2 1 1 1 2 2 2 1 1 1 2 2 2 1 1 1 就是需要的天数跟每一行出现次数最多的数的出现次数相等,但是发现还有更优

Codeforces 12E Start of the season 构造 一个n*n矩阵使得每行恰好有一个[0,n-1]且对称

题目链接:点击打开链接 题意: 给定一个n 构造 一个n*n矩阵使得每行恰好有一个[0,n-1]且关于主对角线对称 且主对角线必须全为0 #include<stdio.h> #include<iostream> #include<string.h> #include<set> #include<vector> #include<map> #include<math.h> #include<queue> #inc

codeforces 460D:Little Victor and Set

Description Little Victor adores the sets theory. Let us remind you that a set is a group of numbers where all numbers are pairwise distinct. Today Victor wants to find a set of integers S that has the following properties: for all x the following in

Codeforces Gym 100187K K. Perpetuum Mobile 构造

K. Perpetuum Mobile Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/problem/K Description The world famous scientist Innokentiy almost finished the creation of perpetuum mobile. Its main part is the energy generator whic

codeforces 848A - From Y to Y(构造)

原题链接:http://codeforces.com/problemset/problem/848/A 题意:让我们构造一个字符串.这里有一种操作:取走这个字符串的若干部分,分成两部分,然后将这两部分的合并插回字符串中,进行过处理的字符串部分不能再次被单独取出,只能整体取出,直到无法操作后停止.每次这种操作后,消耗, f(s,c)是c字符在s字符串重复的次数. 让我们输出:若干次操作后最小值恰好为k的字符串,不用考虑字符的顺序. 思路:最好怎么简单怎么做.如果我们让字符串中只有一种字符,显然通过