zoukankan      html  css  js  c++  java
  • BZOJ1645 [Usaco2007 Open]City Horizon 城市地平线

    本来想打线段树的说。。。

    就是把坐标离散化了,然后区间最大求和即可。。。

    后来觉得有点烦的说(silver题就要线段树。。。),于是看了下usaco的题解,发现了个高端的东西:善用STL里的容器和迭代器就可以了。

    以下就是高端程序:

     1 /**************************************************************
     2     Problem: 1645
     3     User: rausen
     4     Language: C++
     5     Result: Accepted
     6     Time:264 ms
     7     Memory:6120 kb
     8 ****************************************************************/
     9  
    10 #include <cstdio>
    11 #include <vector>
    12 #include <utility>
    13 #include <map>
    14 #include <set>
    15 #include <algorithm>
    16  
    17 using namespace std;
    18 typedef pair<int, int> PAIR;
    19 typedef long long ll;
    20  
    21 map<int, vector<PAIR> > M;
    22 map<int, vector<PAIR> > ::iterator now;
    23 vector <PAIR> ::iterator I;
    24 multiset <int, greater<int> > S;
    25 ll ans;
    26 int n, L, R, H, K;
    27  
    28 inline int read(int &x){
    29     int sgn = 1; x = 0;
    30     char ch = getchar();
    31     while (ch < '0' || ch > '9'){
    32         if (ch == '-') sgn = -1;
    33         ch = getchar();
    34     }
    35     while (ch >= '0' && ch <= '9'){
    36         x = x * 10 + ch - '0';
    37         ch = getchar();
    38     }
    39     x *= sgn;
    40 }
    41  
    42 int main(){
    43     read(n);
    44     for (int i = 1; i <= n; ++i){
    45         read(L), read(R), read(H);
    46         M[L].push_back(make_pair(H, 1));
    47         M[R].push_back(make_pair(H, 0));
    48     }
    49     L = 0;
    50     for (now = M.begin(); now != M.end(); ++now){
    51         R = now -> first;
    52         if (!S.empty()) ans += (ll) (R - L) * (*S.begin());
    53         L = R;
    54         for (I = (now -> second).begin(); I != (now -> second).end(); ++I){
    55             K = I -> first;
    56             if (I -> second) S.insert(K);
    57             else S.erase(S.find(K));
    58         }
    59     }
    60     printf("%lld
    ", ans);
    61     return 0;
    62 }
    View Code

     (反正蒟蒻自己是不会写的。。。真是太神了!!!)

    By Xs酱~ 转载请说明 博客地址:http://www.cnblogs.com/rausen
  • 相关阅读:
    网站初学笔记1
    如何在新项目中使用曾经创建的用户控件
    C#用户控件的一些尝试
    MVC的含义
    Chrome浏览器面板基础了解
    VScode快捷键
    Windows中的键盘快捷方式
    node.js状态码
    JavaScript小结
    Truncate a string
  • 原文地址:https://www.cnblogs.com/rausen/p/4040466.html
Copyright © 2011-2022 走看看