社区讨论
样例过了,0pts,求调
P6327区间加区间 sin 和参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @m3puudbo
- 此快照首次捕获于
- 2024/11/20 20:23 去年
- 此快照最后确认于
- 2024/11/20 20:23 去年
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m;
int a[200010];
struct node{
int l,r;
double sin_sum,cos_sum;
ll add;
}t[2000104];
void pushup(int u){
t[u].sin_sum=t[u2].sin_sum+t[u2+1].sin_sum;
t[u].cos_sum=t[u2].cos_sum+t[u2+1].cos_sum;
}
void pushdown(int u){
if(t[u].add){
t[u2].add+=t[u].add;
t[u2+1].add+=t[u].add;
double res=t[u2].sin_sum;
t[u2].sin_sum=t[u2].sin_sumcos(t[u].add)+t[u2].cos_sumsin(t[u].add);
t[u2].cos_sum=t[u2].cos_sumcos(t[u].add)-ressin(t[u].add);
res=t[u2+1].sin_sum;
t[u2+1].sin_sum=t[u2+1].sin_sumcos(t[u].add)+t[u2+1].cos_sumsin(t[u].add);
t[u2+1].cos_sum=t[u2+1].cos_sumcos(t[u].add)-ressin(t[u].add);
t[u].add=0;
}
}
void build(int u,int l,int r){
t[u]={l,r};
if(l==r){
t[u].sin_sum=sin(a[l]);
t[u].cos_sum=cos(a[l]);
return;
}
int mid=(l+r)/2;
build(u2,l,mid);
build(u2+1,mid+1,r);
pushup(u);
}
void update(int u,int l,int r,int x){
if(t[u].l>=l&&t[u].r<=r){
t[u].add+=x;
double res=t[u].sin_sum;
t[u].sin_sum=t[u].sin_sumcos(x)+t[u].cos_sumsin(x);
t[u].cos_sum=t[u].cos_sumcos(x)-ressin(x);
return;
}
pushdown(u);
int mid=(t[u].l+t[u].r)/2;
if(l<=mid)update(u2,l,r,x);
if(r>mid)update(u2+1,l,r,x);
pushup(u);
}
node query(int u,int l,int r){
if(t[u].l>=l&&t[u].r<=r)return t[u];
pushdown(u);
int mid=(t[u].l+t[u].r)/2;
node res;
if(l<=mid)res=query(u2,l,r);
if(r>mid){
node res1=query(u*2+1,l,r);
res.sin_sum=res.sin_sum+res1.sin_sum;
res.cos_sum=res.cos_sum+res1.cos_sum;
}
return res;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
int m;
cin>>m;
build(1,1,n);
while(m--){
int op;
cin>>op;
if(op==1){
int l,r,x;
cin>>l>>r>>x;
update(1,l,r,x);
}
else{
int l,r;
cin>>l>>r;
printf("%.1lf\n",query(1,l,r).sin_sum);
}
}
return 0;
}
CPP#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m;
int a[200010];
struct node{
int l,r;
double sin_sum,cos_sum;
ll add;
}t[200010*4];
void pushup(int u){
t[u].sin_sum=t[u*2].sin_sum+t[u*2+1].sin_sum;
t[u].cos_sum=t[u*2].cos_sum+t[u*2+1].cos_sum;
}
void pushdown(int u){
if(t[u].add){
t[u*2].add+=t[u].add;
t[u*2+1].add+=t[u].add;
double res=t[u*2].sin_sum;
t[u*2].sin_sum=t[u*2].sin_sum*cos(t[u].add)+t[u*2].cos_sum*sin(t[u].add);
t[u*2].cos_sum=t[u*2].cos_sum*cos(t[u].add)-res*sin(t[u].add);
res=t[u*2+1].sin_sum;
t[u*2+1].sin_sum=t[u*2+1].sin_sum*cos(t[u].add)+t[u*2+1].cos_sum*sin(t[u].add);
t[u*2+1].cos_sum=t[u*2+1].cos_sum*cos(t[u].add)-res*sin(t[u].add);
t[u].add=0;
}
}
void build(int u,int l,int r){
t[u]={l,r};
if(l==r){
t[u].sin_sum=sin(a[l]);
t[u].cos_sum=cos(a[l]);
return;
}
int mid=(l+r)/2;
build(u*2,l,mid);
build(u*2+1,mid+1,r);
pushup(u);
}
void update(int u,int l,int r,int x){
if(t[u].l>=l&&t[u].r<=r){
t[u].add+=x;
double res=t[u].sin_sum;
t[u].sin_sum=t[u].sin_sum*cos(x)+t[u].cos_sum*sin(x);
t[u].cos_sum=t[u].cos_sum*cos(x)-res*sin(x);
return;
}
pushdown(u);
int mid=(t[u].l+t[u].r)/2;
if(l<=mid)update(u*2,l,r,x);
if(r>mid)update(u*2+1,l,r,x);
pushup(u);
}
node query(int u,int l,int r){
if(t[u].l>=l&&t[u].r<=r)return t[u];
pushdown(u);
int mid=(t[u].l+t[u].r)/2;
node res;
if(l<=mid)res=query(u*2,l,r);
if(r>mid){
node res1=query(u*2+1,l,r);
res.sin_sum=res.sin_sum+res1.sin_sum;
res.cos_sum=res.cos_sum+res1.cos_sum;
}
return res;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
int m;
cin>>m;
build(1,1,n);
while(m--){
int op;
cin>>op;
if(op==1){
int l,r,x;
cin>>l>>r>>x;
update(1,l,r,x);
}
else{
int l,r;
cin>>l>>r;
printf("%.1lf\n",query(1,l,r).sin_sum);
}
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...