专栏文章
P11830 [省选联考 2025] 幸运数字 题解
P11830题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mipxwda6
- 此快照首次捕获于
- 2025/12/03 19:44 3 个月前
- 此快照最后确认于
- 2025/12/03 19:44 3 个月前
这题从开始写到通过时间跨度有点大所以现在已经忘记怎么做的了(
反正只是卡了常就过了?
CPPconst ll N=2e5+10;
ll pren,n,siz,ans,l1[N],r1[N],l2[N],r2[N],pos[N*2],cnt[N*2],cur[N*2],le1[N*2],le2[N*2],gr1[N*2],gr2[N*2];
void input() {
// cin>>n;
n=read();
rep(i,1,n) {
// cin>>l1[i]>>r1[i]>>l2[i]>>r2[i];
l1[i]=read();
r1[i]=read();
l2[i]=read();
r2[i]=read();
pos[++siz]=l2[i];
pos[++siz]=r2[i]+1;
}
}
void disc() {
sort(pos+1,pos+siz+1);
siz=unique(pos+1,pos+siz+1)-pos-1;
// cout<<"pos[]:";
//
// rep(i,1,siz) cout<<pos[i]<<' ';
//
// endl;
// pause;
}
void cal() {
rep(i,1,n) {
ll l=lower_bound(pos+1,pos+siz+1,l2[i])-pos,r=lower_bound(pos+1,pos+siz+1,r2[i]+1)-pos;
// cout<<"l="<<l<<",r="<<r<<'\n';
// pause;
cur[l]+=r1[i];
cur[r]-=r1[i];
cnt[l]++;
cnt[r]--;
le1[r]+=l1[i];
le2[r]+=r1[i];
gr1[1]+=l1[i];
gr1[l]-=l1[i];
gr2[1]+=r1[i];
gr2[l]-=r1[i];
}
ll curs=0,les1=0,les2=0,grs1=0,grs2=0,cnts=0;
rep(i,1,siz-1) {
curs+=cur[i];
les1+=le1[i];
les2+=le2[i];
grs1+=gr1[i];
grs2+=gr2[i];
cnts+=cnt[i];
if(cnts>0 and max(les1-curs+1,grs1)<=min(les2+curs,grs2)) ans+=pos[i+1]-pos[i];
}
}
void ini() {
//ll n,siz,ans,l1[N],r1[N],l2[N],r2[N],pos[N*2],cnt[N*2],cur[N*2],le1[N*2],le2[N*2],gr1[N*2],gr2[N*2];
siz=ans=0;
// init(l1,0);
// init(r1,0);
// init(l2,0);
// init(r2,0);
// init(pos,0);
// init(cnt,0);
// init(cur,0);
// init(le1,0);
// init(le2,0);
// init(gr1,0);
// init(gr2,0);
rep(i,1,pren) l1[i]=l2[i]=r1[i]=r2[i]=0;//最后通过的关键
rep(i,1,2*N-1) pos[i]=cnt[i]=cur[i]=le1[i]=le2[i]=gr1[i]=gr2[i]=0;
}
int main() {
// sync_off;
ll testno=read(),Q=read();
// cin>>testno>>Q;
count(Q) {
ini();
input();
disc();
cal();
// cout<<ans<<'\n';
print(ans);
putchar('\n');
pren=n;
}
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...