为啥快读不一样输出还不一样?
查看原帖
为啥快读不一样输出还不一样?
815710
double_wings楼主2023/10/9 11:55

虽然都是wa

普通快读

#include <bits/stdc++.h>
using namespace std;
using ll=long long;
using ull=unsigned long long;
#define mid ((l+r)>>1)
#define len (r-l+1)
#define ls p<<1
#define rs p<<1|1
#define int long long
constexpr int inf=1e9+7;
//constexpr ll inf=1e18+7;
constexpr int N=200005;
int n,m;
double a[N];
// int t[N<<2];
double laz[N<<2];
double sina[N<<2];
double cosa[N<<2];

void pushup(int p)
{
    // t[p]=t[ls]+t[rs];
    sina[p]=sina[ls]+sina[rs];
    cosa[p]=cosa[ls]+cosa[rs];
}

void pushdown(int p)
{
    if(laz[p])
    {
        laz[ls]+=laz[p];
        laz[rs]+=laz[p];
        // t[ls]+=laz[p]*(len-mid);
        // t[rs]+=laz[p]*mid;
        double x=sina[ls];
        double y=sina[rs];
        sina[ls]=cos(laz[p])*sina[ls]+sin(laz[p])*cosa[ls];
        sina[rs]=cos(laz[p])*sina[rs]+sin(laz[p])*cosa[rs];
        cosa[ls]=cos(laz[p])*cosa[ls]-sin(laz[p])*x;
        cosa[rs]=cos(laz[p])*cosa[rs]-sin(laz[p])*y;
        laz[p]=0;
    }
}

void build(int p,int l,int r)
{
    if(l==r)
    {
        // t[p]=a[l];
        sina[p]=sin(a[l]);
        cosa[p]=cos(a[l]);
        return;
    }
    build(ls,l,mid);
    build(rs,mid+1,r);
    pushup(p);
}

void update(int p,int l,int r,int ql,int qr,double x)
{
    if(ql<=l&&r<=qr)
    {
        double y=sina[p];
        sina[p]=cos(x)*sina[p]+sin(x)*cosa[p];
        cosa[p]=cos(x)*cosa[p]-sin(x)*y;
        return;
    }
    pushdown(p);
    if(ql<=mid) update(ls,l,mid,ql,qr,x);
    if(qr>mid) update(rs,mid+1,r,ql,qr,x);
    pushup(p);
}

double query(int p,int l,int r,int ql,int qr)
{
    double ans=0;
    if(ql<=l&&r<=qr)
    {
        return sina[p];
    }
    pushdown(p);
    if(ql<=mid) ans+=query(ls,l,mid,ql,qr);
    if(qr>mid) ans+=query(rs,mid+1,r,ql,qr);
    return ans;
}

ll read(){ll 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;}
signed main(){
    //freopen("in.in","r",stdin);
    //freopen("ot.out","w",stdout);
    cin.tie(0);
    cout.tie(0);
    n=read();
    for(int i=1;i<=n;++i)
    {
        a[i]=read();
    }
    build(1,1,n);
    m=read();
    while(m--)
    {
        int op=read(),l=read(),r=read();
        if(op==1)
        {
            double x;
            cin>>x;
            update(1,1,n,l,r,x);
        }
        else
        {
            printf("%.1lf\n",query(1,1,n,l,r));
        }
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}

超级快读

#include <bits/stdc++.h>
using namespace std;
using ll=long long;
using ull=unsigned long long;
#define mid ((l+r)>>1)
#define len (r-l+1)
#define ls p<<1
#define rs p<<1|1
#define int long long
constexpr int inf=1e9+7;
//constexpr ll inf=1e18+7;
constexpr int N=200005;
int n,m;
double a[N];
// int t[N<<2];
double laz[N<<2];
double sina[N<<2];
double cosa[N<<2];

void pushup(int p)
{
    // t[p]=t[ls]+t[rs];
    sina[p]=sina[ls]+sina[rs];
    cosa[p]=cosa[ls]+cosa[rs];
}

void pushdown(int p)
{
    if(laz[p])
    {
        laz[ls]+=laz[p];
        laz[rs]+=laz[p];
        // t[ls]+=laz[p]*(len-mid);
        // t[rs]+=laz[p]*mid;
        double x=sina[ls];
        double y=sina[rs];
        sina[ls]=cos(laz[p])*sina[ls]+sin(laz[p])*cosa[ls];
        sina[rs]=cos(laz[p])*sina[rs]+sin(laz[p])*cosa[rs];
        cosa[ls]=cos(laz[p])*cosa[ls]-sin(laz[p])*x;
        cosa[rs]=cos(laz[p])*cosa[rs]-sin(laz[p])*y;
        laz[p]=0;
    }
}

void build(int p,int l,int r)
{
    if(l==r)
    {
        // t[p]=a[l];
        sina[p]=sin(a[l]);
        cosa[p]=cos(a[l]);
        return;
    }
    build(ls,l,mid);
    build(rs,mid+1,r);
    pushup(p);
}

void update(int p,int l,int r,int ql,int qr,double x)
{
    if(ql<=l&&r<=qr)
    {
        double y=sina[p];
        sina[p]=cos(x)*sina[p]+sin(x)*cosa[p];
        cosa[p]=cos(x)*cosa[p]-sin(x)*y;
        return;
    }
    pushdown(p);
    if(ql<=mid) update(ls,l,mid,ql,qr,x);
    if(qr>mid) update(rs,mid+1,r,ql,qr,x);
    pushup(p);
}

double query(int p,int l,int r,int ql,int qr)
{
    double ans=0;
    if(ql<=l&&r<=qr)
    {
        return sina[p];
    }
    pushdown(p);
    if(ql<=mid) ans+=query(ls,l,mid,ql,qr);
    if(qr>mid) ans+=query(rs,mid+1,r,ql,qr);
    return ans;
}
char buf[1<<21],*p1,*p2;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
long long read(){long long res=0,f=1;char ch;for(ch=getchar();ch<'0'||ch>'9';ch=getchar())if(ch=='-') f=-1;for(;ch>='0'&&ch<='9';ch=getchar())res=(res<<3)+(res<<1)+ch-'0';return res*f;}
void wt(long long  x,char ch=0){if(x<0) putchar('-'),wt(-x);else{if(x>=10) wt(x/10);putchar(x%10+'0');}if(ch) putchar(ch);return;}

// ll read(){ll 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;}
signed main(){
    //freopen("in.in","r",stdin);
    //freopen("ot.out","w",stdout);
    cin.tie(0);
    cout.tie(0);
    n=read();
    for(int i=1;i<=n;++i)
    {
        a[i]=read();
    }
    build(1,1,n);
    m=read();
    while(m--)
    {
        int op=read(),l=read(),r=read();
        if(op==1)
        {
            double x;
            cin>>x;
            update(1,1,n,l,r,x);
        }
        else
        {
            printf("%.1lf\n",query(1,1,n,l,r));
        }
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}
2023/10/9 11:55
加载中...