Codeforces Round 965 (Div. 2) A~E1

Codeforces Round 965 (Div. 2) 阅读详情

A. Find K Distinct Points with Fixed Center (思维)

题意:

给你三个整数 xcx_cxc​ 、 ycy_cyc​ 和 kkk ( −100≤xc,yc≤100-100 \leq x_c, y_c \leq 100−100≤xc​,yc​≤100 , 1≤k≤10001 \leq k \leq 10001≤k≤1000 )。

你需要在2D2D2D坐标平面上找到具有整数坐标的 kkk 个不同点 ( x1,y1x_1, y_1x1​,y1​ )、( x2,y2x_2, y_2x2​,y2​ )、 …\ldots… 、( xk,ykx_k, y_kxk​,yk​ ),并且:

  • 它们的中心为 ( xc,ycx_c, y_cxc​,yc​ )
  • 对于从 111 到 kkk 的所有 iii , −109≤xi,yi≤109-10^9 \leq x_i, y_i \leq 10^9−109≤xi​,yi​≤109

可以证明,至少有一组 kkk 个不同点始终存在,并且满足这些条件。

kkk 个点 ( x1,y1x_1, y_1x1​,y1​ )、( x2,y2x_2, y_2x2​,y2​ )、 …\ldots… 、( xk,ykx_k, y_kxk​,yk​ ) 的中心是 (x1+x2+…+xkk,y1+y2+…+ykk)\left( \frac{x_1 + x_2 + \ldots + x_k}{k}, \frac{y_1 + y_2 + \ldots + y_k}{k} \right)(kx1​+x2​+…+xk​​,ky1​+y2​+…+yk​​) 。

分析:

如果需要偶数个点,那我们就输出k/2k/2k/2个相对(x,y)(x, y)(x,y)中心对称的点即可;如果需要奇数个点,再输出(x,y)(x, y)(x,y)即可。

代码:

#include <bits/stdc++.h>

using namespace std;
const int mod = 998244353;

int main() {
    int t;
    cin >> t;
    while (t--) {
        int x, y, k;
        cin >> x >> y >> k;
        if (k & 1) {
            cout << x << " " << y << endl;
            k--;
        }
        k /= 2;
        for (int i = 1; i <= k; i++) {
            cout << x + i << " " << y << endl;
            cout << x - i << " " << y << endl;
        }
    }
    return 0;
}

B. Minimize Equal Sum Subarrays (思维)

题意:

给定一个长度为 nnn 的排列 ppp 。

找到一个长度为 nnn 的排列 qqq ,使对数 ( i,ji, ji,j ) ( 1≤i≤j≤n1 \leq i \leq j \leq n1≤i≤j≤n ) 最小化,使得 pi+pi+1+…+pj=qi+qi+1+…+qjp_i + p_{i+1} + \ldots + p_j = q_i + q_{i+1} + \ldots + q_jpi​+pi+1​+…+pj​=qi​+qi+1​+…+qj​ 。

分析:

输出排列ppp的循环左移一位或者循环右移一位的结果即可。只有[1,n][1,n][1,n]这个区间和是相等的。

代码:

#include <bits/stdc++.h>

using namespace std;
const int mod = 998244353;

int main() {
    int t;
    cin >> t;
    while (t--) {
        int n;
        cin >> n;
        vector<int> a(n);
        for (int &x: a)
            cin >> x;
        for (int i = 1; i < n; i++)
            cout << a[i] << " ";
        cout << a[0] << endl;
    }
    return 0;
}

C.Perform Operations to Maximize Score (二分)

题意:

你将获得一个长度为 nnn 的数组 aaa 和一个整数 kkk 。您还将获得一个长度为 nnn 的二进制数组 bbb 。

你最多可 ​​ 以执行以下操作 kkk 次:

  • 选择一个索引 iii ( 1≤i≤n1 \leq i \leq n1≤i≤n ),并且 bi=1b_i = 1bi​=1 。设置 ai=ai+1a_i = a_i + 1ai​=ai​+1 (即,将 aia_iai​ 增加 111 )。

