线段树全 WA 求助
查看原帖
线段树全 WA 求助
407417
HerikoDeltana楼主2021/8/7 23:36

查了一晚上了不知道哪里手欠出错了(

马蜂较为奇怪请各位大佬见谅。

#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <cstring>
#define lc(x) (x<<1)
#define rc(x) (x<<1|1)
#define Heriko return
#define Deltana 0
#define Romanno 1
#define S signed
#define LL long long
#define R register
#define I inline
#define CI const int
#define mst(a, b) memset(a, b, sizeof(a))
#define ON std::ios::sync_with_stdio(false);cin.tie(0)
using namespace std;

template<typename J>
I void fr(J &x)
{
    short f(1);
    char c=getchar();
    x=0;
    while(c<'0' or c>'9')
    {
        if(c=='-') f=-1;
        c=getchar();
    }
    while (c>='0' and c<='9') 
    {
        x=(x<<3)+(x<<1)+c-'0';
        c=getchar();
    }
    x*=f;
}

CI MXX=2e5+5;

double sv,cv;

struct SegTree
{
    double s[MXX<<2],c[MXX<<2];
    LL tag[MXX<<2];

    I void Pushsc(int x,double sx,double cx)
    {
        s[x]=s[x]*cx+c[x]*sx;
        c[x]=c[x]*cx-s[x]*sx;
    }

    I void Pushup(int x)
    {
        s[x]=s[lc(x)]+s[rc(x)];
        c[x]=c[lc(x)]+c[rc(x)];
    }

    I void Pushdown(int x) 
    {
        if(!tag[x]) Heriko;
        double sx=sin(tag[x]),cx=cos(tag[x]);
        Pushsc(lc(x),sx,cx);
        Pushsc(rc(x),sx,cx);
        tag[lc(x)]+=tag[x];
        tag[rc(x)]+=tag[x];
        tag[x]=0;
    }

    void Build(int x,int l,int r)
    {
        if(l==r)
        {
            int a;fr(a);
            s[x]=sin(a),c[x]=cos(a);
            Heriko;
        }
        int mid=(l+r)>>1;
        Build(lc(x),l,mid);
        Build(rc(x),mid+1,r);
        Pushup(x);
    }

    void Modify(int x,int l,int r,int sl,int sr,int v)
    {
        if(sl<=l and r<=sr)
        {
            Pushsc(x,sv,cv);
            tag[x]+=v;
            Heriko;
        }
        Pushdown(x);
        int mid=(l+r)>>1;
        if(sl<=mid) Modify(lc(x),l,mid,sl,sr,v);
        if(sr>mid) Modify(rc(x),mid+1,r,sl,sr,v);
        Pushup(x);
    }

    double Query(int x,int l,int r,int sl,int sr)
    {
        if(sl<=l and r<=sr) Heriko s[x];
        Pushdown(x);
        double res=0.00;
        int mid=(l+r)>>1;
        if(sl<=mid) res+=Query(lc(x),l,mid,sl,sr);
        if(sr>mid) res+=Query(rc(x),mid+1,r,sl,sr);
        Heriko res;
    }
}

SegmentTree;

int n,m,opt,x,y,z;

S main()
{
    fr(n);
    SegmentTree.Build(1,1,n);
    fr(m);
    while(m--)
    {
        fr(opt),fr(x),fr(y);
        if(opt==1)
        {
            fr(z);
            sv=sin(z),cv=cos(z);
            SegmentTree.Modify(1,1,n,x,y,z);
        }
        else printf("%.1lf\n",SegmentTree.Query(1,1,n,x,y));
    }
    Heriko Deltana;
}
2021/8/7 23:36
加载中...