• 牛客小白月赛22


    链接:https://ac.nowcoder.com/acm/contest/4462/H
    来源:牛客网

    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 262144K,其他语言524288K
    64bit IO Format: %lld 

    题目描述

    某电商平台有n个仓库,编号从1到n。
    当购进某种货物的时候,商家会把货物分散的放在编号相邻的几个仓库中。
    我们暂时不考虑售出,你是否能知道,当所有货物购买完毕,存放货物种类最多的仓库编号为多少?

    输入描述:

    在第一行中给出两个正整数n,m,1≤n,m≤105,分别代表仓库的数目和进货的次数。
    接下来 m 行,每行三个正整数l,r,d,1≤l,r≤n,1≤d≤109。编号在l和r之间的仓库收进编号为d的货物。

    输出描述:

    在一行中输出存放货物种类最多的仓库编号,若满足条件的仓库不止一个,则输出编号最小的那个。

    输入

    5 5
    1 1 1
    3 3 1
    2 5 2
    5 5 1
    4 5 1

    输出

    3

    区间种类和,比较明显的差分,线段树也能写

     1 #include <bits/stdc++.h>
     2 typedef long long LL;
     3 const int INF=0x3f3f3f3f;
     4 const double eps =1e-8;
     5 const int mod=1e9+7;
     6 const int maxn=1e5+10;
     7 using namespace std;
     8 
     9 vector<int> st[maxn], ed[maxn];
    10 map<int,int> mp;
    11 
    12 int main()
    13 {
    14     #ifdef DEBUG
    15     freopen("sample.txt","r",stdin);
    16     #endif
    17     
    18     int n,m;
    19     scanf("%d %d",&n,&m);
    20     for(int i=1;i<=m;i++)
    21     {
    22         int l,r,d;
    23         scanf("%d %d %d",&l,&r,&d);
    24         st[l].push_back(d);
    25         ed[r + 1].push_back(d);
    26     }
    27     int id;
    28     int MAX = 0;
    29     int num = 0;
    30     for(int i=1;i<=n;i++)
    31     {
    32         for(auto it : st[i])
    33         {
    34             if(mp[it]==0) num++;
    35             mp[it]++;
    36         }    
    37         for(auto it : ed[i])
    38         {
    39             mp[it]--;
    40             if(mp[it]==0) num--;
    41         }
    42         if(MAX < num)
    43         {
    44             MAX=num;
    45             id=i;
    46         }
    47     }
    48     printf("%d
    ",id);
    49     
    50     return 0;
    51 }

    另一种写法:

     1 #include <bits/stdc++.h>
     2 typedef long long LL;
     3 const int INF=0x3f3f3f3f;
     4 const double eps =1e-8;
     5 const int mod=1e9+7;
     6 const int maxn=1e5+10;
     7 using namespace std;
     8 
     9 vector<pair<int,int> > vt[maxn];
    10 set<int> st;
    11 multiset<int> sst;
    12 
    13 int main()
    14 {
    15     #ifdef DEBUG
    16     freopen("sample.txt","r",stdin);
    17     #endif
    18     
    19     int n,m;
    20     scanf("%d %d",&n,&m);
    21     for(int i=1;i<=m;i++)
    22     {
    23         int l,r,d;
    24         scanf("%d %d %d",&l,&r,&d);
    25         vt[l].push_back({1,d});
    26         vt[r+1].push_back({-1,d});
    27     }
    28     int id;
    29     int MAX = 0;
    30     for(int i=1;i<=n;i++)
    31     {
    32         for(auto it : vt[i])
    33         {
    34             int op=it.first;
    35             int d=it.second;
    36             if(op==1)
    37             {
    38                 st.insert(d);
    39                 sst.insert(d);
    40             }
    41             else if(op==-1)
    42             {
    43                 sst.erase(sst.find(d));
    44                 if(sst.find(d)==sst.end()) st.erase(d);
    45             }
    46         }
    47         if(MAX < st.size())
    48         {
    49             MAX=st.size();
    50             id=i;
    51         }
    52     }
    53     printf("%d
    ",id);
    54     
    55     return 0;
    56 }

    -

  • 相关阅读:
    Stanford NLP 课程笔记之计算字符串距离
    Stanford NLP 课堂笔记之正则表达式
    最长回文子串
    java面向对象
    java中数组的定义
    AtCoder Beginner Contest 100 C(思维)
    Codeforces 1000B Light It Up(思维)
    jq的链式调用.end();
    解决css中display:inline-block的兼容问题
    解决css中display:inline-block产生的空隙问题
  • 原文地址:https://www.cnblogs.com/jiamian/p/12556532.html
Copyright © 2020-2023  润新知