首页 > 其他分享 >codeforces round 961题解(A、B、C)

codeforces round 961题解(A、B、C)

时间:2024-06-07 11:22:37浏览次数:16  
标签:00 01 0000 961 0011 int 题解 codeforces 0100

A. Guess the Maximum

因为\(i < j\),所以所有的\([i, j]\)区间中都至少包含两个相邻元素,所以只要求出所有相邻元素中较大值的最小值即可。

int n;
int a[N];

void solve() {
    cin >> n;
    int min_v = 1e9 + 1;
    for (int i = 1; i <= n; i ++) {
        cin >> a[i];
    }
    for (int i = 1; i <= n - 1; i ++) {
        min_v = min(min_v, max(a[i], a[i + 1]));
    }
    cout << min_v - 1 << '\n';
}

B. XOR Sequences

观察结论,发现样例\(4\)的答案是\(2^{25} = 33554432\),猜测所有答案都是\(2\)的次方。

以样例\(3\)为例:

    5432 10        5432 10
57: 1110 01    37: 1001 01
    0100 00        0011 00
    0100 01        0011 01
    0100 10        0011 10
    0100 11        0011 11

发现\(x\)和\(y\)的最长公共后缀对应的位可以从\(0\)开始连续地填,从\(00\)填到\(11\)就走完了这两位可以提供的所有连续数值。如果从\(000\)填到\(111\)的话,因为更高位\(x\)和\(y\)的值不同,所以异或出来的值不是连续的。

再看\(5432\)位,我们要保证\(x\)和\(y\)都不能填\(0000\),因为\(0000\)会和后面两位\(00\)组成\(0\),但是题目要求是从\(1\)开始。假设\(x\)填\(0001\),如果\(y\)必须填\(0000\)才能保证前缀异或相同,那么我们可以把\(x\)改填\(0011\),因为异或的性质,原本第\(3\)位取的是\(x\)的第三位,现在我们改成\(1\),就是取\(x\)的第三位取反,那么\(y\)的第三位就也必须取反,那么\(y\)就得填\(0010\)。这样,我们总可以不用选\(0000\)去填。

int x, y;

void solve() {
    cin >> x >> y;
    int i;
    for (i = 0; i <= 30; i ++) {
        if ((x >> i & 1) != (y >> i & 1)) {
            cout << (1 << i) << '\n';
            return;
        }
    }
    cout << (1 << i) << '\n';
}

C. Earning on Bets

吐槽:忘了删刚开始猜的判断\(-1\)的情况,导致赛时一直\(WA \ 8\)。

设\(x\)的总和为\(s\)。

因为\(k_i * x_i > s\),所以\(x_i >= s / k_i + 1\),然后我们要保证所有的\(s / k_i + 1\)加起来小于等于\(s\)。因为这样我们可以在每个\(s / k_i + 1\)上加若干值使得他们的总和等于\(s\),且仍然满足\(k_i * x_i > s\)。

那么我们可以二分查找这个\(s\),找不到就输出\(-1\)。

int n;
int k[55];
int a[55];

bool check(int x) {
    int sum = x ;
    for (int i = 1; i <= n; i ++) {
        sum -= x / k[i];
    }
    return sum >= n;
}

void solve() {
    cin >> n;
    for (int i = 1; i <= n; i ++) {
        cin >> k[i];
    }
//    double flag = 0;
//    for (int i = 1; i <= n; i ++) {
//        flag += (double)1 / (double)k[i];
//    }
//    if (flag > 1 || fabs(flag - 1) < 1e-6) {
//        cout << -1 << '\n';
//        return;
//    }
    int l = n - 1, r = n * (int)1e9 + 1;
    while (l < r) {
        int mid = l + r >> 1;
        if (check(mid)) r = mid;
        else l = mid + 1;
    }
    int s = l;
    if (s == n - 1 || s == n * (int)1e9 + 1) {
        cout << -1 << '\n';
        return;
    }
//    cout << l << '\n';
    int sum = 0;
    for (int i = 1; i <= n; i ++) {
        a[i] = s / k[i] + 1;
        sum += a[i];
    }
    int cnt = l - sum;
    a[1] += cnt;
    for (int i = 1; i <= n; i ++) {
        cout << a[i] << ' ';
    }
    cout << '\n';
//    sum = 0;
//    for (int i = 1; i <= n; i ++) {
//        sum += a[i];
//    }
//    for (int i = 1; i <= n; i ++) {
//        cout << a[i] * k[i] - sum << ' ';
//    }
//    cout << '\n';
}

