卡常TLE?
查看原帖
卡常TLE?
392816
小小蒲公英楼主2023/7/5 09:15

从一道相似题来的,不知为何TLE

#include<iostream>
#include<math.h>
#include<stdio.h>
using namespace std;
const int maxn = 1e5+10;
struct tree
{
    int l,r,tag;
    long long sum;
}t[4*maxn];
long long line[maxn];
inline int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}
inline void pushup(int n)
{
    t[n].sum = t[n*2].sum + t[n*2+1].sum;
    if(t[n*2].tag && t[n*2+1].tag) t[n].tag = 1;
    else t[n].tag = 0;
    return ;
}
inline int len(int n)
{
    return t[n].r - t[n].l + 1;
}
void build(int n,int l,int r)
{
    t[n].l = l;
    t[n].r = r;
    if(l == r)
    {
        t[n].sum = line[l];
        if(line[l] == 0 || line[l] == 1) t[n].tag = 1;
        else t[n].tag = 0;
        return ;
    }
    int mid = (l + r) / 2;//midÊôÓÚ×óº¢×Ó
    build(n*2,l,mid);
    build(n*2+1,mid+1,r);
    pushup(n);
    return ;
}
void modify(int n,int l,int r)
{
//    cout<<"fdsafdasfdsa:            "<<n<<' '<<l<<' '<<r<<' '<<t[n].l<<' '<<t[n].r<<endl;
    if(t[n].l == t[n].r)
    {
        t[n].sum = sqrt(t[n].sum);
//        cout<<t[n].sum <<endl;
        if(t[n].sum == 0 || t[n].sum == 1) t[n].tag = 1;
        return ;
    }
    long long mid = (t[n].l + t[n].r)/2;
    if(l <= mid && !t[n*2].tag)
    {
        modify(n*2,l,mid);
    }
    if(mid < r && !t[n*2+1].tag)
    {
        modify(n*2+1,mid+1,r);
    }
    pushup(n);
    return ;
}
long long query(int n,int l,int r)
{
    if(t[n].l == l && t[n].r == r)
    {
        return t[n].sum;
    }
    long long mid = (t[n].l+t[n].r)/2;
    if(r <= mid)
    {
        return query(n*2,l,r);
    }
    else if(mid < l)
    {
        return query(n*2+1,l,r);
    }
    else
    {
        return query(n*2,l,mid) + query(n*2+1,mid+1,r);
    }
}
int main()
{
    int cnt = 1;
    int n,m;
    while(scanf("%d",&n) != EOF){
        printf("Case #%d:\n",cnt);
        cnt++;
        for(int i=1;i<=n;i++)
        {
            line[i]=read();
        }
        build(1,1,n);
        m=read();
        long long a,b,c;
        for(long long i=1;i<=m;i++)
        {
            a=read();
            b=read();
            c=read();
            if(b > c) swap(b,c);
            if(a == 0)
            {
                modify(1,b,c);
            }
            else
            {
                printf("%d\n",query(1,b,c));
            }
        }
        puts("");
    }
    return 0;
}

2023/7/5 09:15
加载中...