Wa 83pts 求调
查看原帖
Wa 83pts 求调
1797699
___Snow___楼主2025/7/27 19:16

RT,Wa on test #2,#10

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10;
int n,m,cnt,last;
long double x[N],b[N];
int ans[N*4];
inline long double solve(int k,int cnt){return !k?-1e18:x[cnt]*k+b[cnt];}
void update(int p,int l,int r,int L,int R,int cnt){
    if(l==r){
        if(solve(l,cnt)>solve(l,ans[p])) ans[p]=cnt;
        return;
    }
    if(L<=l&&r<=R){
        if(solve(l,cnt)>solve(l,ans[p])&&solve(r,cnt)>solve(r,ans[p])){ans[p]=cnt;return;}
        if(solve(l,cnt)<=solve(l,ans[p])&&solve(r,cnt)<=solve(r,ans[p])) return;
        int mid=(l+r)/2;
        if(solve(l,cnt)>solve(l,ans[p])&&solve(mid,cnt)<=solve(mid,ans[p])) update(p*2,l,mid,L,R,cnt);
        else if(solve(l,cnt)<=solve(l,ans[p])&&solve(mid,cnt)>solve(mid,ans[p])) update(p*2,l,mid,L,R,ans[p]),ans[p]=cnt;
        else if(solve(r,cnt)<=solve(r,ans[p])&&solve(mid,cnt)>solve(mid,ans[p])) update(p*2+1,mid+1,r,L,R,ans[p]),ans[p]=cnt;
        else update(p*2+1,mid+1,r,L,R,cnt);
        return;
    }
    int mid=(l+r)/2;
    if(L<=mid) update(p*2,l,mid,L,R,cnt);
    if(R>mid) update(p*2+1,mid+1,r,L,R,cnt);
}
void query(int p,int l,int r,int k){
	if(solve(k,last)<solve(k,ans[p])||(solve(k,last)==solve(k,ans[p])&&last>ans[p])) last=ans[p];
    if(l==r) return ;
    int mid=(l+r)/2;
    if(k<=mid)  query(p*2,l,mid,k);
    else query(p*2+1,mid+1,r,k);
}
struct hill{int x1,y1,x2,y2,id,nt;} a[N];
bool cmp(hill x,hill y){return x.x1<y.x1;}
int lisan[N*2];
signed main(){
    scanf("%lld",&n);
    for(int i=1;i<=n;i++) scanf("%lld%lld%lld%lld",&a[i].x1,&a[i].y1,&a[i].x2,&a[i].y2),a[i].id=i,lisan[i*2-1]=a[i].x1,lisan[i*2]=a[i].x2;
    sort(lisan+1,lisan+n*2+1);
    m=n*2;
    for(int i=1;i<=n;i++) a[i].x1=lower_bound(lisan+1,lisan+m+1,a[i].x1)-lisan;
    for(int i=1;i<=n;i++) a[i].x2=lower_bound(lisan+1,lisan+m+1,a[i].x2)-lisan;
    
    sort(a+2,a+n+1,cmp);int l=1,cnt=1,k=1;
    for(int i=1;i<=n;i++){
        x[i]=1.0l*(a[i].y2-a[i].y1)/(a[i].x2-a[i].x1),b[i]=a[i].y1-x[i]*a[i].x1;
    }
    // for(int i=1;i<=10;i++) cout<<a[i].x1<<" "<<a[i].x2<<endl;
    while(k<=n){
        while(l<=n&&(a[l].x1<=a[k].x2)){
            if(a[l].x2<=a[k].x2||solve(a[k].x2,l)<=solve(a[k].x2,k))update(1,1,m,a[l].x1,a[l].x2-1,l);
             l++;
        }
         // cout<<k<<" "<<l<<endl;
        query(1,1,m,a[k].x2);k=last;last=0;
        // cout<<k<<endl;
        if(!k) break;
        cnt++;
    }
    printf("%lld\n",cnt);
    return 0;
}

这个代码在第二个点输出了 1。

2025/7/27 19:16
加载中...