本以为是小清新题结果给我整不会了/kk
sin 也存了历史版本,也开了 ll ,求调/bx
#include <cmath>
#include <cstdio>
using namespace std;
#define ll long long
struct TREE{
double sumsin,sumcos;ll lazy;
}Tree[800005];
int n,m;
int a[200005];
template<typename T>
inline void input(T &x){
x=0;char c=getchar();int p=1;
while((c<'0'||c>'9')&&c!='-') c=getchar();
if (c=='-') p=-1,c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=getchar();x*=p;
}
inline void pushup(int id){
Tree[id].sumsin=Tree[id<<1].sumsin+Tree[id<<1|1].sumsin;
Tree[id].sumcos=Tree[id<<1].sumcos+Tree[id<<1|1].sumcos;
}
inline void pushdown(int id){
if (Tree[id].lazy){
double sums=Tree[id<<1].sumsin;
double sumc=Tree[id<<1].sumcos;
Tree[id<<1].sumsin=sums*cos(1.0*Tree[id].lazy)+sumc*sin(1.0*Tree[id].lazy);
Tree[id<<1].sumcos=sumc*cos(1.0*Tree[id].lazy)-sums*sin(1.0*Tree[id].lazy);
sums=Tree[id<<1|1].sumsin;
sumc=Tree[id<<1|1].sumcos;
Tree[id<<1|1].sumsin=sums*cos(1.0*Tree[id].lazy)+sumc*sin(1.0*Tree[id].lazy);
Tree[id<<1|1].sumcos=sumc*cos(1.0*Tree[id].lazy)-sums*sin(1.0*Tree[id].lazy);
Tree[id<<1].lazy+=Tree[id].lazy;
Tree[id<<1|1].lazy+=Tree[id].lazy;
Tree[id].lazy=0;
}
}
void build(int l,int r,int id){
if (l==r){
Tree[id].sumsin=sin(1.0*a[l]);
Tree[id].sumcos=cos(1.0*a[l]);
return;
}
int mid=(l+r)>>1;
build(l,mid,id<<1);
build(mid+1,r,id<<1|1);
pushup(id);
}
void update(int x,int y,ll v,int l,int r,int id){
if (x<=l&&r<=y){
double sums=Tree[id].sumsin;
double sumc=Tree[id].sumcos;
Tree[id].sumsin=sums*cos(1.0*v)+sumc*sin(1.0*v);
Tree[id].sumcos=sumc*cos(1.0*v)-sums*sin(1.0*v);
Tree[id].lazy=v;
return;
}
pushdown(id);
int mid=(l+r)>>1;
if (x<=mid) update(x,y,v,l,mid,id<<1);
if (y>mid) update(x,y,v,mid+1,r,id<<1|1);
pushup(id);
}
double query(int x,int y,int l,int r,int id){
if (x<=l&&r<=y){
return Tree[id].sumsin;
}
pushdown(id);
int mid=(l+r)>>1;double res=0;
if (x<=mid) res+=query(x,y,l,mid,id<<1);
if (y>mid) res+=query(x,y,mid+1,r,id<<1|1);
return res;
}
int main(){
input(n);
for (int i=1;i<=n;i++){
input(a[i]);
}
build(1,n,1);
input(m);
while(m--){
int opt,l,r;
input(opt);input(l);input(r);
if (opt==1) {
ll v;input(v);
update(l,r,v,1,n,1);
}
else{
printf("%.1lf\n",query(l,r,1,n,1));
}
}
return 0;
}
``