【Codeforces - 1000C】Covered Points Count(思维,离散化,差分)
題干:
You are given?nn?segments on a coordinate line; each endpoint of every segment has integer coordinates. Some segments can degenerate to points. Segments can intersect with each other, be nested in each other or even coincide.
Your task is the following: for every?k∈[1..n]k∈[1..n], calculate the number of points with integer coordinates such that the number of segments that cover these points equals?kk. A segment with endpoints?lili?and?riri?covers point?xx?if and only if?li≤x≤rili≤x≤ri.
Input
The first line of the input contains one integer?nn?(1≤n≤2?1051≤n≤2?105) — the number of segments.
The next?nn?lines contain segments. The?ii-th line contains a pair of integers?li,rili,ri?(0≤li≤ri≤10180≤li≤ri≤1018) — the endpoints of the?ii-th segment.
Output
Print?nn?space separated integers?cnt1,cnt2,…,cntncnt1,cnt2,…,cntn, where?cnticnti?is equal to the number of points such that the number of segments that cover these points equals to?ii.
Examples
input
Copy
3 0 3 1 3 3 8output
Copy
6 2 1input
Copy
3 1 3 2 4 5 7output
Copy
5 2 0Note
The picture describing the first example:
Points with coordinates?[0,4,5,6,7,8][0,4,5,6,7,8]?are covered by one segment, points?[1,2][1,2]?are covered by two segments and point?[3][3]?is covered by three segments.
The picture describing the second example:
Points?[1,4,5,6,7][1,4,5,6,7]?are covered by one segment, points?[2,3][2,3]?are covered by two segments and there are no points covered by three segments.
?
題目大意:
給定n個區(qū)間線段,要求輸出n個數(shù),其中第i個數(shù)代表:被i個線段覆蓋的點的個數(shù)。
解題報告:
離散化差分,跟2019icpc上海網(wǎng)絡(luò)賽那題一樣的套路。
AC代碼:
#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<map> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #define FF first #define SS second #define ll long long #define pb push_back #define pm make_pair using namespace std; typedef pair<ll,ll> PLL; const int MAX = 2e5 + 5; map<ll,int> mp; int n; ll l,r; ll ans[MAX];//下標(biāo)表示覆蓋次數(shù) int main() {cin>>n;for(int i = 1; i<=n; i++) cin>>l>>r,mp[l]++,mp[r+1]--;ll pre = -1,sum=0;for(auto it = mp.begin(); it != mp.end(); ++it) {ans[sum] += it->FF - pre;sum += it->SS; pre = it->FF; }for(int i = 1; i<=n; i++) {printf("%lld%c",ans[i],i == n ?'\n' :' ');}return 0 ; }?
總結(jié)
以上是生活随笔為你收集整理的【Codeforces - 1000C】Covered Points Count(思维,离散化,差分)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 突然吐字不清_要注意说话吐字不清小心是脑
- 下一篇: 计算机作文叙事,电脑争夺战叙事作文