Codeforces Round #682 (Div. 2)题解

A. Specific Tastes of Andre

题解:全输出一样的数即可

代码:

/*
 * @Author : Nightmare
 */
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define PII pair<int,int>
#define ls 2 * rt
#define rs 2 * rt + 1
#define gcd(a,b) __gcd(a,b)
#define eps 1e-6
#define lowbit(x) (x&(-x))
#define N 105
#define M 300005
#define mod 1000000007
#define inf 0x3f3f3f3f
int n, a[N];
void solve(){
    scanf("%d", &n);
    for(int i = 1 ; i <= n ; i ++) printf("1 ");
    puts("");
}
signed main(){
#ifndef ONLINE_JUDGE
    freopen("D:\\in.txt", "r", stdin);
#endif
    int T; cin >> T; while(T--) solve();
#ifndef ONLINE_JUDGE
    cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
#endif
    return 0;
}
B. Valerii Against Everyone

题解: 如果有两个一样的数,那选这两个数就行,否则二进制无法产生进位,不可能求和后得到其他数

代码:

/*
 * @Author : Nightmare
 */
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define PII pair<int,int>
#define ls 2 * rt
#define rs 2 * rt + 1
#define gcd(a,b) __gcd(a,b)
#define eps 1e-6
#define lowbit(x) (x&(-x))
#define N 1005
#define M 300005
#define mod 1000000007
#define inf 0x3f3f3f3f
int n, tot, a[N], b[N];
void solve(){
    scanf("%d", &n); tot = 0;
    for(int i = 1 ; i <= n ; i ++) scanf("%d", &a[i]), b[++tot] = a[i];
    sort(b + 1, b + tot + 1);
    for(int i = 2 ; i <= n ; i ++) if(b[i] == b[i - 1]){ puts("YES"); return ; }
    puts("NO");
}
signed main(){
#ifndef ONLINE_JUDGE
    freopen("D:\\in.txt", "r", stdin);
#endif
    int T; cin >> T; while(T--) solve();
#ifndef ONLINE_JUDGE
    cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
#endif
    return 0;
}
C. Engineer Artem

题解:因为奇偶的值肯定不同,所以看成棋盘中的黑白点,让矩阵中黑点变成奇数值,白点变成偶数值即可

代码:

