分块WA50pts求助
查看原帖
分块WA50pts求助
766521
not_clever_syl楼主2023/9/20 11:12

rt,开O2 50pts 不开30pts

感觉写得没有问题。。

#include<iostream>
#include<vector>
#include<algorithm>
#include<math.h>
using namespace std;
#define MAXN 100005
int n,m;
int b,c;
vector<int>B[330];
int l[330],r[330];
int id[MAXN];
double a[MAXN];
void upd(int x){
    auto&q=B[x];
    q.clear();
    for(int i=l[x];i<=r[x];++i){
    	if(a[i]==0)continue;
        if(q.empty()||q.back()<a[i])q.emplace_back(a[i]);
    }
}
signed main(){
    cin>>n>>m;
    b=ceil(sqrt(n));
    c=1+(n-1)/b;
    for(int i=1;i<=c;++i){
        l[i]=r[i-1]+1;
        r[i]=min(r[i-1]+b,n);
        for(int j=l[i];j<=r[i];++j){
            id[j]=i;
        }
    }
    int x,y,i,ans,mnid=n+1;
    double mn;
    while(m--){
        cin>>x>>y;
        a[x]=(double)y/x;
        mnid=min(mnid,x);
        upd(id[x]);
        mn=a[mnid];
        ans=1;
        for(i=1;i<=c;++i){
        	if(B[i].empty()||mn>B[i].back())continue;
            auto it=upper_bound(B[i].begin(),B[i].end(),mn);
            ans+=B[i].end()-it;
            mn=B[i].back();
        }
        cout<<ans<<'\n';
    }
}

2023/9/20 11:12
加载中...