Codeforces All-Ukrainian School Olympiad in Informatics
Result
5時間コンテスト。
/ (3WA) / / 1:46 / 1:19
83位(no rated)
E. Points
問題
座標平面上にN個の点がある。
それぞれの点の座標x[i],y[i]が与えられる。
この時、異なる2点の距離の二乗の総和を求めよ。
N≦100000, x[i]は整数。
試行錯誤
まず、x座標ごと、y座標ごとに考えてよい。
でも、そのままやろうとするとO(n^2)でTLE.
式変形を試行錯誤してO(n)に落とせないか検討。
2S = ΣΣ(xi-xj)^2 = ΣΣ(xi^2 + xj^2 - 2xixj)
= Σ (Σxi^2 + Σxj^2 - 2xiΣxj )
= Σ ( sum^2 + sum^2 - 2xiΣxj )
= 2nsum^2 - 2ΣxiΣxj
なので、S = Σ(xi^2 - xi * sum)とすればよい。
ソースコード
int n; ll solve(vi &x){ sort(all(x)); ll ret=0, sum=0; rep(i,n)sum+=x[i]; rep(i,n){ ret+=(n-1ll)*x[i]*x[i]; ret-=x[i]*(sum-x[i]); } return ret; } void run() { cin>>n; vi x,y; rep(i,n){ int a,b; cin>>a>>b; x.pb(a); y.pb(b); } cout<<solve(x)+solve(y)<<endl; }
D. Plus and xor
問題
二つの整数A,Bが与えられる。このとき次の二整数X,Yを求めよ。
A = X+Y
B = X xor Y
0≦X,Y≦2^64 -1を満たす。
試行錯誤
A xor B xor B = Aであるから、A = X + (B xor X)と変形できる。
X + (B xor X)という式において、XにBで元々立っているビットを立てると、
和は変化しない。(B xor Xにおいてそのビットが0になってしまうため)
したがって、Bに立っていないビットのみを立ててX+(B xor X) = Aを成り立たせる必要がある。
すなわち、X + (B xor X) = B + 2Xになるため、X = (A-B)/2が必要。
あとはこれに対して適切なYが存在するかを見ればよい。
ソースコード
typedef unsigned long long ll; void run() { ll a,b; cin>>a>>b; if(b>a)swap(a,b); ll x=(a-b)/2,y=a-x; if(a>=x&&((x^y)==b))cout<<x<<" "<<y<<endl; else cout<<-1<<endl; }
B.
しばらく考えたけど問題読み違えていた等して気力が尽きる。
後で復習……できたらいいなあ。