/*
 * @Author : Nightmare
 */
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define PII pair<int,int>
#define ls 2 * rt
#define rs 2 * rt + 1
#define gcd(a,b) __gcd(a,b)
#define eps 1e-6
#define lowbit(x) (x&(-x))
#define N 105
#define M 10005
#define mod 1000000007
#define inf 0x3f3f3f3f
int n, m, a[N][N];
int dir[][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
void solve(){
    scanf("%d %d", &n, &m);
    for(int i = 1 ; i <= n ; i ++)
        for(int j = 1 ; j <= m ; j ++)
            scanf("%d", &a[i][j]);
    for(int i = 1 ; i <= n ; i ++)
        for(int j = 1 ; j <= m ; j ++)
            if((a[i][j] & 1) == ((i + j) & 1))
                a[i][j] ++;
    for(int i = 1 ; i <= n ; i ++)
        for(int j = 1 ; j <= m ; j ++)
            printf("%d%s", a[i][j], (j == m ? "\n" : " "));
}
signed main(){
#ifndef ONLINE_JUDGE
    freopen("D:\\in.txt", "r", stdin);
#endif
    int T; cin >> T; while(T--) solve();
#ifndef ONLINE_JUDGE
    cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
#endif
    return 0;
}
D. Powerful Ksenia

题解:因为每次选择3个数变成它们的异或值,所以当再次选择这三个数中的两个数时,这两个数一定会变成选择的第三个数。

考虑两两配对,将(a[2], a[3]), (a[4],a[5])…配对在一起,每次选择a[1]和它们配对,使得每一对异或的值都为0,然后我们只需要知道a[1]通过异或变成了什么值即可。

第一次选择:1 2 3,那么1位置上的值就会变成a[1] ^ a[2] ^ a[3],且a[2] ^ a[3] = 0

第二次选择:1 4 5,那么1位置上的值就会变成a[1] ^ a[2] ^ a[3] ^ a[4] ^ a[5],且a[4] ^ a[5] = 0

容易发现,位置1的值最后会变成所有值的异或,而其他位置的值都有两两异或为0的配对,那么只需要再执行一遍,就可以让所有位置的值都变成位置1上的值。

第一次选择:1 2 3,那么2 3就会变成b[1]

第二次选择:1 4 5,那么4 5就会变成b[1]

那么所有的数都会变成b[1],b[1]是位置1的值扫完第一遍后的值, 而且操作的次数一定为(n - 1) / 2 + (n - 1) / 2

代码:

/*
 * @Author : Nightmare
 */
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define PII pair<int,int>
#define ls 2 * rt
#define rs 2 * rt + 1
#define gcd(a,b) __gcd(a,b)
#define eps 1e-6
#define lowbit(x) (x&(-x))
#define N 100005
#define M 10005
#define mod 1000000007
#define inf 0x3f3f3f3f
int n, a[N];
void solve(){
    scanf("%d", &n);
    for(int i = 1 ; i <= n ; i ++) scanf("%d", &a[i]);
    if(n % 2 == 0){ // 如果n为偶数,最后会剩下一个a[n],而且a[1]变成了前n - 1项的异或值
        int res = 0; // 那么如果a[n] != 前n - 1项的异或值,一定是无解的。否则直接不管这个数
        for(int i = 1 ; i <= n ; i ++) res ^= a[i];
        if(res != 0){ puts("NO"); return ; }
        n --;
    }
    puts("YES");
    printf("%d\n", n - 1);
    for(int i = 1 ; i <= (n - 1) / 2 ; i ++)
        printf("1 %d %d\n", 2 * i, 2 * i + 1);
    for(int i = 1 ; i <= (n - 1) / 2 ; i ++)
        printf("1 %d %d\n", 2 * i, 2 * i + 1);
}
signed main(){
#ifndef ONLINE_JUDGE
    freopen("D:\\in.txt", "r", stdin);
#endif
    solve();
#ifndef ONLINE_JUDGE
    cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
#endif
    return 0;
}
E. Yurii Can Do Everything

题解:如果有两个数 a , b ( a > b ) a, b(a > b) a,b(a>b),二进制位长度最大为n,那么一定有a ^ b < a * 2,因为a * 2的二进制长度一定为n + 1 > n,所以我们可以枚举端点,中间的和一定不能大于端点最大值的2倍,用set去重即可。

代码:

/*
 * @Author : Nightmare
 */
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ull unsigned long long
#define PII pair<int,int>
#define ls 2 * rt
#define rs 2 * rt + 1
#define gcd(a,b) __gcd(a,b)
#define eps 1e-6
#define lowbit(x) (x&(-x))
#define N 1000005
#define M 10005
#define mod 1000000007
#define inf 0x3f3f3f3f
int n, a[N], sum[N]; set<PII> st;
void solve(){
    scanf("%lld", &n);
    for(int i = 1 ; i <= n ; i ++) scanf("%lld", &a[i]), sum[i] = sum[i - 1] + a[i];
    for(int i = 1 ; i <= n ; i ++){
        for(int j = i + 1 ; j <= n - 1 ; j ++){
            if((a[i] ^ a[j + 1]) == sum[j] - sum[i])
                st.insert({i, j + 1});
            if(sum[j] - sum[i] > a[i] * 2) break;
        }
        for(int j = i - 1 ; j > 1 ; j --){
            if((a[i] ^ a[j - 1]) == sum[i - 1] - sum[j - 1])
                st.insert({j - 1, i});
            if(sum[i - 1] - sum[j - 1] > a[i] * 2) break;
        }
    }
    cout << st.size() << '\n';
}
signed main(){
#ifndef ONLINE_JUDGE
    freopen("D:\\in.txt", "r", stdin);
#endif
    solve();
#ifndef ONLINE_JUDGE
    cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
#endif
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值