比赛 |
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;
}