样例过了但保龄求助(玄关)
查看原帖
样例过了但保龄求助(玄关)
481527
AC_CSP楼主2023/8/30 14:45
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+7;
int n,m;
int a[N];
namespace qwq{
 int ch[N<<2][2],lzy[N<<2];
 double sin[N<<2],cos[N<<2];
 inline void push_up(int u){
  sin[u]=sin[ch[u][0]]+sin[ch[u][1]];
  cos[u]=cos[ch[u][0]]+cos[ch[u][1]];
 }
 inline void build_tree(int u,int l,int r){
  if(l==r){
   sin[u]=std::sin(a[l]);
   cos[u]=std::cos(a[l]);
   return;
  }
  ch[u][0]=u<<1,ch[u][1]=u<<1|1;
  int m=l+r>>1;
  build_tree(ch[u][0],l,m);
  build_tree(ch[u][1],m+1,r);
  push_up(u);
 }
 inline void f(int u,int x){
  int _=sin[u],__=cos[u];
  sin[u]=sin[u]*std::cos(x)+cos[u]*std::sin(x);
  cos[u]=__*std::cos(x)-_*std::sin(x);
  lzy[u]+=x;
 }
 inline void push_down(int u){
  if(!lzy[u]) return;
  f(ch[u][0],lzy[u]);
  f(ch[u][1],lzy[u]);
  lzy[u]=0;
 }
 inline void update(int u,int l,int r,int L,int R,int x){
  if(L<=l&&r<=R){
   f(u,x);
   return;
  }
  push_down(u);
  int m=l+r>>1;
  if(L<=m) update(ch[u][0],l,m,L,R,x);
  if(R>m) update(ch[u][1],m+1,r,L,R,x);
  push_up(u);
 }
 inline double query(int u,int l,int r,int L,int R){
  //cout<<u<<" "<<l<<" "<<r<<" "<<L<<" "<<R<<"\n";
  if(L<=l&&r<=R) return sin[u];
  push_down(u);
  double tmp=0;
  int m=l+r>>1;
  if(L<=m) tmp+=query(ch[u][0],l,m,L,R);
  if(R>m) tmp+=query(ch[u][1],m+1,r,L,R);
  return tmp;
 }
}
int main(){
 //ios::sync_with_stdio(false);
 //cin.tie(0),cout.tie(0);
 cin>>n;
 for(int i=1;i<=n;i++) cin>>a[i];
 cin>>m;
 qwq::build_tree(1,1,n);
 while(m--){
  int opt;
  cin>>opt;
  if(opt==1){
   int l,r,x;
   cin>>l>>r>>x;
   qwq::update(1,1,n,l,r,x);
  }
  if(opt==2){
   int l,r;
   cin>>l>>r;
   printf("%.1lf\n",qwq::query(1,1,n,l,r));
  }
 }
 return 0;
}
2023/8/30 14:45
加载中...