60pts求调(a>0数据写错,无超时)
查看原帖
60pts求调(a>0数据写错,无超时)
1112642
CCCCCCnM楼主2024/11/11 17:55

如题,被逆天±1紫菜了,蒟蒻求调

#include<bits/stdc++.h>
using namespace std;
struct pt{
	int lft,rgt;
	//lft:start considering as too fast;
	//rgt:stop considering as too fast(1000003 as +infinity);
	//considering (0,0) as never too fast;
} fst[100003],nd[100003];
bool cmp(pt cmp1,pt cmp2)
{
	return cmp1.lft<cmp2.lft||(cmp1.lft==cmp2.lft&&cmp1.rgt<cmp2.rgt);
}
int t,m,n,l,mxv,ans;
int mntr[1000006]; //monitor(s)
int main()
{
	//freopen("detect.in","r",stdin);
	//freopen("detect.out","w",stdout);
	scanf("%d",&t);
	for(int z = 1;z<=t;z++)
	{
		memset(fst,0,sizeof(fst));
		memset(mntr,0,sizeof(mntr));
		ans = 0;
		scanf("%d%d%d%d",&n,&m,&l,&mxv);
		for(int i = 1;i<=n;i++)
		{
			int d,v,a;
			scanf("%d%d%d",&d,&v,&a);
			if(v>mxv)  //calc the too-fast-place(st~ed)
			{
				fst[i].lft = d-1;
				if(a>=0)
				{
					fst[i].rgt = 1000003;
				}
				else
				{
					fst[i].rgt = d + (mxv*mxv-v*v+1)/(2*a);
				}
			}
			else
			{
				if(a<=0)
				{
					fst[i].lft = 0;
					fst[i].rgt = 0;
				}
				else
				{
					fst[i].rgt = 1000003;
					fst[i].lft = d + (mxv*mxv-v*v-1)/(2*a)+1;    //重点排查此行
				}
			}
		}
		int p;
		for(int i = 1;i<=m;i++)
		{
			scanf("%d",&p);
			++mntr[p];
		}
		for(int i = 1;i<=1000003;i++) mntr[i] += mntr[i-1];
		for(int i = 0;i<=n;i++)
		{
			int left = mntr[fst[i].lft];
			int right = mntr[fst[i].rgt];
			if(right!=left)
			{
				ans++;
				nd[ans].lft = left;
				nd[ans].rgt = right;
			}
		}
		printf("%d ",ans);
      
		sort(nd+1,nd+ans+1,cmp);
		int cnt = 1;
		for(int i = 2;i<=ans;i++)
		{
			if(nd[i-1].rgt-nd[i].lft<=0)
			{
				cnt++;
			}
			else
			{
				nd[i].rgt = min(nd[i].rgt,nd[i-1].rgt);
			}
		}
		if(ans==0) cnt = 0;
		printf("%d\n",m-cnt);
	}
	return 0;
}
/*
1
5 5 15 3
0 3 0
12 4 0
1 1 4
5 5 -2
6 4 -4
2 5 8 9 15
*/
2024/11/11 17:55
加载中...