CF1034D Intervals of Intervals
应该是第一道 *3500
将端点化为线段,以便于处理
先考虑
如果固定
二分第
考虑到
考虑在二分前预处理出贡献。贡献形式为
进一步差分为
由于双指针的性质 ,
若将将
因此,可以按如下方法维护贡献:当
对于区间价值和,可以在
这样,复杂度降为
一些细节:贡献等于
#include <cstdio>
#include <algorithm>
#include <cctype>
#include <vector>
#include <set>
using namespace std;
char buf[1<<14],*p1=buf,*p2=buf;
#define GetC() ((p1==p2)&&(p2=(p1=buf)+fread(buf,1,1<<14,stdin),p1==p2)?EOF:*p1++)
struct Ios{}io;
template <typename _tp>
Ios &operator >>(Ios &in,_tp &x){
x=0;int w=0;char c=GetC();
for(;!isdigit(c);w|=c=='-',c=GetC());
for(;isdigit(c);x=x*10+(c^'0'),c=GetC());
if(w) x=-x;
return in;
}
const int N=3e5+5;
struct Interval{int l,r,lst;};
bool operator <(Interval a,Interval b){
if(a.l!=b.l) return a.l<b.l;
return a.r<b.r;
}
set<Interval> s;
using pii=pair<int,int>;
using ll=long long;
#define pb push_back
void split(int x){
if(x==0) return ;
auto pos=--s.upper_bound({x,(int)2e9,0});
if(pos->r==x) return ;
s.insert({pos->l,x,pos->lst});
s.insert({x+1,pos->r,pos->lst});
s.erase(pos);
}
vector<pii> tagL[N],tagR[N];
ll sum=0,cnt=0;
int n,k;
bool check(int mid){
sum=cnt=0;
ll cur=0,cur_sum=0;
for(int l=1,r=1;r<=n;++r){
for(auto tmp:tagR[r]){
if(tmp.first>l) break;
cur+=tmp.second;
cur_sum+=(ll)tmp.second*(l-tmp.first);
}
while(cur>=mid){
++l;cur_sum+=cur;
for(auto tmp:tagL[l]){
if(tmp.first>r) break;
cur+=tmp.second;
}
}
sum+=cur_sum;
cnt+=l-1;
}
return cnt>=k;
}
int main(){
io>>n>>k;
s.insert({1,(int)1e9,0});
for(int i=1;i<=n;++i){
int l,r;io>>l>>r;--r;
split(l-1),split(r);
while(1){
auto pos=s.lower_bound({l,0,0});
if(pos==s.end()||pos->l>r) break;
int lst=pos->lst,len=pos->r-pos->l+1;
tagL[lst+1].pb({i,len});
tagL[i+1].pb({i,-len});
tagR[i].pb({lst+1,len});
tagR[i].pb({i+1,-len});
s.erase(pos);
}
s.insert({l,r,i});
sort(tagR[i].begin(),tagR[i].end());
}
for(int i=1;i<=n;++i) sort(tagL[i].begin(),tagL[i].end());
int l=1,r=1e9;
while(l<=r){
int mid=(l+r)>>1;
if(check(mid)) l=mid+1;
else r=mid-1;
}
check(r);
printf("%lld\n",sum+(k-cnt)*r);
return 0;
}
分类:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】