首页 > 编程语言 >题解/算法 {C. Goose Goose Duck}

题解/算法 {C. Goose Goose Duck}

时间:2024-05-28 17:58:59浏览次数:24  
标签:std lef 题解 Goose Heap Duck ind rig

题解/算法 {C. Goose Goose Duck}

@LINK: https://codeforces.com/gym/105184;

A[N]表示这N个人的区间;
比如答案是[a,b,c,d] 那么他一定满足: A[a].lef <= 0 <= A[a].rig, A[b].lef <= 1 <= A[b].rig, A[c].lef <= 2 <= A[c].rig, …

贪心;
对于最开头的人来说, 令集合S: 满足A[].lef <= 0的区间, 那么我们要选择一个 满足A[].rig >= 0前提下的 最小的A[].rig, 比如说S: [0,0] , [0,1], [0,2] 那么我们选择[0,0], 因为他们都可以放到当前位置 而[0,1], [0,2]他们的rig更大 意味着 后面的位置也可以选择他们 即他们的选择性更大, 我们在当前位置 选择一个选择性最小(即最差)的方案;
更一般的说, 对于当前位置ind (即此时[0,1,2,...,ind-1]这些位置 已经排列好了), 我们要选择一个区间 满足A[].lef <= ind <= A[].rig, 令集合S: 满足A[].lef <= ind的区间, 这些区间里 我们再根据A[].rig从小到大排序 选择一个满足A[].rig >= ind且最小的A[].rig;

注意, 假设说 当前ind位置无解, 那么此时必须break终止流程, 因为位置是连续的 我们规定了ind是表示 [0...,ind-1]位置上都有人 才可以;

注意, 题目没保证lef <= rig, 因此我们假设是存在这样的数据的; 不过 因为我们会判断while( A[].rig < ind){ Heap.pop();} 因此这样情况 不会影响原算法;

void ___Solve_oneTest(){
    int N; cin>> N;
    vector< std::array< int, 3> > A(N);
    FOR_( i, 0, N-1){
        cin>> A[i][0]>> A[i][1];
        A[i][2] = i+1;
    }
    std::sort( A.begin(), A.end());
    using Item_ = std::pair<int,int>;
    std::priority_queue< Item_, std::vector<Item_>, std::greater<> > Heap;
    std::vector<int> ANS;
    int ind = 0;
    FOR_( i, 0, N-1){
        while( ind<N && A[ind][0]<=i){
            Heap.push( {A[ind][1], A[ind][2]});
            ++ ind;
        }
        while( Heap.size() > 0){
            if( Heap.top().first < i){ Heap.pop();}
            else{ break;}
        }
        if( Heap.size() != 0){
            ANS.emplace_back( Heap.top().second);
            Heap.pop();
        }
        else{
            break;
        }
    }
    cout<< ANS.size()<< "\n";
    for( auto i : ANS){
        cout<< i<< " ";
    }
}

标签:std,lef,题解,Goose,Heap,Duck,ind,rig
From: https://blog.csdn.net/qq_66485519/article/details/139271082

相关文章

  • 题解/算法 {J - Iris‘ Food}
    题解/算法{J-Iris’Food}@LINK:https://codeforces.com/gym/105184;比如最终答案是:10...01...12...23...3,则其值为1*10^?+(1...1)*10^?+(2...2)*10^?...;因此,如何求2....2这个值(长度为1e9),使用矩阵优化DP,DP定义为:DP[i]:长度为i的2...2的大......
  • 【问题解答】渲染农场的 10 个常见问题,助您轻松上手
    渲染农场是3D动画和效果图设计领域的强大工具。它们提供使复杂场景和动画所需的计算能力。在本文中,小编将解答有关渲染农场的10个常见问题,为初学者和经验丰富的专业人士提供见解和指导。1.渲染农场值得吗?渲染农场有多种益处,尤其是在提高3D项目的效率和节约成本方面。这里以......
  • MySQL常见问题解答:初学者常遇到的疑惑与解决方案
    MySQL是一种常用的关系型数据库管理系统,用于存储和管理大量的数据。对于初学者来说,可能会遇到一些问题和困惑。下面是一些常见问题的解答和解决方案:1.安装和配置MySQL您可以按照以下步骤进行操作:1.1下载MySQL安装包:您可以从MySQL官方网站MySQL::下载MySQL社区服务......
  • [博客迁移20190713]题解 P4169 【[Violet]天使玩偶/SJY摆棋子】
    《算法竞赛》书上例题(可惜原书没代码)天使玩偶,一道好题。(书p243)我就来谈谈自己的想法吧!而总有人在这种明明可以离线处理的三维偏序问题上投机取巧。如:KDtree。蒟蒻想说,KDtree在这题复杂度是不对的。虽有剪枝,可是还是有可能遍历整棵树的(期望复杂度不靠谱)对上述看法有争议的,请跳......
  • QT | 文件读写过程中丢失的 OD OA 问题解决
    今天发现QT以文本方式(QIODevice::Text)写入二进制0x0A会出现问题,写入的是一个字节(实际应该是两个字节),结果在Zed上看,显示是2个字节。明显每个0x0A前都多了个0x0D,导致我的bin文件全部都错位了期望的效果应该是原来按照字节流的形式输出文本时,ofstream会自动将输......
  • Codeforces Round 927 (Div. 3) D. Card Game 题解 贪心
    CardGame题目描述Twoplayersareplayinganonlinecardgame.Thegameisplayedusinga32-carddeck.Eachcardhasasuitandarank.Therearefoursuits:clubs,diamonds,hearts,andspades.Wewillencodethemwithcharacters‘C’,‘D’,‘H’,......
  • 题解:CF1975G Zimpha Fan Club
    \(\text{Link}\)题意给你两个长度分别为\(n,m\)的字符串\(s,t\),其中仅包含小写字母、-和*,你需要将-替换为任意小写字母,*替换为任意小写字母构成的字符串(可以为空串),问是否可以使得\(s'=t'\)。\(n,m\le2\times10^6\),12s。思路首先我们有工具:NTT优化带通配符的字符......
  • 2024 CCPC 全国邀请赛(山东)暨山东省大学生程序设计竞赛题解 A C F I K
    超时就是AC队第一次打ccpc比较菜蒟蒻只能做五题ProblemA.打印机算法:二分思路:二分时间每次check查看当前时间内所有打印机可以打印的个数是否符合条件注意二分的右边界为2e18ProblemC.多彩的线段2算法:组合数思路:将所有线段按照起点从左到右排序枚举线段每次将当......
  • Codeforces Round #947 题解 (A~G)
    目录A.BazokaandMocha'sArrayB.378QAQandMocha'sArrayC.ChamoandMocha'sArrayD.PainttheTreeE.ChainQueriesF.SetG.ZimphaFanClubA.BazokaandMocha'sArray枚举每个循环移位判断.B.378QAQandMocha'sArray首先最小的数肯定得选,删掉最小的数的倍数......
  • 【leetcode 399 周赛】【题解】
    第一题和第三题一样。就是求约数第二题就是模拟第4题使用线段树1,3题代码实际上发现没有下面代码的负载,比如:a*b=n,枚举a就好,a在[1,sqrt(n)内。importjava.util.*;classSolution{publicintnumberOfPairs(int[]nums1,int[]nums2,intk){......