Problem:
Problem E: Pie Chart is as easy as
pie.
ICPC World Finals 3日目
この日、ティー氏はチーム内の言語使用割合を調べていた。
珍しいことに、我々のチームは使用言語を統一していない。 調査の結果、2人がC++、1人がJavaを使っていることが分かった。
さて、これをパイチャート（円グラフ）にしてみよう。
おや、Javaの使用割合が少ないように見えるな。
どう考えてもこんなはずはないので少々手を加えよう。 これは最近流行りのテクニックであり、
「パイチャートの中心座標をずらす」というものだ。 （皆さんはマネしてはいけません。）
うむ、これでバランスがとれた。 ところで面積はどのように変わったのだろう？
問題
半径\(r\)、項目数\(n\)のパイチャート（円グラフ）が与えられる。
項目\(i\)の構成比率は\( p_{i} \)[%]であり、座標\( (0, r)
\)から時計回りに項目が割り当てられる（下図を参照）。 パイチャートの中心座標が\( (0, 0) \)から\( (x, y)
\)に変化した時、 各項目の占める面積は何%変化するかを求めよ。
入力
r x y n
p
1
p
2
… p
n
1行目に パイチャートの半径\(r\)、中心のx座標\(x\)、y座標\(y\)、項目数\(n\)が空白区切りで与えられる。
2行目には、 項目\(i\)の構成比率\( p_{i} \)[%]が空白区切りで与えられる。
出力
1行目に各項目の占める面積の変化率[%]を「整数に切り捨てた値」を空白区切りで出力せよ。
制約
入力は全て整数で与えられる
\( r = 100 \)
\( x^{2} + y^{2} < r^{2} \)
\( 2 \leq n \leq 10 \)
\( p_{i} > 0 (1 \leq i \leq n) \)
\( \sum_{1 \leq i \leq n}p_{i} = 100 \)
\( (x, y) \)が高々距離\( 10^{-3} \)移動しても答えが変化しないことが保証される
入出力例
入力1
100 50 -50 2
67 33
出力1
71 156
項目1の面積は約21048から約15153に変化した。 変化率は15153/21048 ≒
71.99%。
項目2の面積は約10367から約16262に変化した。 変化率は16262/10367 ≒
156.86%。
入力2
100 -50 0 4
10 20 30 40
出力2
115 144 113 64
項目ごとのおよその面積の変化は以下の通り。
項目1: 3142 → 3619
項目2: 6283 → 9078
項目3: 9425 → 10675
項目4: 12566 → 8044
入力3
100 70 -70 8
1 24 1 24 1 24 1 24
出力3
167 97 27 10 32 102 172 189

Submitted solutions:

code_snippet: #include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
int b[12];
double p[12];
double q[12];
double PI=acos(-1.0);
int main(){
	int x,y;
	int a;
	scanf("%d%d%d",&a,&x,&y);
	scanf("%d",&a);
	for(int i=0;i<a;i++){
		scanf("%d",b+i);
		p[i]=PI*100*b[i];
	}
	int at=0;
	for(int i=0;i<a;i++){
		for(int j=0;j<b[i]*10000;j++){
			double t=100.0-(sin(PI*at/500000)*x+cos(PI*at/500000)*y);
			q[i]+=PI*t/10000;
			at++;
		}
	//	printf("%f\n",q[i]);
	}
	for(int i=0;i<a;i++){
		if(i)printf(" ");
		printf("%d",(int)(q[i]/p[i]*100));
	}
	printf("\n");
}
accuracy: 1
time_ms: 70
memory_kb: 1036
final_rank: 1

code_snippet: #include <iostream>
#include <sstream>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <algorithm>
#include <stack>
#include <queue>
#include <deque>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <cassert>
#define REP(i,n) for(int i=0; i<(int)(n); ++i)

using namespace std;
typedef long long ll;

const int    INF = 1000000000;
const int    MOD = 1000000007;
const double EPS = 1e-8;

double dist(double x, double y){
    return sqrt(x * x + y * y);
}

int main(){
    double R, X, Y;
    int N;
    while(cin >> R >> X >> Y >> N){
        vector<double> P(N + 1, 0);
        for(int i = 0; i < N; i++){
            cin >> P[i + 1];
            P[i + 1] = P[i + 1] / 100 * 2 * M_PI;
            P[i + 1] += P[i];
        }
        const int LOOP = 10000;
        for(int i = 0; i < N; i++){
            double ARG = P[i + 1] - P[i];
            double S = ARG * R * R / 2.0;
            double newS = 0;
            for(double p = P[i]; p < P[i + 1]; p += ARG / LOOP){
                double x1 = R * cos(M_PI/2.0 - p);
                double y1 = R * sin(M_PI/2.0 - p);
                double x2 = R * cos(M_PI/2.0 - (p + ARG/LOOP));
                double y2 = R * sin(M_PI/2.0 - (p + ARG/LOOP));
                newS += abs( (x1 - X) * (y2 - Y) - (x2 - X) * (y1 - Y) ) / 2.0;
            }
            printf("%d", int(newS/S*100 + EPS));
            if(i == N - 1) putchar('\n');
            else putchar(' ');
        }
    }
    return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 1212
final_rank: 2

code_snippet: #include <iostream>
#include <sstream>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <algorithm>
#include <stack>
#include <queue>
#include <deque>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <cassert>
#define REP(i,n) for(int i=0; i<(int)(n); ++i)

using namespace std;
typedef long long ll;

const int    INF = 1000000000;
const int    MOD = 1000000007;
const double EPS = 1e-8;

double dist(double x, double y){
    return sqrt(x * x + y * y);
}

int main(){
    double R, X, Y;
    int N;
    while(cin >> R >> X >> Y >> N){
        vector<double> P(N + 1, 0);
        for(int i = 0; i < N; i++){
            cin >> P[i + 1];
            P[i + 1] = P[i + 1] / 100 * 2 * M_PI;
            P[i + 1] += P[i];
        }
        const int LOOP = 1000000;
        for(int i = 0; i < N; i++){
            double ARG = P[i + 1] - P[i];
            double S = ARG * R * R / 2.0;
            double newS = 0;
            for(double p = P[i]; p < P[i + 1]; p += ARG / LOOP){
                double x1 = R * cos(M_PI/2.0 - p);
                double y1 = R * sin(M_PI/2.0 - p);
                double x2 = R * cos(M_PI/2.0 - (p + ARG/LOOP));
                double y2 = R * sin(M_PI/2.0 - (p + ARG/LOOP));
                newS += abs( (x1 - X) * (y2 - Y) - (x2 - X) * (y1 - Y) ) / 2.0;
            }
            printf("%d", int(newS/S*100 + EPS));
            if(i == N - 1) putchar('\n');
            else putchar(' ');
        }
    }
    return 0;
}
accuracy: 1
time_ms: 420
memory_kb: 1212
final_rank: 3