专栏文章

P11830 [省选联考 2025] 幸运数字 题解

P11830题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mipxwda6
此快照首次捕获于
2025/12/03 19:44
3 个月前
此快照最后确认于
2025/12/03 19:44
3 个月前
查看原文
这题从开始写到通过时间跨度有点大所以现在已经忘记怎么做的了(
反正只是卡了常就过了?
CPP
const 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 条评论,欢迎与作者交流。

正在加载评论...