你的得分定义为 max⁡i=1n(ai+median⁡(ci))\max\limits_{i = 1}^{n} \left( a_i + \operatorname{median}(c_i) \right)i=1maxn​(ai​+median(ci​)) ,其中 cic_ici​ 表示从 aaa 中删除 aia_iai​ 后得到的长度为 n−1n-1n−1 的数组。换句话说,你的得分是从 111 到 nnn 的所有 iii 中 ai+median⁡(ci)a_i + \operatorname{median}(c_i)ai​+median(ci​) 的最大值。
median⁡(ci)\operatorname{median}(c_i)median(ci​)表示cic_ici​的中位数。
找出以最佳方式执行操作后可以获得的最高得分。

分析:

对于bi=1b_i=1bi​=1位置,最优的操作是直接加上aia_iai​。而bi=0b_i=0bi​=0的位置只能通过加别的数使得中位数变大。
我们先把数字按照0/10/10/1进行分类,再考虑二分答案,判断能否从剩下的数字中找出⌈n2⌉\lceil \frac{n}{2} \rceil⌈2n​⌉个大于midmidmid的数字。对于bi=0b_i=0bi​=0的位置,只需要二分一下还需要提供多少个数字即可。这样我们就能知道还需要bi=1b_i=1bi​=1提供多少个数字。显然我们会选择aia_iai​最大的数字,再利用前缀和判断代价是否会超过kkk即可。

代码:

#include <bits/stdc++.h>

using namespace std;
typedef long long LL;
struct Point {
    LL x, y;
};

bool operator<(const Point &a, const Point &b) {
    return a.x < b.x || (a.x == b.x && a.y < b.y);
}

int main() {
    int t;
    cin >> t;
    while (t--) {
        int n, k;
        cin >> n >> k;
        vector<Point> a(n + 1);
        for (int i = 1; i <= n; i++)
            cin >> a[i].x;
        for (int i = 1; i <= n; i++)
            cin >> a[i].y;
        sort(a.begin() + 1, a.end());
        LL ans = a[n / 2].x + a[n].x;
        LL tmp = 0;
        if (a[n].y == 1) {
            cout << ans + k << endl;
            continue;
        }
        for (int i = n; i >= 1; i--) {
            if (a[i].y) {
                tmp = i;
                break;
            }
        }
        LL l = a[n / 2].x, r = l + k;
        while (l <= r) {
            LL mid = (l + r) >> 1;
            LL all = n, cost = k;
            for (int i = n; i > 0 && all >= n / 2; i--) {
                if (a[i].x < mid && a[i].y) {
                    if (a[i].x + cost >= mid) {
                        cost -= mid - a[i].x;
                        all--;
                    }
                }
                if (a[i].x >= mid) {
                    all--;
                }
            }
            if (all < n / 2) {
                l = mid + 1;
                ans = max(ans, mid + a[n].x);
            } else {
                r = mid - 1;
            }
        }
        a[tmp].x += k;
        sort(a.begin() + 1, a.end());
        ans = max(ans, a[n / 2].x + a[n].x);
        cout << ans << endl;
    }
    return 0;
}

D.Determine Winning Islands in Race (dp)

题意:

农夫约翰的两头奶牛,贝西和埃尔西,计划在 nnn 个岛屿上赛跑。所有 1≤i≤n−11 \leq i \leq n - 11≤i≤n−1 岛上有 n−1n - 1n−1 座主桥,连接岛屿 iii 和岛屿 i+1i + 1i+1 。此外,还有 mmm 座备选桥。埃尔西可以使用主桥和备选桥,而贝西只能使用主桥。所有桥都是单向的,只能用于从索引较低的岛屿前往索引较高的岛屿。

