zoukankan      html  css  js  c++  java
  • dream(2018.10.17)

    一句话题意:讲什么题意啊,见usaco2017feb silver的T1,一模一样,就是牛和鸡的读入顺序反过来了一下,数据范围大了10倍,卡掉了(O(n^2))的算法。
    数据范围:
    对于 30%的数据,n<=10,m<=10;
    对于 50%的数据,n<=100,m<=100;
    对于 70%的数据,n<=2000,m<=2000;
    对于 100%的数据,n<=200,000,m<=200,000,1<=li,ri<=1,000,000,000,1<=ti<=1,000,000,000,保证li<=ri。
    30分做法:我实在是不知道怎么能拿30分,据题解说:大概是 (O(n!)) 的暴力dfs,然后 (O(n)) 检验方案合法性,时间复杂度 (O(n*n!))
    50分做法:我觉得这个做法真的是神了,可以发现这是一个二分图,建出二分图拿匈牙利算法跑一边最大匹配就行了,时间复杂度 (O(n^3))
    70分做法:这个才应该是正常情况下应该拿的分吧,直接将牛和鸡排序贪心即可,这个是经典贪心了,正确性就很显然了吧,时间复杂度 (O(n^2))
    100分做法:我们可以发现70分做法有一重枚举非常浪费,很多情况下都是多余的,所以就可以拿一个能 (O(logn)) 维护序列单调的数据结构来维护牛就好了吧,每次二分出第一个进入区间范围的牛,然后(ans++),删去那头牛即可,时间复杂度 (O(nlogn))
    代码:

    #include<cstdio>
    #include<algorithm>
    #include<set>
    using namespace std;
    int n,m,q,cow,ans;
    struct oo{int x,y;}s[200001];
    multiset<int>mp;
    multiset<int>::iterator it;
    bool cmp(oo a,oo b){return a.y<b.y;}
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)scanf("%d%d",&s[i].x,&s[i].y);
        for(int i=1;i<=n;i++)scanf("%d",&cow),mp.insert(cow);
        sort(s+1,s+m+1,cmp);
        for(int i=1;i<=m;i++)
        {
            it=mp.lower_bound(s[i].x);
            if((*it)>=s[i].x&&(*it)<=s[i].y)ans++,mp.erase(it);
        }
        printf("%d
    ",ans);
    }
    
  • 相关阅读:
    题解[LuoguP7419 「PMOI-2」参天大树]
    UVA11582 巨大的斐波那契数! Colossal Fibonacci Numbers!
    数学专题
    [计蒜客]dp
    [蓝桥杯每日一题]1.3 & 1.4
    【acm】2020icpc南京补题
    [acm]乐师师范学院校赛题解-2020
    西南交通大学峨眉校区第二届"INT"杯程序设计竞赛——决赛
    指针与结构体
    [acm] 动态规划——最长上升子序列
  • 原文地址:https://www.cnblogs.com/lcxer/p/9806925.html
Copyright © 2011-2022 走看看