全WA,蒟蒻求助
查看原帖
全WA,蒟蒻求助
215590
Ckger楼主2021/7/15 08:32
#include<bits/stdc++.h>
#define foir(i,l,r) for (register int i=l;i<=r;++i)
#define fopr(i,l,r) for (register int i=l;i>=r;--i)
#define maxn 200010
using namespace std;

/*
sin(a+x)=sina*cosx+cosa*sinx

cos(a+x)=cosa*cosx-sina*sinx
*/
long long n,m,opt;
long long l,r,k;

inline long long read()
{
	long long x=0;bool f=0;char c=getchar();
	while (!isdigit(c)) f|=c=='-',c=getchar();
	while (isdigit(c)) x=(x<<1)+(x<<3)+(c^48),c=getchar();
	return f?-x:x;
}

struct Segment_tree
{
	double s[maxn<<2],c[maxn<<2];
	long long tag[maxn<<2];
	
	inline void pushup(long long p)
	{
		s[p]=s[p<<1]+s[p<<1|1];
		c[p]=c[p<<1]+c[p<<1|1];
	}
	
	inline void check(long long p)
	{
		double S=s[p],C=c[p],x=tag[p];
		s[p]=S*cos(x)+C*sin(x);
		c[p]=C*cos(x)-S*sin(x);
	}
	
	inline void pushdown(long long p)
	{
		if (!tag[p]) return ;
		tag[p<<1]+=tag[p];
		check(p<<1);
		tag[p<<1|1]+=tag[p];
		check(p<<1|1);
		tag[p]=0;
	}
	
	inline void update(long long L,long long R,long long ql,long long qr,long long x,long long p)
	{
//		cout<<L<<" "<<R<<endl;
		if (L>=ql&&qr>=R)
		{
//			cout<<"giao\n";
			double S=s[p],C=c[p];
			s[p]=S*cos(x)+C*sin(x);
			c[p]=C*cos(x)-S*sin(x);
			tag[p]+=x;
			return ;
		}
		long long mid=(L+R)>>1;
		pushdown(p);
		if (ql<=mid) update(L,mid,ql,qr,x,p<<1);
		if (qr>mid) update(mid+1,R,ql,qr,x,p<<1|1);
		pushup(p);
	}
	
	double query(long long L,long long R,long long ql,long long qr,long long p)
	{
		if (L>=ql&&R<=qr)
			return s[p];
		pushdown(p);
		long long mid=(L+R)>>1;
		double res=0;
		if (ql<=mid) res+=query(L,mid,ql,qr,p<<1);
		if (qr>mid) res+=query(mid+1,R,ql,qr,p<<1|1);
		return res;
	}
	
	inline void build(long long L,long long R,long long p)
	{
		if (L==R)
		{
			long long x=read();
			s[p]=sin(x);
			c[p]=cos(x);
			return ;
		}
		long long mid=(L+R)>>1;
		build(L,mid,p<<1);
		build(mid+1,R,p<<1|1);
		pushup(p);
	}
}seg;

int main()
{
	n=read();
	seg.build(1,n,1);
	m=read();
	while (m--)
	{
		opt=read();
		if (opt==1)
		{
			l=read(),r=read(),k=read();
			seg.update(1,n,l,r,k,1);
		}
		else
		{
			l=read(),r=read();
			cout<<fixed<<setprecision(1)<<seg.query(1,n,l,r,1)<<endl;
		}
	}
	return 0;
}

样例过了,找了好久bug都没找到,求调

2021/7/15 08:32
加载中...