最初,埃尔西从岛屿 111 出发,贝西从岛屿 sss 出发。奶牛轮流转弯,贝西先转弯。假设奶牛在岛屿 iii 上。在奶牛的回合中,如果有任何桥梁连接岛屿 iii 和岛屿 jjj ,那么奶牛可以移动到岛屿 jjj 。然后,岛屿 iii 倒塌,所有连接到岛屿 iii 的桥梁也会倒塌。另外,请注意以下几点:

  • 如果没有桥梁连接岛屿 iii 和另一个岛屿,那么岛屿 iii 会倒塌,这头奶牛将被淘汰出局。
  • 如果另一头奶牛也在岛屿 iii 上,那么在这头奶牛移动到另一个岛屿后,岛屿会倒塌,另一头奶牛将被淘汰出局。
  • 岛屿或桥梁倒塌后,任何奶牛都不能使用它们。
  • 如果一头奶牛被淘汰,则在比赛的剩余时间里,将跳过这头奶牛的回合。

一旦其中一头奶牛到达岛屿 nnn ,比赛就结束。可以证明,无论奶牛的策略如何,至少有一头奶牛会到达岛屿 nnn 。当且仅当 BessieBessieBessie 先到达岛屿 nnn 时,她才会获胜。

对于每个 1≤s≤n−11 \leq s \leq n - 11≤s≤n−1 ,确定如果 BessieBessieBessie 从岛屿 sss 开始比赛,她是否会获胜。假设两头奶牛都遵循最佳策略来确保各自的胜利。

分析:

我们用fif_ifi​表示ElsieElsieElsie到iii的最少步数,那么当ElsieElsieElsie 到iii且打算移动时,BessieBessieBessie 已经移动到S+fi+1S+f_i+1S+fi​+1,那么ElsieElsieElsie移动到jjj,一定有j>S+f(i)+1j >S+f(i)+1j>S+f(i)+1才能赢,移项后得到BessieBessieBessie赢的条件是S≥j−f(i)−1S \ge j-f(i)-1S≥j−f(i)−1,而不等号右边的式子在枚举SSS时不断维护最大值即可。

代码:

#include <bits/stdc++.h>

using namespace std;
typedef long long LL;

int main() {
    int t;
    cin >> t;
    while (t--) {
        int n, m;
        cin >> n >> m;
        vector<LL> a(n + 1);
        vector<vector<LL>> g(n + 1);
        for (int i = 0; i < m; i++) {
            LL u, v;
            cin >> u >> v;
            a[u] = max(a[u], v);
            g[v].push_back(u);
        }
        vector<LL> f(n + 1, n);
        f[1] = 0;
        LL maxval = 0;
        for (int i = 1; i < n; i++) {
            if (i >= maxval)
                cout << 1;
            else
                cout << 0;

            f[i] = min(f[i], f[i - 1] + 1);
            for (auto j: g[i]) {
                f[i] = min(f[i], f[j] + 1);
            }
            maxval = max(maxval, a[i] - f[i] - 1);
        }
        cout << endl;
    }
    return 0;
}

E1.Eliminating Balls With Merging (Easy Version) (二分)

题意:

你有两个整数 nnn 和 xxx ( x=nx=nx=n )。有 nnn 个球排成一排,从左到右编号为 111 到 nnn 。最初,在第 iii 个球上写有一个值 aia_iai​ 。

