虽然都是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;
}