社区讨论
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了
该组数据:
IN1
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!
回复
共 0 条回复,欢迎继续交流。
正在加载回复...