对于从 111 到 nnn 的每个整数 iii ,我们定义一个函数 f(i)f(i)f(i) ,如下所示:

  • 假设你有一个集合 S={1,2,…,i}S = \{1, 2, \ldots, i\}S={1,2,…,i} 。

  • 在每个操作中,您必须从 SSS 中选择一个整数 lll ( 1≤l<i1 \leq l < i1≤l<i ),使得 lll 不是 SSS 中的最大元素。假设 rrr 是 SSS 中大于 lll 的最小元素。

  • 如果是 al>ara_l > a_ral​>ar​ ,则设置 al=al+ara_l = a_l + a_ral​=al​+ar​ 并从 SSS 中删除 rrr 。

  • 如果是 al<ara_l < a_ral​<ar​ ,则设置 ar=al+ara_r = a_l + a_rar​=al​+ar​ 并从 SSS 中删除 lll 。

  • 如果是 al=ara_l = a_ral​=ar​ ,则选择从 SSS 中删除整数 lll 或 rrr :

  • 如果选择从 SSS 中删除 lll ,则设置 ar=al+ara_r = a_l + a_rar​=al​+ar​ 并从 SSS 中删除 lll 。

  • 如果选择从 SSS 中删除 rrr ,则设置 al=al+ara_l = a_l + a_ral​=al​+ar​ 并从 SSS 中删除 rrr 。

  • f(i)f(i)f(i) 表示整数 jjj ( 1≤j≤i1 \le j \le i1≤j≤i ) 的数量,这样在执行上述操作恰好 i−1i - 1i−1 次后,可以获得 S={j}S = \{j\}S={j} 。

对于从 xxx 到 nnn 的每个整数 iii ,你需要找到 f(i)f(i)f(i) 。

分析:

我们发现最优操作肯定是从位置iii开始,对于左右,能吃掉就尽量吃掉,再判断能否吃掉所有数字。如果一个一个吃的话,那每次模拟复杂度为O(n)O(n)O(n),不可以接受。我们假设某个时刻已经吃掉的范围为[l,r][l,r][l,r]。在这个过程中,我们可以每次向左向右找到第一个大于当前值的数字,然后判断能否能否吃掉这个数字。可以发现,每次多吃一个数字后当前值至少乘222,这个过程最多进行logloglog次。

代码:

#include <bits/stdc++.h>

using namespace std;
typedef long long LL;
const int N = 2e5 + 10;
const int mod = 998244353;
int n, E, a[N], ls[N], rs[N], top, tmp[N];
LL s1[N], s2[N];

void dfs(int x) {
    if (!x)
        return;
    dfs(ls[x]), dfs(rs[x]);
    s1[x] = s1[ls[x]] + s1[rs[x]] + a[x];
    s2[x] = 1;
    if (s1[ls[x]] >= a[x])
        s2[x] += s2[ls[x]];
    if (s1[rs[x]] >= a[x])
        s2[x] += s2[rs[x]];
}

int main() {
    int t;
    cin >> t;
    while (t--) {
        top = 0;
        cin >> n >> E;
        for (int i = 1; i <= n; i++) {
            ls[i] = rs[i] = 0;
            cin >> a[i];
            while (top && a[tmp[top]] <= a[i])
                ls[i] = tmp[top],
                        top--;
            if (top)
                rs[tmp[top]] = i;
            tmp[++top] = i;
        }
        dfs(tmp[1]);
        cout << s2[tmp[1]] << endl;
    }
    return 0;
}1

赛后交流

在比赛结束后,会在交流群中给出比赛题解,同学们可以在赛后查看题解进行补题。

群号: 704572101,赛后大家可以一起交流做题思路,分享做题技巧,欢迎大家的加入。

企业知识库AI助手的权限管理架构:如何实现细粒度控制? 在展开架构设计前,我们需要先明确“细粒度权限”的核心定义,并理解它对AI助手的特殊意义。权限管理的“粒度”,本质是权限控制的精准程度。维度粗粒度权限细粒度权限资源范围entire document(整个文档)field/paragraph(字段/段落)操作类型read/write(读/写)generate_summary/download/export(生成摘要/下载/导出)上下文约束无(静态权限)time/ip/device(时间/IP/设备)适用场景简单系统(如内部wiki) 阅读详情

相关推荐

【蓝桥杯——单片机学习笔记】十三.点阵(STC15F2K60S2)

