D - Online games
题意:
给定
n
n
n 个区间,起点为
a
i
a_i
ai,长度为
b
i
b_i
bi,求被覆盖了
k
k
k 次的整数点的个数,
1
<
=
k
<
=
n
,
1
<
=
a
i
,
b
i
<
=
1
0
9
1<=k<=n,1<=a_i,b_i<=10^9
1<=k<=n,1<=ai,bi<=109
思路:
差分
用
v
e
c
t
o
r
vector
vector 存
p
a
i
r
pair
pair 排序后进行差分速度比较快
code:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 2e5 + 9;
int ans[maxn];
void work()
{
int n;cin >> n;
int a, b;
vector <pair<int,int> > v;
int cnt = 0;
for(int i = 1; i <= n; ++i)
{
cin >> a >> b;
v.push_back({a, 1});
v.push_back({a + b, -1});
}
sort(v.begin(), v.end());
for(int i = 0; i < v.size() - 1; ++i)
{
cnt += v[i].second;
ans[cnt] += (v[i + 1].first - v[i].first);
}
for(int i = 1; i <= n; ++i)
cout << ans[i] << " ";
}
int main()
{
ios::sync_with_stdio(0);
work();
return 0;
}
更一道一样的题,AcWing周赛
4195. 线段覆盖
题意:
给定
n
n
n 个区间,起点
l
l
l,终点
r
r
r,求被覆盖了
k
k
k 次的整数点有多少个,
1
<
=
k
<
=
n
,
1
<
=
l
,
r
<
=
1
0
18
1<=k<=n,1<=l,r<=10^{18}
1<=k<=n,1<=l,r<=1018
思路:
用
m
a
p
map
map 差分,速度比较慢
code:
#include<bits/stdc++.h>
#define endl '\n'
#define ll long long
#define ull unsigned long long
#define ld long double
#define all(x) x.begin(), x.end()
#define eps 1e-6
using namespace std;
const int maxn = 2e5 + 9;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
ll n, m;
map <ll, int> ma;
ll ans[maxn];// 开 ll
void work()
{
cin >> n;
for(int i = 1; i <= n; ++i)
{
ll l, r;cin >> l >> r;
ma[l]++; ma[r + l]--;
}
ll sum = 0, last = -1;
for(auto [x, y] : ma)
{
if(last != -1) ans[sum] += x - last;
sum += y;
last = x;
}
for(int i = 1; i <= n; ++i) cout << ans[i] << " ";
}
int main()
{
ios::sync_with_stdio(0);
// int TT;cin>>TT;while(TT--)
work();
return 0;
}