比赛 Asm.Def战记之圣地亚哥“杯2015 评测结果 AAAAAAAWWW
题目名称 Asm.Def的命令 最终得分 70
用户昵称 Satoshi 运行时间 0.842 s
代码语言 C++ 内存使用 4.40 MiB
提交时间 2015-10-31 12:02:16
显示代码纯文本
#include <fstream>
#include <algorithm>
#include <iomanip>
#include <cmath>
#define N 100010
using namespace std;
typedef long double ld;
typedef long long ll;
ifstream in("asm_command.in");
ofstream out("asm_command.out");
int n,q;
ld pi=asin(1.0)*2;
ll X[N]={0},Y[N]={0},O[N]={0};
int lowbit(int x){return x&(-x);}
class node
{
public:
	ll x,y,o;
};
void add(int x,int a,int b,int c)
{
	int i;
	for(i=x;i>0;i-=lowbit(i))
	{
		X[i]+=a;
		Y[i]+=b;
		O[i]+=c;
	}
}
node sum(int x)
{
	int i;
	node ans;
	ans.x=ans.y=ans.o=0;
	for(i=x;i<=n;i+=lowbit(i))
	{
		ans.x+=X[i];
		ans.y+=Y[i];
		ans.o+=O[i];
	}
	return ans;
}
class point
{
public:
	ld x,y;
	void make(ld a,ld b)
	{
		x=a;
		y=b;
	}
	point operator +(const point a)
	{
		point b;
		b.x=x+a.x;
		b.y=y+a.y;
		return b;
	}
	void rotate(ll angle)
	{
		ld o,sita,xx,yy;
		sita=ld(angle);
		o=sita*pi/(180.0);
		xx=x*cos(o)-y*sin(o);
		yy=x*sin(o)+y*cos(o);
		x=xx;
		y=yy;
	}
}P[N];
ld ldabs(ld x)
{
	if(x<0)return -x;
	return x;
}
void print(ld x,int y)
{
	if(ldabs(x)<0.0000001)out<<setprecision(y)<<std::fixed<<0.0;
	else out<<setprecision(y)<<std::fixed<<x;
}
void work()
{
	int i,j;
	int a,b,c,d;
	int opp;
	node e;
	point W;
	in>>n>>q;
	//print(pi,15);
	for(i=1;i<=n;i++)P[i].make(0,i);
	for(i=1;i<=q;i++)
	{
		in>>opp;
		if(opp==0)
		{
			in>>a;
		    e=sum(a);
			e.o%=360;
			W.make(ld(e.x),ld(e.y));
			W=W+P[a];
			W.rotate(e.o);
			//print(e.o,4);out<<endl;
			print(W.x,1);
			out<<' ';
			print(W.y,1);
			out<<endl;
		}
		if(opp==1)
		{
			in>>a>>b>>c>>d;
			add(a-1,-c,-d,0);
			add(b,c,d,0);
		}
		if(opp==2)
		{
			in>>a>>b>>c;
			//out<<a<<' '<<b<<' '<<c<<endl;
			add(a-1,0,0,-c);
			add(b,0,0,c);
		}
	}
	//print(pi);
}
int main()
{
	work();
	return 0;
}