一.点阵内部图 点阵的有两种,分为共阴和共阳(与数码管类似,后续代码根据共阳点阵编写)。点阵的控制主要是每行和每列电平的控制。如图,以共阳为例:若要使左上角的灯亮,则第一行输出高电平(其他行均为低电平),第一列输出低电平(其他列均为高电平)。 二.原理图 与数码管共用接口,所以数码管和点阵的显示只能选一个使用! 原理图中点阵的接口R5即代表第5行(Row),C8即代表第8列(Column)。通...

默默无闻小菜鸡的博客 2011

Codeforces Round 965 (Div. 2) 8.10

看题得认真,不能迷糊,不然太费时间。

2301_81692739的博客 1280

keil+Jlink GD32调试记录

Jlink+keil,GD32调试记录,踩坑及解决,持续更新。

SUN_BW的博客 2952

Codeforces Round 965 (Div. 2) (题解A~D)

意思抽象出来就是已知n个数平均数为x,求出这n个数字那么举个例子:假设n=3,就取x-1,x,x+1假设n=4就取x-2,x-1,x+1,x+2即可。

s1379659220的博客 835

Win11系统下Notepad++右键菜单失效?3种修复方法实测有效(附注册表备份指南)

本文针对Windows 11系统中Notepad++右键菜单失效的常见问题,提供了三种经过实测有效的修复方法。核心解决方案包括使用官方NppShell.dll重新注册、手动修复注册表项以及系统级问题排查,并详细说明了操作前的注册表备份指南,确保修复过程安全可靠。

m2n3b4v5c6的博客 328

Kubernetes集群环境搭建与初始化

Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。在Kubernetes中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。

m0_75254642的博客 1525

Codeforces Round 956 (Div. 2) 部分题解A~C

给定操作,可以选择一个矩形的一条对角线上的两个端点,让他们加1/2;另一条对角线的端点值加2/1,然后对这些值取模3。考虑网格的边上的值,边上的值的变化会受到其他的影响,所以我们优先去找如何让边上的值相等即可。所有j的aj之和可以被k整除,其中j是k的倍数,k的取值为1~n。问如何分配蛋糕,使三个人获得的蛋糕价值均高于蛋糕价值和的三分之一。给定a和b两个网格,网格中只存在0、1、2三种值。三个人吃蛋糕,每个人对蛋糕不同位置有自己的估价。正扫一遍,反扫一遍,然后比较数组即可。分类讨论:三个人拿蛋糕的顺序。

