QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#849350#3224. DirectionsCarroT1212WA 56ms14252kbC++141.9kb2025-01-09 14:49:342025-01-09 14:49:34

Judging History

你现在查看的是最新测评结果

  • [2025-01-09 14:49:34]
  • 评测
  • 测评结果:WA
  • 用时:56ms
  • 内存:14252kb
  • [2025-01-09 14:49:34]
  • 提交

answer

#include <bits/stdc++.h>
#define pb push_back
#define fi first
#define se second
using namespace std; bool MEM;
using ll=long long; using ld=long double;
using pii=pair<int,int>; using pll=pair<ll,ll>;
const int I=1e9;
const ll J=1e18,N=2e5+7;
const ld pi=acos(-1);
ll n,m,ans=J;
pair<ld,ll> a[N],b[N],c[N];
map<ld,ll> mp;
void go(ll p) {
	if (b[p].fi>0) for (ll i=1;i<=m;i++) b[i].fi=b[i].fi>0?b[i].fi-pi:b[i].fi+pi;
	for (ll i=1;i<=m;i++) c[i]=b[i];
	sort(c+1,c+m+1);
	ld l=b[p].fi,r=l+pi;
	ll s=1,t=1,mnn=J;
	for (ll i=1;i<=m;i++) if (c[i].fi>l) { s=i; break; }
	for (ll i=1;i<=m;i++) if (c[i].fi>r) { t=i; break; }
	// printf("%lld %lld %lld %Lf %Lf\n",p,s,t,l,r);
	// for (ll i=1;i<=m;i++) printf(" %Lf %lld\n",c[i].fi,c[i].se);
	for (ll i=s,u=t;i<t;i++) {
		while (u!=s) {
			if (c[i].fi<=0?c[u].fi-c[i].fi<pi:c[u].fi>0||c[i].fi-c[u].fi>pi)
				mnn=min(mnn,c[u].se),u=u%m+1;
			else break;
		}
		ans=min(ans,b[p].se+mnn+c[i].se);
		// printf("%lld %lld\n",i,u);
	}
}
void solve3() {
	ll mn=J,p=0,pp=0;
	for (ll i=1;i<=m;i++) if (b[i].se<mn) mn=b[i].se,p=i;
	pp=mp[b[p].fi>0?b[p].fi-pi:b[p].fi+pi];
	go(p);
	if (pp) go(pp);
}
void solve4() {
	vector<ll> v;
	for (auto i:mp) if (i.fi>0&&mp.count(-i.fi)) v.pb(i.se+mp[-i.fi]);
	sort(v.begin(),v.end());
	if (v.size()>=2) ans=min(ans,v[0]+v[1]);
}
void mian() {
	scanf("%lld",&n);
	for (ll i=1,x,y,z;i<=n;i++) {
		scanf("%lld%lld%lld",&x,&y,&z);
		if (!x&&!y) z=J;
		a[i]={atan2(y,x),z};
	}
	sort(a+1,a+n+1);
	for (ll l=1,r;l<=n;l=r+1) {
		for (r=l;r<n&&a[r+1].fi==a[l].fi;r++);
		b[++m]={a[l].fi,J};
		for (ll i=l;i<=r;i++) b[m].se=min(b[m].se,a[i].se);
		mp[b[m].fi]=b[m].se;
	}
	if (m<=3) return cout<<"-1",void();
	// for (ll i=1;i<=m;i++) printf(" %Lf %lld\n",b[i].fi,b[i].se);
	solve3(),solve4();
	cout<<(ans==J?-1:ans);
}
bool ORY; int main() {
	// while (1)
	// int t; for (scanf("%d",&t);t--;)
	mian();
	cerr<<"\n"<<abs(&MEM-&ORY)/1048576<<"MB";
	return 0;
}

详细

Test #1:

score: 100
Accepted
time: 42ms
memory: 14252kb

input:

200000
-1 -1 1
1 1 1
0 1 1
1 0 1
1 -1 1
1 1 1
1 1 1
-1 1 1
1 -1 1
0 1 1
0 0 1
0 0 1
1 -1 1
-1 -1 1
0 0 1
1 0 1
-1 1 1
-1 1 1
1 1 1
1 1 1
-1 1 1
0 -1 1
1 -1 1
-1 0 1
1 0 1
1 -1 1
0 -1 1
1 0 1
-1 1 1
1 0 1
-1 0 1
1 1 1
1 0 1
-1 -1 1
-1 1 1
-1 -1 1
0 -1 1
0 -1 1
1 1 1
1 -1 1
0 1 1
1 1 1
-1 1 1
1 -1 1
0...

output:

3

result:

ok single line: '3'

Test #2:

score: 0
Accepted
time: 43ms
memory: 12448kb

input:

200000
-1 -1 2
1 0 1
1 0 2
1 -1 2
1 0 1
-1 1 1
-1 -1 2
1 1 1
0 -1 2
-1 -1 1
0 1 2
0 -1 2
-1 0 2
0 0 2
-1 1 1
1 1 1
-1 0 1
1 -1 2
1 0 1
0 0 1
1 0 2
0 -1 1
0 1 1
0 -1 2
-1 1 2
0 1 2
-1 1 2
0 1 1
0 1 1
1 1 2
1 1 1
1 0 2
1 1 2
-1 1 2
-1 1 1
0 1 2
0 -1 2
1 0 2
0 1 1
0 -1 1
1 -1 1
1 0 2
0 -1 1
-1 0 1
0 -1...

output:

3

result:

ok single line: '3'

Test #3:

score: -100
Wrong Answer
time: 56ms
memory: 13380kb

input:

200000
1 0 555860533
-1 1 633479355
0 0 411890838
-1 -1 411764668
0 0 324117889
1 1 147426106
1 0 41681213
1 -1 169580394
1 -1 204074237
-1 1 265787176
1 -1 204010614
0 -1 582574240
0 -1 98238758
1 1 489573021
-1 1 747647275
1 -1 933893240
0 -1 663924164
0 0 470849190
1 -1 479419247
-1 -1 53695974
0...

output:

59116

result:

wrong answer 1st lines differ - expected: '95355', found: '59116'