标签:00,01,0000,961,0011,int,题解,codeforces,0100
From: https://www.cnblogs.com/lightmon5210/p/18236683

相关文章

  • CodeForces Round #951(Div. 2) 补题记录(A~D)
    A容易发现对于任意一个长度为\(n\),下标从\(1\)开始的序列\(a\),若\(1\lel\ler<n\),则必然有\(\max\limits_{i=l}^ra_i\le\max\limits_{i=l}^{r+1}a_i\)。若\(1<l\ler\len\),则必然有\(\max\limits_{i=l}^ra_i\le\max\limits_{i=l-1}^ra_i\)。很显然Bob希望......
  • 怎么发送超大文件?困扰已久的邮件大附件发送问题解决了!
    邮件是日常中使用最多的文件流转工具,特别是对于企业内部的员工间、及企业与企业间的业务开展,数据和文件的发送、业务留痕大多都基于邮箱展开。邮箱的普遍使用给用户基于邮箱进行业务沟通提供了前提,其中,Outlook邮箱是使用最广泛的邮箱之一。这使得邮箱成为一种最常用的通讯工具,但......
  • 6月6日模拟赛题解
    P4315月下“毛景树”没代码能力,写不动,赛时没写。注意pushdown即可。#include<bits/stdc++.h>inlineintread(){ charch=getchar();intx=0,f=1; for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1; for(;ch>='0'&&ch<......
  • codeforces 1442 D Codeforces Round 681 (Div. 1, based on VK Cup 2019-2020 - Fina
    链接大意就是给你n组物品,这n组物品里面每组有\(t_i\)个,且他们是按照价值不降的顺序排列的。现在允许取k个物品,每个物品必须取在数组的开头处,每个物品在被取用后就会消失。问你最大能够拿到多少价值的物品。其中\(n,k\leq1500,\sumt_i\leq1e6,a_i\leq1e8\)很背包吧。可......
  • arc179d 题解
    arc179d思路设计树形dp。\(dp_{u,0}\)表示进子树\(u\)并不再出去的代价。\(dp_{u,1}\)表示进子树\(u\)并返回,且传送门在\(fa\)、不在子树内使用传送门的代价。\(dp_{u,2}\)表示进入子树\(u\)并返回,且可以在子树内使用传送门。发现\(dp_{u,1}\)一定是遍历子树最后......
  • abc355f 题解
    abc355f直接贺lct维护mst的代码。思路观察到\(w_i\le10\),考虑分开建\(10\)个图表示边权小于等于\(i\)的边组成的图。连并查集,记录当前图连了\(siz_i\)条边。可以发现第\(i-1\)个图是第\(i\)个图的子图。所以差分\(siz_i-siz_{i-1}\)可以得到原图的最小生成......
  • CF1575E 题解
    CF1575E思路点分治,记录当前子树到分治中心的权值和和换车次数。将新子树的答案合并时分类讨论分治中心到子树祖先\(u\tov\)的颜色。树状数组维护前缀和。复杂度\(O(n\log^2n)\)。codeintn,k,a[maxn],ans;inthead[maxn],tot;structnd{ intnxt,to,fl;}e[maxn<<1];......
  • abc355e 题解
    abc355e思路WC2024T3中知道一个技巧:如果知道区间\([l,r]\)的和就连边\(l\tor+1\),那么想推出\([L,R]\)的区间和就要求\(L\)和\(R+1\)联通。按题意把符合要求的边连上,设边权为\(1\)跑bfs,求出\(L\)到\(R+1\)的最短路并记录路径上的点,就可以得到要询问的区间。......
  • CF1007B 题解
    CF1007B思路显然题目要求计数\(u\midA,v\midB,w\midC\)。\(O(n\sqrtn)\)预处理出每个数的所有因数,记为集合\(p_i\)。容斥,记集合\(a,b,c,ab,ac,bc,all\)为\(p_A,p_B,p_C,p_A\capp_B,p_A\capp_A,p_B\capp_C,p_A\capp_B\capp_C\)。可以用bitset维护交集。首先加......
  • 【面试宝藏】MySQL 面试题解析
    MySQL面试题解析1.数据库三大范式是什么?第一范式(1NF):确保每列的原子性,即每列不能再分。第二范式(2NF):在满足1NF的基础上,每个非主属性完全依赖于主键,即消除部分依赖。第三范式(3NF):在满足2NF的基础上,任何非主属性不依赖于其他非主属性,即消除传递依赖。2.MySQL有关权限......