首页 > 其他分享 >Educational Codeforces Round 172 (Rated for Div. 2) D. Recommendations

Educational Codeforces Round 172 (Rated for Div. 2) D. Recommendations

时间:2024-12-03 20:54:07浏览次数:8  
标签:Educational Rated int 线段 Codeforces xx mp ans id

算法

听别人说这题比较简单, 我来看看怎么个事

转化题意,
对于 \(n\) 条线段 \([l_i, r_i]\) , 求每条线段被哪些线段完全覆盖, 并求这些线段的交集减去其的长度

显然的, \(j\) 线段覆盖 \(i\) 线段, 应该满足 \(l_j \leq l_i, r_i \leq r_j\)

那么我们考虑将每一条线段当做一个点处理, 放到以 \(l\) 为横轴, \(r\) 为纵轴的矩阵上, 那么问题就转化成二维矩阵上, 求最靠近右下角的一个点的横纵坐标, 具体的转化是显然的, 那么我们就可以用扫描线算法中的经典问题: 二维数点来做

这下变成板子题了, 那么我们去学新算法吧

关于二维数点 & 扫描线

扫描线实际上就是暴力枚举一维, 另一维用数据结构维护, 以此来做到优化时间复杂度

但是二维数点这种问题怎么办?

我们考虑离线询问, 按照一维排序, 那么对于另一个维度, 树状数组区间和即可


那么对于这道题, 我们怎么去处理

首先假设按照 \(l\) 排序, 为了保证正确性, 还需要按照 \(r\) 从大到小排序, 确保当前节点处理时, 所有在左上角矩阵中的点都已经处理过, 可以使用树状数组, 以 \(r\) 为下标维护 \(l\) 的最大值, 而 \(r\) 的最小值可以二分求出, 仅仅是比当前的大于或等于即可

代码

#include <bits/stdc++.h>
using namespace std;
const int m = 1e9 + 2;

int n, s[200005];

struct su
{
    int x, y, id;
    bool operator<(const su &temp) const
    {
        if (x == temp.x)
            return y > temp.y;
        return x < temp.x;
    }
} a[200005];
int ans[200005];

void add(int x, int v)
{
    for (; x <= n; x += x & -x)
        s[x] = max(s[x], v);
}

int ask(int x)
{
    int res = 0;
    for (; x; x -= x & -x)
        res = max(s[x], res);
    return res;
}

void solve()
{
    cin >> n;
    set<int> q;
    vector<int> f;
    unordered_map<int, int> mp;
    for (int i = 1; i <= n; ++i)
    {
        int x, y;
        cin >> x >> y;
        a[i].x = x;
        a[i].y = y;
        a[i].id = i;
        f.push_back(a[i].y); // 按照 x 进行一个扫, 把 y 加入
        s[i] = 0;
    }
    sort(f.begin(), f.end());
    reverse(f.begin(), f.end());
    unique(f.begin(), f.end());
    for (int i = 0; i < f.size(); ++i) // 离散化
        mp[f[i]] = i + 1;
        
    sort(a + 1, a + n + 1);
    for (int i = 1; i <= n; i++)
    {
        if (i > 1)
        {
            q.insert(a[i - 1].y);
            add(mp[a[i - 1].y], a[i - 1].x);
        }
        if (i < n && a[i].x == a[i + 1].x && a[i].y == a[i + 1].y)
        {
            ans[a[i].id] = 0;
            continue;
        }
        auto xx = q.lower_bound(a[i].y);
        if (xx == q.end())
        {
            ans[a[i].id] = 0;
            continue;
        }
        int y = ask(mp[a[i].y]);
        if ((*xx) < y)
        {
            ans[a[i].id] = 0;
            continue;
        }
        ans[a[i].id] = (*xx) - y - (a[i].y - a[i].x);
    }
    for (int i = 1; i <= n; i++)
    {
        cout << ans[i] << "\n";
    }
}

int main()
{
    int t;
    cin >> t;
    while (t--)
        solve();
}

总结

善于转化问题

注意问题到底需要求最值的哪边

