题目链接: https://ac.nowcoder.com/acm/contest/4462/H
思路
作为无脑型选手,上来看到这种区间题,不考虑复杂度(因为不会算QAQ),直接上来搓一发线段树,那结果超时是必然的!!!(后面才想到有个差分序列… 所以STL套一套 + 差分序列,求前缀和,就可以了
代码
#include <bits/stdc++.h>
using namespace std;
unordered_map<int, unordered_map<int, int> > mp;
void solve(unordered_map<int, int> &tmpa, unordered_map<int, int> &tmpb) {
for(auto i : tmpb) {
tmpa[i.first] += i.second;
if(tmpa[i.first] == 0){
tmpa.erase(i.first);
}
}
}
int main()
{
ios::sync_with_stdio(false);
int n, m;
cin >> n >> m;
mp.clear();
for(int i = 1; i <= m; i++){
int a, b, c;
cin >> a >> b >> c;
if(a > b) swap(a, b);
mp[a][c]++;
mp[b + 1][c]--;
}
int ans = -1, maxn = 0;
unordered_map<int, int> tmp;
tmp.clear();
int sum = 0;
for(int i = 1; i <= n; i++){
solve(tmp, mp[i]);
int k = tmp.size();
if(k > maxn) {
maxn = k;
ans = i;
}
}
cout << ans << endl;
return 0;
}