// Written by da_ke
// Website: https://mahaoming2022.github.io
#include <bits/stdc++.h>
#define i64 long long
#define rep(i,l,r) for(int i=(l);i<=(r);i++)
#define fdn(i,r,l) for(int i=(r);i>=(l);i--)
#define pii pair<int,int>
using namespace std;
typedef long long ll;
typedef double db;
typedef __int128 i128;
int n,m;
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.in","r",stdin);
freopen("out.out","w",stdout);
#endif
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
cin>>n>>m;
vector<vector<int> > inv(m+1);
vector<int> cnt(n+1);
rep(i,1,n)
{
int a,b;
cin>>a>>b;
inv[a].push_back(i);
inv[b].push_back(i);
}
int l=1,r=1;
int k=n;
vector<ll> sum(m+3); // 差分,注意开空间
while(l<=m)
{
while(r<=m&&k!=0)
{
for(auto i:inv[r])
{
if(cnt[i]==0) k--; // 如果没被占用。
cnt[i]++; // 占用。
}
r++;
}
if(k!=0) break; // 这玩意儿根本搞不起来,因为 r 到 m 了都不行,l 到后面更不行。
sum[l-r]++,sum[m-l+2]--;
// 这里相当于将 [l-r+1,m-l+1] 这个区间全部 +1,其实也可以用线段树等数据结构,但是难写。
for(auto i:inv[l])
{
cnt[i]--;
if(cnt[i]==0) k++;
} // 还原,就是将 l 右移,故需做还原操作。
l++;
}
sum[0]=0;
rep(i,1,m)
{
sum[i]+=sum[i-1];
cout<<sum[i]<<' ';
}
}
// hope to debug successfully
#include <iostream>
#include <vector>
using namespace std;
int main() {
int N, M;
cin >> N >> M;
vector<int> A(N), B(N);
for (int i = 0; i < N; i++) cin >> A[i] >> B[i];
vector<vector<int>> inv(M + 1);
for (int i = 0; i < N; i++) {
inv[A[i]].push_back(i);
inv[B[i]].push_back(i);
}
vector<int> cnt(N), ans(M + 3);
int cnt_zero = N;
for (int i = 1, j = 1; i <= M;) {
while (j <= M and cnt_zero != 0) {
for (auto& x : inv[j]) {
if (cnt[x] == 0) cnt_zero--;
cnt[x]++;
}
j++;
}
if (cnt_zero != 0) break;
ans[j - i]++, ans[M + 1 - i + 1]--;
for (auto& x : inv[i]) {
cnt[x]--;
if (cnt[x] == 0) cnt_zero++;
}
i++;
}
for (int i = 1; i <= M; i++) {
ans[i] += ans[i - 1];
cout << ans[i] << " \n"[i == M];
}
}
两份代码相似度极高!但是前一份连样例都没过!