社区讨论

80pts;WA on #9 #10;悬关求调QAQ

P11232[CSP-S 2024] 超速检测参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@m39no1sx
此快照首次捕获于
2024/11/09 12:18
去年
此快照最后确认于
2024/11/09 12:27
去年
查看原帖
被样例二的第11组数据hack了
该组数据:
IN
1
10 10 69458 227
41471 989 -41
54266 987 -6
65335 774 -29
5337 999 -10
60091 567 -12
52229 845 -42
4754 810 -5
6632 637 -2
46771 771 -375
52434 992 -79
9324 36862 44559 51022 52755 53293 60089 60120 63342 69458
应输出:9 7
实际输出: 9 6
求帮忙看下代码:
CPP
#include <bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
const int maxn=100010;
int BITst[maxn];
int T,n,m,l,v,p[maxn];
pii g[maxn];
//bool vis[maxn];
struct Car{
	int d,v,a;
}car[maxn];
bool Over_Limit(int i,int j){
	if (p[j]-car[i].d<0){
		return 0;
	}
	return car[i].v*car[i].v+2*car[i].a*(p[j]-car[i].d)>v*v;
}
int lowbit(int x){
	return x&(-x);
}
void add(int x){
	//cout<<x<<" hh\n";
	for (;x<=m;x+=lowbit(x)){
		BITst[x]++;
	}
	return;
}
int query(int x,int y){
	int cnt1=0,cnt2=0;
	//cout<<"x"<<x<<" y"<<y<<" ";
	x--;
	for (;x>0;x-=lowbit(x)){
		cnt1+=BITst[x];
	}
	for (;y>0;y-=lowbit(y)){
		cnt2+=BITst[y];
	}
	//cout<<cnt2<<" "<<cnt1<<endl;
	return cnt2-cnt1;
}
int findl(int i){
	int l=1,r=m;
	while (l<r){
		int mid=(l+r)>>1;
		if (Over_Limit(i,mid)){
			r=mid;
		}
		else{
			l=mid+1;
		}
	}
	if (!Over_Limit(i,l)) return -1;
	return l;
}
int findr(int i){
	int l=lower_bound(p+1,p+1+m,car[i].d)-p,r=m;
	if (l==r){
		if (!Over_Limit(i,l)) return -1;
		return l;
	}
	while (l<r){
		//cout<<"boom"<<l<<" "<<r<<endl;
		int mid=(l+r)>>1;
		if (Over_Limit(i,mid)){
			l=mid+1;
		}
		else{
			r=mid;
		}
	}
	if (l==1) return -1;
	l--;
	if (!Over_Limit(i,l)) return -1;
	return l;
}
bool cmp(pii a,pii b){
	if (a.second==b.second){
		return a.first>b.first;
	}
	return a.second<b.second;
}
void solve(){
	//memset(vis,0,sizeof(vis));
	memset(BITst,0,sizeof(BITst));
	int ans1=0;
	cin>>n>>m>>l>>v;
	for (int i=1;i<=n;i++){
		cin>>car[i].d>>car[i].v>>car[i].a;
	}
	for (int i=1;i<=m;i++){
		cin>>p[i];
	}
	//cout<<"step2";
	for (int i=1;i<=n;i++){
		if (car[i].a>=0){
			int tmp=findl(i);
			if (tmp==-1) g[i]={-1,-1};
			else{
				g[i]={tmp,m};
				ans1++;
			}
		}
		else{
			int tmp=findr(i);
			if (tmp==-1) g[i]={-1,-1};
			else{
				g[i]={lower_bound(p+1,p+1+m,car[i].d)-p,tmp};
				ans1++;
			}
			//cout<<"step3 "<<i<<endl;
		}
	}
	//cout<<"step1";
	/*
	for (int i=1;i<=n;i++){
		cout<<g[i].first<<" "<<g[i].second<<"\n";
	}
	*/
	sort(g+1,g+1+n,cmp);
	for (int i=1;i<=n;i++){
		/*
		bool flag3=0;
		for (int j=g[i].first;j<=g[i].second;j++){
			if (vis[j]){
				flag3=1;
				break;
			}
		}
		if (flag3){
			continue;
		}
		*/
		if (g[i].first==-1){
			continue;
		}
		if (query(g[i].first,g[i].second)){
			continue;
		}
		add(g[i].second);//vis[g[i].second]=1;
	}
	//
	/*
	int ans2=0;
	for (int i=1;i<=m;i++){
		if (vis[i]){
			ans2++;
		}
	}
	*/
	int ans2=query(1,m);
	cout<<ans1<<" "<<m-ans2<<endl;
	return;
}
int main(){
	//freopen("detect2.in","r",stdin);
	cin>>T;
	while (T--){
		solve();
	}
	return 0;
}
谢谢dalao!
验证码4488祭

回复

0 条回复,欢迎继续交流。

正在加载回复...