求调
查看原帖
求调
537046
大眼仔Happy楼主2024/1/25 22:07

代码对考场(记忆中)代码进行了一些修改,和一些题解的代码很相似,但是考场上获得了 80pts,这里只有 20pts,求调 qwq。

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
#define ll long long
ll inline read()
{
    ll num=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='0')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){num=(num<<3)+(num<<1)+(ch^48);ch=getchar();}
    return num*f;
}
int n,ans;ll E;
ll a[N],b[N],d[N],s[N],p[N],sd[N];
struct STable
{
    ll st[22][N];
    void build()
    {
        for(int i=1;i<=n;i++)st[0][i]=p[i];
        for(int i=1;(1<<i)<=n;i++)
        	for(int j=1;j+(1<<i)-1<=n;j++)
        		st[i][j]=min(st[i-1][j],st[i-1][j+(1<<i-1)]);
    }
    ll ask(int l,int r)
    {
        int t=__lg(r-l+1);
        return min(st[t][l],st[t][r-(1<<t)+1]);
    }
}ST;
#define lb (x&-x)
struct BIT
{
    int t[N];
    void add(int x,int v){while(x<=n)t[x]+=v,x+=lb;}
    int ask(int x){int res=0;while(x)res+=t[x],x-=lb;return res;}
}T;
ll c[N];
void discret(ll A[N])
{
	for(int i=0;i<=n;i++)c[i]=A[i];
	sort(c,c+1+n);
	int l=unique(c,c+1+n)-c;
	for(int i=0;i<=n;i++)A[i]=lower_bound(c,c+1+l,A[i])-c+1;
}
int main(){
    n=read();E=read();
    for(int i=1;i<=n;i++)a[i]=read();
    for(int i=1;i<=n;i++)b[i]=read();
    for(int i=1;i<=n;i++)
    {
        d[i]=min(0ll,b[i]-a[i]);
        s[i]=s[i-1]+b[i]-a[i];
        p[i]=-a[i]-d[i];
        sd[i]=sd[i-1]+d[i];
    }
    for(int i=0;i<=n;i++)printf("%lld ",s[i]);printf("\n\n");
    discret(s);ST.build(); // 注意 s[0] 也要离散化 
    for(int i=0;i<=n;i++)printf("%lld ",s[i]);printf("\n\n");
    for(int L=1,R=1;L<=n;L++)
    {
    	ll sum=sd[R]-sd[L-1],mn=ST.ask(L,R);
        while(R<=n)
        {
			if(sum+mn+E>=0)T.add(s[R++],1),sum+=d[R],mn=min(mn,p[R]);
			else break;
        }
        ans+=R-L-T.ask(s[L-1]-1);
        if(L==R)R++;else T.add(s[L],-1);
    }
    printf("%d",ans);
    return 0;
}
2024/1/25 22:07
加载中...