CSES - UKIEPC 2016 - Results
Submission details
Task:Build a Boat
Sender:Game of Nolife
Submission time:2016-11-12 14:29:04 +0200
Language:C++
Status:READY
Result:ACCEPTED
Test results
testverdicttime
#1ACCEPTED0.06 sdetails
#2ACCEPTED0.08 sdetails
#3ACCEPTED0.05 sdetails
#4ACCEPTED0.08 sdetails
#5ACCEPTED0.05 sdetails
#6ACCEPTED0.06 sdetails
#7ACCEPTED0.06 sdetails
#8ACCEPTED0.06 sdetails
#9ACCEPTED0.06 sdetails
#10ACCEPTED0.05 sdetails
#11ACCEPTED0.08 sdetails

Code

#include <bits/stdc++.h>
#define F first
#define S second
#define X real()
#define Y imag()
using namespace std;
typedef long long ll;
typedef long double ld;
typedef complex<ld> co;

co pts[101010];
const ld eps=1e-9;

ld getAr(co a, co b, ld x1, ld x2) {
	if (x2-x1<eps) return 0;
	ld par1=(x1-a.X)/(b.X-a.X);
	ld par2=(x2-a.X)/(b.X-a.X);
	co aa=a+par1*(b-a);
	co bb=a+par2*(b-a);
	return (bb.Y+aa.Y)*(bb.X-aa.X)/2;
}

int main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	ld c;
	cin>>c;
	int n;
	cin>>n;
	int leind=-1;
	ld parsa=1e7;
	for (int i=0;i<n;i++) {
		ld x,y;
		cin>>x>>y;
		if (x<parsa) {
			parsa=x;
			leind=i;
		}
		pts[i]={x,y};
	}
	pts[n]=pts[0];
	ld ar=0;
	for (int i=0;i<n;i++) {
		ar+=(pts[i].Y+pts[i+1].Y)*(pts[i].X-pts[i+1].X)/2;
	}
	ar=abs(ar);
	ld mm=floor(ar/c);
	ll m=mm;
	cout<<m<<"\n";
	int ptr1=leind;
	int ptr2=leind;
	ld acAr=0;
	ld xx=pts[leind].X;
	cout<<setprecision(15);
	for (ll i=1;i<m;i++) {
		while (acAr<(i*ar)/m) {
			while (ptr1>0 && pts[ptr1-1].X-xx<eps) ptr1--;
			if (ptr1==0) ptr1=n;
			while (ptr1>0 && pts[ptr1-1].X-xx<eps) ptr1--;
			while (ptr2<n && pts[ptr2+1].X-xx<eps) ptr2++;
			if (ptr2==n) ptr2=0;
			while (ptr2<n && pts[ptr2+1].X-xx<eps) ptr2++;
			ld x2=min(pts[ptr1-1].X,pts[ptr2+1].X);
//			cerr<<x2<<endl;
			if (acAr+getAr(pts[ptr1-1],pts[ptr1],xx,x2)-getAr(pts[ptr2+1],pts[ptr2],xx,x2)<(i*ar)/m) {
				acAr+=getAr(pts[ptr1-1],pts[ptr1],xx,x2)-getAr(pts[ptr2+1],pts[ptr2],xx,x2);
				xx=x2;
			} else {
//				cerr<<"taa"<<endl;
				ld lo=xx;
				ld hi=x2;
				for (int ii=0;ii<100;ii++) {
					ld mid=(lo+hi)/2;
					if (acAr+getAr(pts[ptr1-1],pts[ptr1],xx,mid)-getAr(pts[ptr2+1],pts[ptr2],xx,mid)<(i*ar)/m) {
						lo=mid;
					} else hi=mid;
				}
				acAr=(i*ar)/m;
				xx=lo;
			}
		}
		cout<<xx<<"\n";
	}
}

Test details

Test 1

Verdict: ACCEPTED

input
3330
25
41 319
28 276
72 200
...

correct output
15
69.93518657478368
116.7366844213038
141.6357731528959
171.609786826269
...

user output
15
69.9351865747837
116.736684421304
141.635773152896
171.609786826269
...

Test 2

Verdict: ACCEPTED

input
919746
100000
996 6428
995 6428
995 6428
...

correct output
78
-1530.528630972202
-1309.390935245671
-1122.206263056054
-953.7695175615483
...

user output
78
-1530.5286309722
-1309.39093524567
-1122.20626305605
-953.769517561548
...

Test 3

Verdict: ACCEPTED

input
917799
1000
912 -630
911 -631
910 -632
...

correct output
27
-3465.185579920218
-3163.712040783569
-2895.313958352536
-2641.390181941859
...

user output
27
-3465.18557992022
-3163.71204078357
-2895.31395835254
-2641.39018194186
...

Test 4

Verdict: ACCEPTED

input
277175
100000
2170 -3895
2170 -3895
2170 -3895
...

correct output
90
-3005.257881357356
-2879.633071625344
-2771.662656826568
-2673.251989964648
...

user output
90
-3005.25788135736
-2879.63307162534
-2771.66265682657
-2673.25198996465
...

Test 5

Verdict: ACCEPTED

input
883
57
9 232
20 9
31 235
...

correct output
82
14.1980667997135
17.8823468982338
20.66041839625604
23.53643431160832
...

user output
82
14.1980667997135
17.8823468982338
20.660418396256
23.5364343116083
...

Test 6

Verdict: ACCEPTED

input
4200
40
26 239
498 35
495 69
...

correct output
15
67.35315558599663
89.89076596039594
118.6607533697672
179.4227191272342
...

user output
15
67.3531555859966
89.8907659603959
118.660753369767
179.422719127234
...

Test 7

Verdict: ACCEPTED

input
13561
35
27 219
37 213
49 187
...

correct output
3
170.9402238323747
262.4515849078862

user output
3
170.940223832375
262.451584907886

Test 8

Verdict: ACCEPTED

input
3141592
500
10000 0
9999 62
9996 125
...

correct output
49
-8938.348582329191
-8303.932703876396
-7764.90786515461
-7278.186505377522
...

user output
49
-8938.34858232919
-8303.9327038764
-7764.90786515461
-7278.18650537752
...

Test 9

Verdict: ACCEPTED

input
3141530
10000
10000 0
9999 6
9999 12
...

correct output
99
-9338.328301675262
-8945.754530183002
-8613.952801637244
-8315.767480032278
...

user output
99
-9338.32830167526
-8945.754530183
-8613.95280163724
-8315.76748003228
...

Test 10

Verdict: ACCEPTED

input
17411
50
1000 0
992 62
968 124
...

correct output
89
-927.3615790510609
-885.1172474645925
-849.4735324335133
-817.3603922657395
...

user output
89
-927.361579051061
-885.117247464593
-849.473532433513
-817.360392265739
...

Test 11

Verdict: ACCEPTED

input
949050
100000
-2277 -1215
-2277 -1215
-2278 -1215
...

correct output
75
-2087.626257450405
-1860.533764609684
-1668.250903711116
-1495.160391614835
...

user output
75
-2087.6262574504
-1860.53376460968
-1668.25090371112
-1495.16039161484
...