답안 #119324

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
119324 2019-06-21T03:09:30 Z tmwilliamlin168 Printed Circuit Board (CEOI12_circuit) C++14
85 / 100
100 ms 31784 KB
#include <bits/stdc++.h>
using namespace std;

#define ll long long

int in() {
	char c=0;
	while(c<'0'||c>'9')
		c=getchar_unlocked();
	int r=0;
	while(c>='0'&&c<='9') {
		r=r*10+c-'0';
		c=getchar_unlocked();
	}
	return r;
}

void out(int x) {
	int c=0, r=0;
	for(; x%10==0; ++c, x/=10);
	for(; x; x/=10)
		r=r*10+x%10;
	for(; r; r/=10)
		putchar_unlocked(r%10+'0');
	while(c--)
		putchar_unlocked('0');
}

const int mxN=2e5;
int n, b[mxN], c[mxN+1], e1[mxN], e2[mxN], a1, t[18][mxN];
array<ll, 2> a[mxN+1];
vector<int> vp[mxN];
bool ans[mxN];

bool cw(int x, int y, int z) {
	return (a[z][1]-a[x][1])*(a[y][0]-a[x][0])<(a[y][1]-a[x][1])*(a[z][0]-a[x][0]);
}

bool pcmp(const int &i, const int &j) {
	return a[i][1]*a[j][0]<a[j][1]*a[i][0];
}

bool scmp(const int &i, const int &j) {
	if(i<0)
		return 0;
	if(j<0)
		return 1;
	if(e1[i]==e1[j])
		return c[e2[i]]<c[e2[j]]?!cw(e1[j], e2[j], e2[i]):cw(e1[i], e2[i], e2[j]);
	return c[e1[i]]<c[e1[j]]?cw(e1[i], e2[i], e1[j]):!cw(e1[j], e2[j], e1[i]);
}

int main() {
	n=in();
	for(int i=0; i<n; ++i)
		a[i]={in(), in()};
	a[n]=a[0];
	iota(b, b+n, 0);
	sort(b, b+n, pcmp);
	for(int i=0, j=0; i<n; i=j) {
		for(; j<n&&a[b[i]][1]*a[b[j]][0]==a[b[j]][1]*a[b[i]][0]; ++j) {
			c[b[j]]=i;
			vp[c[b[j]]].push_back(b[j]);
		}
	}
	c[n]=c[0];
	memset(t, -1, sizeof(t));
	for(int i=0; i<n; ++i) {
		e1[i]=i;
		e2[i]=i+1;
		if(c[e2[i]]<c[e1[i]])
			swap(e1[i], e2[i]);
		if(c[e1[i]]<c[e2[i]]) {
			int k=31-__builtin_clz(c[e2[i]]-c[e1[i]]);
			t[k][c[e1[i]]]=min(i, t[k][c[e1[i]]], scmp);
			t[k][c[e2[i]]-(1<<k)]=min(i, t[k][c[e2[i]]-(1<<k)], scmp);
		}
	}
	for(int i=17; i; --i) {
		for(int j=0; j<=n-(1<<i); ++j) {
			t[i-1][j]=min(t[i][j], t[i-1][j], scmp);
			t[i-1][j+(1<<i-1)]=min(t[i][j], t[i-1][j+(1<<i-1)], scmp);
		}
	}
	for(int i=0; i<n; ++i) {
		int mj=-1;
		for(int j : vp[i])
			if(mj<0||a[j][0]+a[j][1]<a[mj][0]+a[mj][1])
				mj=j;
		if(~mj&&(t[0][i]<0||!cw(e1[t[0][i]], e2[t[0][i]], mj)))
			ans[mj]=1;
	}
	for(int i=0; i<n; ++i)
		a1+=ans[i];
	out(a1);
	putchar_unlocked('\n');
	for(int i=0; i<n; ++i) {
		if(ans[i]) {
			out(i+1);
			putchar_unlocked(' ');
		}
	}
}

Compilation message

circuit.cpp: In function 'int main()':
circuit.cpp:82:18: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
    t[i-1][j+(1<<i-1)]=min(t[i][j], t[i-1][j+(1<<i-1)], scmp);
                 ~^~
circuit.cpp:82:50: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
    t[i-1][j+(1<<i-1)]=min(t[i][j], t[i-1][j+(1<<i-1)], scmp);
                                                 ~^~
# 결과 실행 시간 메모리 Grader output
1 Correct 17 ms 19200 KB Output is correct
2 Correct 17 ms 19200 KB Output is correct
3 Correct 17 ms 19328 KB Output is correct
4 Correct 17 ms 19456 KB Output is correct
5 Correct 21 ms 19832 KB Output is correct
6 Correct 21 ms 19840 KB Output is correct
7 Correct 28 ms 20344 KB Output is correct
8 Correct 24 ms 19712 KB Output is correct
9 Correct 19 ms 19712 KB Output is correct
10 Correct 22 ms 19840 KB Output is correct
11 Correct 24 ms 19928 KB Output is correct
12 Correct 24 ms 20344 KB Output is correct
13 Correct 32 ms 20984 KB Output is correct
14 Correct 33 ms 21632 KB Output is correct
15 Correct 37 ms 22264 KB Output is correct
16 Correct 58 ms 25464 KB Output is correct
17 Correct 91 ms 25464 KB Output is correct
18 Execution timed out 105 ms 31784 KB Time limit exceeded
19 Execution timed out 110 ms 31720 KB Time limit exceeded
20 Execution timed out 168 ms 31608 KB Time limit exceeded