题目链接:https://www.luogu.com.cn/problem/CF1000C
解决思路:
总体上是差分数组,但是可以知道r的上限太大了,我们不能开那么大的数组
解决思路是就记录端点即可,使用map记录
#include <iostream> #include <map> using namespace std; long long int cun[200010]; map<long long int, long long int>num; map<long long int, long long int>::iterator it; int main() { long long int n; long long int l, r; cin >> n; for (int i = 1; i <= n; i++) { cin >> l >> r; num[l]++; num[r + 1]--; }//以上和差分数组完全一致 long long int cnt = 0; it=num.begin(); long long int cmp = it->first; for ( it = num.begin(); it != num.end(); it++)//巧妙之处 {//cnt的计算和差分数组计算次数的方法一样 cun[cnt] += it->first-cmp;//能算出这个点距离上次出现的端点多远了 cmp = it->first; cnt += it->second; } for (int i = 1; i <= n; i++) { if (i != 1)cout << " "; cout << cun[i]; } return 0; }
原文:https://www.cnblogs.com/Knightero/p/12961053.html