2020.5.12 HL普转提模拟赛 总结

T1

看起来就很简单哇,读入的时候直接处理好每个要来几发会死,然后按位置排序,用两个指针一头一尾,然后每次把头干死,后面的用个差分嫖过去,复杂度O(n)。

	read(N),read(d),read(A);
	for(int i=1;i<=N;read(a[i].x),read(a[i].h),a[i].cs=a[i].h/A+(a[i].h%A?1:0),i++);
	sort(a+1,a+1+N,sort1);
	int head=1,tail=1;
	while(head<=N)
	{
		while(a[tail].x-a[head].x<=d*2 && tail<=N) tail++;
		tail--;
		a[head].cs+=c[head];
		ans+=a[head].cs;
		c[head]-=a[head].cs,c[tail+1]+=a[head].cs;
		for(;a[head].cs+c[head]<=0 && head<=N;c[head+1]+=c[head],head++);
	}
	printf("%lld\n",ans);

T2

我不知道我不知道,妈的要是棵树我用性价比给他贪,它必然有环我萎了,暴力怎么写哇

T3

样例都没过的算法,本来想着厕所就是智慧的发源地。

想着缩点,把一个列缩成一点,那这个点就有它的大小+1中情况,然而当a[i-1].x+a[i-1].d>a[i+1].x的时候,两种算法一多一少,我烦的慌,给他取了个平均值嘿嘿。

	read(n);
	for(int i=1;i<=n;read(b[i].x),read(b[i].d),i++);
	sort(b+1,b+1+n,sort1);
	a[++m]++;
	for(int i=2;i<=n;m+=(b[i].x>=b[i-1].x+b[i-1].d?1:0),a[m]++,i++);
	for(int i=1,mx=-1e9-1;i<=n;m+=(b[i].x>mx?1:0),a1[m]++,mx=max(mx,b[i].x+b[i].d-1),i++);
	for(int i=1;i<=m;ans=(ans*(a[i]+1))%mo,ans1=(ans1*(a1[i]+1))%mo,i++);
//	printf("%lld %lld\n",ans,ans1);
	printf("%lld\n",((ans+ans1)/2)%mo);

T4

看那数据范围,出题的是人吗?我题面都给它删了!

留下评论

通过 WordPress.com 设计一个这样的站点
从这里开始