_Djhhh` blog 1051

安装Quartus-II 13 和Modelsim

目录一、Quartus-II安装1.Quartus-II 13下载2.Quartus-II 13安装3.Quartus-II 13注册二、Modelsim安装 实验目的:安装Quartus-II 13 和Modelsim 实验环境:Windows10 参考资料:Quartus-II安装及使用 一、Quartus-II安装 1.Quartus-II 13下载 正点原子官方资料下载 百度网盘下载链接: https://pan.baidu.com/s/1a9d-bq9RZmWrRV542X4IEA 提取码:

qqq080的博客 8626

Codeforces Round 965

Codeforces Round 965

青少年趣味编程 702

【原理图PCB专题】Cadence17.4 PCB位号重排与反标

Cadence17.4 PCB位号重排与反标比Cadence16版本更简单一些,那到底如何操作?

一点硬件 1181

RT-DETR改进策略【RT-DETR和Mamba】| 替换骨干 Mamba-RT-DETR-T !!! 最新的发文热点

模块是模型中的一个重要组成部分,其主要作用是在模型的初始阶段对输入图像进行处理,方便后续的特征提取和目标检测。以下是对。

Limiiiing的博客 1322

Codeforces Round 965 (Div. 2) ABCE1

Codeforces Round 965 (Div. 2) ABCE1

2301_80105412的博客 1609

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Codeforces Round 965 (Div. 2)(A-C)

A,B都是构造,像是构造专场能上分真开心,最后C题差一点没搞出来,外界大脑得以拿下。

2301_76888784的博客 1368

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Codeforces Round 965 (Div. 2)解题(C)

自己写的时候思路没有捋清楚,没有分两次考虑,一次只更新其中一种,然后比较两种情况的最大值,而是一次循环把两种情况都考虑了,用k又是看看能不能更新最大值,又是看看能不能更新mid值,然后进行比较,虽然可能也可以直接一次性搞定,但很显然,对我而言难度太大了,一直WA,最后时间结束了也没有调出来,而且我还没有用pair,而是用abc三个数组,c是a排完序后的数组,这样导致光是判断当前的a[i]的b是否为1就非常困难了,进一步加大了思维难度。,我们只需要比较两种情况中的最大值就行了。

2301_79876716的博客 660

Codeforces Round 965 (Div. 2) (个人题解)(待补全)

前言:今天晚上打的cf,只能说我还是太菜了,只会前两道签到题,第三题自己有一点思路但苦于时间不太够没能调出来,已经很晚了,明早还有事,我就先把写出来的题放在这,如果之后有补出来的题我再来更新吧!;正文:

Wzh20060111的博客 751

【CF】Day38——Codeforces Round 965 (Div. 2) B

直觉题我们可以这样构造,将整个数列左移一位即可,为什么呢?因为这样我们能尽可能地保证数列的数字尽可能多的同时 且 有一个数不同这里介绍一个rorate函数,它的主要作用是将容器中的元素向左或向右移动,并将移动的元素放到容器的另一端。firstmiddlelastrotate将范围中的元素旋转,使得middle之前的元素移动到范围的末尾,而middle及其之后的元素移动到范围的开头。

qq_61422664的博客 311

Codeforces Round 959

Codeforces Round 959

青少年趣味编程 631

Codeforces Round 959 (Div. 1 + Div. 2 ABCDEFG 题) 文字讲解+视频讲解

Codeforces Round 959 (Div. 1 + Div. 2 ABCDEFG 题) 文字讲解+视频讲解

Edward Shi的博客 1130

CF 965

CF 965

双非 Acmer,分享每天的刷题记录 244

Codeforces Round #476 (Div. 2)——D. Single-use Stones(二分做法)

很容易想到如果mid个青蛙能过河,mid-1肯定也可以,mid+1不一定可以,满足二分性。看了别的题解都是什么最大流最小割,咱比较笨不理解,转而学习了一下二分的写法。

fnmdpnmsl的博客 587

Codeforces round 965 D. Determine Winning Islands in Race

看了官方题解后感觉插入边删除边好麻烦,感觉完全没必要删除,因此时间复杂度O(n+m)就可以了。对于第一种情况,考虑所有端点为 v>S 的桥梁,那么 dv≥v−S−1 必须成立,因为当我们一直向右走时,我们要比艾尔西先到达 v。整体思路就是贝西从2号岛屿出发,正序遍历(1号岛屿时显然贝西必胜),再第i号岛屿时只用考虑1~i-1为起点的桥,因为其他桥要么已经被破坏,要么已经满足艾尔西可以在贝西前面的条件。因此每次插入i-1为起点的桥,同时更新与该桥有关的点的dv,最后更新v-dv的最大值。

2301_80811962的博客 476

Codeforces Round #476 (Div. 2) D. Single-use Stones

Codeforces 思维题

weixin_60183093的博客 240

Codeforces Round #476 (Div. 2) [Thanks, Telegram!] E. Short Code CF965E

http://codeforces.com/contest/965/problem/E首先建一棵trie树 问题转化为把有权的点的深度和尽量缩小 容易想到即把所有点尽量往上放 当一个节点有空位并且有多个子节点的时候 首选把最长的放在这个位置想了半天怎么dp 想来想去觉得麻烦最后还是STL好用(#include <iostream> #include <algorithm> #include

sb的博客 463
上一篇: AtCoder Regular Contest 182 A~D
下一篇: Codeforces Round 963 (Div. 2) A~F1
AC-Panda
博客等级 码龄5年 1736粉丝 191原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值