求助,只过了阳历的代码
查看原帖
求助,只过了阳历的代码
233198
starseven楼主2020/8/27 18:18
#include<cstdio>
#include<cmath>
#define Starseven main
#define ll long long
#define mid (l + r >> 1)
#define ls (id << 1)
#define rs (id << 1 | 1)
#define check (x <= l && y >= r)
namespace lyt {
	void read(int &x){
	char ch=getchar();int re=0,op=1;
	while(ch<'0'||ch>'9'){if(ch=='-') op=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){re=(re<<3)+(re<<1)+ch-'0';ch=getchar();}
	x = re * op;
	return ;
	}
	void read(long long &x){
	char ch=getchar();long long re=0,op=1;
	while(ch<'0'||ch>'9'){if(ch=='-') op=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){re=(re<<3ll)+(re<<1ll)+ch-'0';ch=getchar();}
	x = re * op;
	return ;
	}
	void write(int x){
		if(x<0){putchar('-');x=-x;}
		if(x>9) write(x/10);
		putchar(x%10+'0');
		return ;
	}//记得自己加空格和换行 
	void write(long long x){
		if(x<0){putchar('-');x=-x;}
		if(x>9) write(x/10);
		putchar(x%10+'0');
		return ;
	}//记得自己加空格和换行
	int max(int x,int y){return x<y?y:x;}
	int min(int x,int y){return x<y?x:y;}
	int abs(int x){return x<0?-x:x;}
	long long max(long long x,long long y){return x<y?y:x;}
	long long min(long long x,long long y){return x<y?x:y;}
	long long abs(long long x){return x<0?-x:x;}
	double abs(double x){return x<0?-x:x;}
	void swap(int &a,int &b) {a ^= b ^= a ^= b;}
	void swap(long long &a,long long &b) {a ^= b ^= a ^= b;}
	ll Power(ll a, ll b, ll p) {
		ll re = 1;
		while(b) {
			if(b & 1ll) re = (re * a) % p;
			b >>= 1ll;
			a = (a * a) % p; 
		}
	return re;
	}
}using namespace lyt;
const int N = 2e5 + 20;
int n, m, a[N];

struct node{
	double Sin, Cos;
	int tag;
}tr[N << 2];

struct nod {
	
	void Pushup(int id) {
		tr[id].Sin = tr[ls].Sin + tr[rs].Sin;
		tr[id].Cos = tr[ls].Cos + tr[rs].Cos;
		return ;
	}
	
	void Pushdown(int id) {
		if(!tr[id].tag) return ;
		int k = tr[id].tag;
		tr[id].tag = 0;
		
		double S = tr[ls].Sin, C = tr[ls].Cos;
		double s = sin(k), c = cos(k);
		tr[ls].Sin = (S * c + C * s);
		tr[ls].Cos = (C * c - S * s);
		tr[ls].tag += k;
		
		S = tr[rs].Sin, C = tr[rs].Cos;
		tr[rs].Sin = (S * c + C * s);
		tr[rs].Cos = (C * c - S * s);
		tr[rs].tag += k;
		return ;
	}
	
	void Build_tree(int l, int r,int id) {
		if(l == r) {
			tr[id].Sin = sin(a[l]);
			tr[id].Cos = cos(a[l]);
			tr[id].tag = 0;
			return ;
		}
		Build_tree(l, mid, ls);
		Build_tree(mid + 1, r, rs);
		Pushup(id);
	}
	
	void Insert(int l, int r, int x, int y, int id, int k) {
		if(check) {
			double S = tr[id].Sin, C = tr[id].Cos;
			double s = sin(k), c = cos(k);
			tr[id].Sin = (S * c + C * s);
			tr[id].Cos = (C * c - S * s);
			tr[id].tag += k;
			return ;
		}
		Pushdown(id);
		if(x <= mid) Insert(l, mid, x, y, ls, k);
		if(y > mid) Insert(mid + 1, r, x, y, rs, k);
		Pushup(id);
		return ;
	}
	
	double Find(int l, int r, int x, int y, int id) {
		if(check) return tr[id].Sin;
		Pushdown(id);
		double re = 0.0;
		if(x <= mid) re += Find(l, mid, x, y, ls);
		if(y > mid) re += Find(mid + 1, r, x, y, rs);
		return re;
	}
}solve;

int Starseven(void) {
	read(n);
	for (int i = 1; i <= n; i++)
		read(a[i]);
	read(m);	
	solve.Build_tree(1, n, 1);	
	while(m--) {
		int opt, x, y;
		read(opt);
		read(x);
		read(y);
		if(opt == 1) {
			int v;
			read(v);
			solve.Insert(1, n, x, y, 1, v);
		}
		else {
			double ans = solve.Find(1, n, x, y, 1);
			printf("%.1lf\n", ans);
		}
	}	
	return 0;	
}
2020/8/27 18:18
加载中...