1452E Two Editorials(贪心+预处理)

本文解析了 EducationalCodeforcesRound98 的竞赛题目 TwoEditorials,通过贪心思想和预处理技术,降低了讲师选题解的计算复杂度,从O(n^2m)优化到O(nm),求解选手满意度最大值。核心在于利用讲师区间中心点距离确定交集大小并进行排序和区间划分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1452E Two Editorials(贪心+预处理)

Educational Codeforces Round 98 (Rated for Div. 2)

E. Two Editorials

题面Two Editorials

题意:一场竞赛有 n n n 道题目,赛后 2 2 2 位讲师每位分别需要选择讲解连续 k k k 题的题解, 2 2 2 位讲师讲的题目可以重复。现在有 m m m 个选手听题解,每位选手感兴趣的题目区间为 [ l i , r i ] [l_i, r_i] [li,ri],每位选手只能选择听 1 1 1 位讲师的题解,若该讲师讲了 x x x 道自己感兴趣的题目,则定义该选手的满意值为 a i a_i ai。问这 2 2 2 位讲师的所有选择中,可能得到的 ∑ a i \sum a_i ai 最大值是多少。

范围 1 ≤ n , m ≤ 2000 ,   1 ≤ k ≤ n ,   1 ≤ l i ≤ r i ≤ n 1 \le n, m \le 2000,~1 \le k \le n,~ 1 \le l_i \le r_i \le n 1n,m2000, 1kn, 1lirin

分析: 对于两个区间来说,他们的交集大小 l e n len len 可以通过他们中心点之间的距离 d i s t dist dist 进行反映, d i s t dist dist 越小, l e n len len 非降。我们可以按照中心点的大小对这些区间进行排序,那么根据贪心的思想,显然我们可以把排序后的区间分成前后两个部分,一个讲师负责前面的部分,另一个讲师负责后面的部分。

如果直接按照上面的思路进行枚举两个讲师的区间以及大区间的分隔位置,时间复杂度为 O ( n 2 m ) O(n^2m) O(n2m),还需要进行优化,考虑进行预处理。我们可以从后往前预处理出 s u f f i x suffix suffix 数组, s u f f i x [ i ] suffix[i] suffix[i] 表示所有 j ∈ [ i , m ] j \in [i, m] j[i,m] 选手都听第 2 2 2 个讲师讲题能得到的 ∑ a j \sum a_j aj 最大值。那么现在我们只需要枚举第 1 1 1 个讲师的区间以及大区间的分隔位置,利用 s u f f i x suffix suffix 更新答案,时间复杂度为 O ( n m ) O(nm) O(nm)

Code

#include <bits/stdc++.h>
#define int long long
#define double long double
using namespace std;
 
inline int read()
{
    int s = 0, w = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9')
    {
        if (ch == '-')
            w = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9')
        s = s * 10 + ch - '0', ch = getchar();
    return s * w;
}
 
const int MAXN = 2000 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const double eps = 1e-9;
const double PI = acos(-1.0);
 
int n, m, k;
 
struct Node
{
    int l, r;
    bool operator < (const Node &other) const 
    {
        return l + r < other.l + other.r;
    }
} nodes[MAXN];

int suffix[MAXN];

signed main()
{
    n = read(), m = read(), k = read();
    for (int i = 0; i < m; i++)
    {
        nodes[i].l = read(), nodes[i].r = read();
    }
    sort(nodes, nodes + m);
    for (int i = 0; i < n - k + 1; i++)
    {
        int sum = 0;
        for (int j = m - 1; j >= 0; j--)
        {
            sum += max(0ll, min(i + k, nodes[j].r) - max(i, nodes[j].l - 1));
            suffix[j] = max(suffix[j], sum);
        }
    }
    int ans = 0;
    for (int i = 0; i < n - k + 1; i++)
    {
        int sum = 0;
        for (int j = 0; j < m; j++)
        {
            sum += max(0ll, min(i + k, nodes[j].r) - max(i, nodes[j].l - 1));
            ans = max(ans, sum + suffix[j + 1]);
        }
    }
    cout << ans << endl;
    return 0;
}

【END】感谢观看

使用时请将ClientAndServerDatabase文件夹放至到E盘的根目录下。 Client的账号为:guest 密码为:111 Server的账号为:admin 密码为: admin 使用时将Client目录下的Server.ini文件中的IP 后改写为服务器端的IP地址。 Server中的客户端监控设置改为客户端的IP地址,之后重启软件就可以看到客户端屏幕了。 发送信息需开启信使服务,开启方法为点击服务项中的Messager项为开启。 注意双方的机子都得开启此服务,才能够使用其功能。 Client的接受文件功能需要输入服务器端的IP地址点连接,端口号为5001,我已设为默认。 服务器端需要点击文件传输按钮才能被客户端连接到。 关于流量监控,此模块有异常,光查询时没有问题,关闭该功能时会报错。 远程桌面连接为系统自带功能项,具体使用方法请查询百度。 Client有禁止qq登录的功能。此功能耗费系统内存。 此系统的初步设想是将数据库放置到一个服务器上,通过client端和server端共同访问到数据库,并且修改,查询,最后因为种种原因没有实现该功能,仅将数据库.mdb文件放置到了一个公共的文件夹下,我想如果是一个搭建好的局域网,并且有着一个共享的目录,所有在局域网内的计算机就可以一并放到到此目录,这时在将数据库文件放置到那里,问题就可以得到解决,在此仅提供思路,本人并没有实现。 最后我想说本系统不完善的东西其实有太多太多,并不是一个成功的作品,其中也COPY了大量的代码,但是我想说的是,因为我做的这个东西资料挺难找的,仅此的想将这个不完善的东西上传至网上,能够给有所需的人一点点启发,这就足够了!!! 本系统的作者为:大连东软信息学院 嵌入式09002班 徐明
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值