标签:Educational,Rated,int,线段,Codeforces,xx,mp,ans,id
From: https://www.cnblogs.com/YzaCsp/p/18585039

相关文章

  • VMware Integrated OpenStack 7.3 现已支持 vSphere 8.0U3 和 NSX 4.2 互操作性
    VMwareIntegratedOpenStack7.3-VMware支持的OpenStack发行版VMware支持的OpenStack发行版:在VMware虚拟化技术之上运行企业级OpenStack云请访问原文链接:https://sysin.org/blog/vmware-vio-7/查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgVMwareIn......
  • 【双堆懒删除】codeforces 1294 D. MEX maximizing
    前言双堆懒删除当需要维护若干元素中的最大值(或最小值)时,可以用一个堆维护,但是堆只擅长处理堆顶元素,对堆中任意元素的处理就束手无策了。此时,可以引入另外一个堆,我们定义原来的堆为保存堆\(ex\),新的堆为懒删除堆\(de\)。那么当需要从保存堆中删除任意一个元素时,可以先将元素放......
  • Educational Codeforces Round 169 (Rated for Div2)
    EducationalCodeforcesRound169(RatedforDiv.2)-CodeforcesProblem-A-Codeforces构造签到题,明显只有\(n\leq2\)的时候有解#include<bits/stdc++.h>usingnamespacestd;constintN=2e5+10;typedefpair<int,int>pii;intn,m;inta[N];voidsolve(......
  • Educational Codeforces Round 171 (Rated for Div
    EducationalCodeforcesRound171(RatedforDiv.2)-CodeforcesProblem-A-Codeforces几何构造没什么好说的,\(45\)度交的时候长度最大#include<bits/stdc++.h>usingnamespacestd;constintN=3e5+10;voidsolve(){ intx,y,k;cin>>x>>y>>k; if(x......
  • E. Photoshoot for Gorillas(Codeforces Round 966 (Div. 3))
    https://codeforces.com/contest/2000/problem/E题目描述你非常喜欢屮大猩猩,于是你决定为它们组织一次拍摄活动。大猩猩生活在丛林中,丛林被表示为一个有n行m列的网格,有w个大猩猩同意参与拍摄,第i个大猩猩的身高ai.你希望将所有大猩猩放置在网格的单元格中,并且确保每个单......
  • 每日一题:https://codeforces.com/contest/1700/problem/B
    题目链接:https://codeforces.com/contest/1700/problem/B#include<iostream>#include<string.h>#include<string>#include<cmath>#include<algorithm>usingnamespacestd;intmain(){intu;cin>>u;for(inti=1;i......
  • Codeforces Round 987 (Div. 2)
    目录写在前面A签到B结论,枚举C构造,数学D枚举,数据结构Edfs,树形DP,构造写在最后写在前面比赛地址:https://codeforces.com/contest/2031退役?累了。妈的明天体测测完直接飞昆明感觉要爆了、、、A签到保证给定序列不升,要求修改到不降,则将所有元素修改至相等一定是不劣的。......
  • 【二分+前缀和+后缀和】codeforces 2026 D. Sums of Segments
    题目https://codeforces.com/problemset/problem/2026/D题意第一行输入一个正整数\(n(1\leqn\leq3e5)\),第二行输入\(n\)个整数\(a_1,a_2,...,a_i,...,a_n(-10\leqa_i\leq10)\),第三行输入一个正整数\(q(1\leqq\leq3e5)\),随后\(q\)行,每行输入两个整数\(......
  • CodeTON Round 9 (Div. 1 + Div. 2, Rated, Prizes!)(A~C2)
    A-ShohagLovesMod思路假设构造差值是\(x=0,1,\dots,n\)这样的,那么只要让\(a_i\equivx\pmod{i}\)即可,也就是\(a_i=i+x\)。代码#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;voidsolve(){intn;cin>>n;fo......
  • 每日一题:https://codeforces.com/contest/1999/problem/D
    题目链接:https://codeforces.com/contest/1999/problem/D#include<iostream>#include<string>#include<vector>usingnamespacestd;intmain(){intn;cin>>n;for(;n>0;n--){stringarr1;stringarr2;......