TLE求助
查看原帖
TLE求助
819167
BsqJL楼主2022/10/24 21:08

只有暴力分。。。

#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define ls p*2
#define rs p*2+1
const int N=4e6+7;
int sum[N],a[N],mx[N],ans,smx,f[N];
void read(int &x)
{
    char ch=getchar();
    int r=0,w=1;
    while(!isdigit(ch))w=ch=='-'?-1:1,ch=getchar();
    while(isdigit(ch))r=(r<<3)+(r<<1)+(ch^48),ch=getchar();
    x=r*w;
}
void write(int x) {
    char ch[20];
    int len = 0;
    if (x < 0)putchar('-'), x = -x;
    while (x) {
        ch[len++] = (x % 10) ^ 48;
        x /= 10;
    }
    if(len==0)printf("0");
    while (len--)putchar(ch[len]);
    putchar('\n');
}
void update(int p)
{
    sum[p]=sum[ls]+sum[rs];
    mx[p]=max(mx[ls],mx[rs]);
}
void build(int p,int l,int r)
{
    if(l==r)
    {
        sum[p]=a[l];
        mx[p]=a[l];
        return;
    }
    int mid=(l+r)/2;
    build(ls,l,mid);
    build(rs,mid+1,r);
    update(p);
}
void query(int p,int l,int r,int x,int y)
{
    if(x<=l&&r<=y)
    {
        smx=max(smx,mx[p]);
        ans+=sum[p];
        return;
    }
    int mid=(l+r)/2;
    if(x<=mid)query(ls,l,mid,x,y);
    if(y>mid)query(rs,mid+1,r,x,y);
}
int lg(int x)
{
    int ans=0;
    while(x)
    {
        ans++;
        x/=2;
    }
    return ans;
}
void add(int p,int l,int r,int x)
{
    if(l==r)
    {
        int w=a[x];
        a[x]=lg(a[x]);
        sum[p]-=w-a[x];
        mx[p]=a[x];
        return;
    }
    int mid=(l+r)/2;
    if(x<=mid)add(ls,l,mid,x);
    else add(rs,mid+1,r,x);
    update(p);
}
main()
{
    int n,m;
    read(n);read(m);
    for(int i=1;i<=n;i++)
    read(a[i]);
    build(1,1,n);
    while(m--)
    {
        int x,y;ans=smx=0;
        read(x),read(y);
        query(1,1,n,1,n);
        if(smx>2)
        {
            for(int i=x;i<=y;i++)
            add(1,1,n,i);
        }
        ans=smx=0;
        query(1,1,n,1,n);
        write(ans);
    }
    return 0;
}
2022/10/24 21:08
加载中...