赛场上写的这个代码,stack<pair<int, int>> violation 肯定是没法要了,但是不知道怎么写这玩意的贪心()
In case you don't recognize the problem: P11232 我的提交记录
有潜力 80pts 结果 WA 了 5 个,求调()
#include<bits/stdc++.h>
#define WYSI 727
using namespace std;
int tasks;
int cars,stests,length,slimit;
int boomed=0,turnoff=0;
int posit[100000+WYSI];
int inpoint[100000+WYSI],velo[100000+WYSI],accel[100000+WYSI];
int stst=9999999,sted=0;
typedef pair<int,int> pii;
stack<pii> violation;
struct limitBall{
int mstart,mend;
} lb[100000+WYSI];
double round(double x,double precis){
long long k=x/precis;
double l=x-k*precis;
if(l>=precis/2)return (k+1)*precis;
return k*precis;
}
int nextStop(int poss){
if(poss<=posit[0])return 0;
int l=0,r=stests-1;
int m=(l+r)>>1;
int res;
while(l+1!=r){
if(poss<posit[m]){
if(posit[m-1]<=poss){
res=m;
if(poss==posit[m-1])res--;
break;
}
r=m;
m=(l+r)>>1;
}else if(posit[m]<poss){
if(poss<=posit[m+1]){
res=m+1;
break;
}
l=m;
m=(l+r)>>1;
}else{
res=m;
break;
}
}
return res;
}
int prevStop(int poss){
if(poss>posit[stests-1])return stests-1;
int l=0,r=stests-1;
int m=(l+r)>>1;
int res=999999;
while(l+1!=r){
if(poss<posit[m]){
if(posit[m-1]<=poss){
res=m-1;
break;
}
r=m;
m=(l+r)>>1;
}else if(posit[m]<poss){
if(poss<=posit[m+1]){
res=m;
if(poss==posit[m+1])res++;
break;
}
l=m;
m=(l+r)>>1;
}else{
res=m;
break;
}
}
if(res==999999)res=l;
return res;
}
int main(){
scanf("%d",&tasks);
for(int tt=0;tt<tasks;tt++){
scanf("%d%d%d%d",&cars,&stests,&length,&slimit);
boomed=0,turnoff=0;
stst=9999999,sted=0;
for(int i=0;i<cars;i++)scanf("%d%d%d",inpoint+i,velo+i,accel+i);
for(int i=0;i<stests;i++){
scanf("%d",posit+i);
if(posit[i]>sted)sted=posit[i];
if(posit[i]<stst)stst=posit[i];
}
sort(posit,posit+stests);
for(int i=0;i<cars;i++){
if(accel[i]>0){
double violatet=(double)(slimit-velo[i])/accel[i];
double violated;
if(violatet<=0) violated=inpoint[i];
else violated=velo[i]*violatet+0.5*accel[i]*violatet*violatet+inpoint[i];
if(violated<sted)boomed++;
if(violated<stst)violation.push({0,stests-1});
else violation.push({nextStop((int)round(violated,0.005)),stests-1});
}else if(accel[i]<0){
int naccel=-accel[i];
double safet=(double)(velo[i]-slimit)/naccel;
if(safet<=0) continue;
else{
double safed=velo[i]*safet-0.5*naccel*safet*safet+inpoint[i];
int vioed=prevStop((int)round(safed,0.005));
int viost=nextStop(inpoint[i]);
if(viost<=vioed)boomed++,violation.push({viost,vioed});
}
}else{
if(velo[i]>slimit){
if(inpoint[i]<=sted){
boomed++;
if(inpoint[i]<=stst)violation.push({0,stests-1});
else violation.push({nextStop(inpoint[i]),stests-1});
}
}
}
}
//p
if(boomed==0)cout<<"0 "<<stests<<endl;
else{
turnoff=1;
int ptrr=0;
lb[0]={0,stests-1};
while(!violation.empty()){
int ff=violation.top().first,tt=violation.top().second;
int fff=max(lb[ptrr].mstart,ff),ttt=min(lb[ptrr].mend,tt);
if(fff>ttt){
bool anew=true;
for(int i=0;i<turnoff;i++){
if(i==ptrr)continue;
int fff=max(lb[i].mstart,ff),ttt=min(lb[i].mend,tt);
if(fff>ttt) continue;
else{
anew=false;
ptrr=i;
lb[ptrr]={fff,ttt};
break;
}
}
if(anew){
ptrr=turnoff;
lb[turnoff++]={ff,tt};
}
}else lb[ptrr]={fff,ttt};
violation.pop();
}
turnoff=stests-turnoff;
cout<<boomed<<" "<<turnoff<<endl;
}
}
return 0;
}