답안 #119333

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

#define ll long long

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

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(; !om[x]; ++c, x=od[x]);
	for(; x; x=od[x])
		r=r*10+om[x];
	for(; r; r=od[r])
		putchar_unlocked(om[r]+'0');
	while(c--)
		putchar_unlocked('0');
}

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);
	memset(tp, -1, 4*n);
	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;
			if(tp[i]<0||a[b[j]][0]+a[b[j]][1]<a[tp[i]][0]+a[tp[i]][1])
				tp[i]=b[j];
		}
	}
	c[n]=c[0];
	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]]);
			r[k].push_back({c[e1[i]], i});
			r[k].push_back({c[e2[i]]-(1<<k), i});
		}
	}
	memset(t[1], -1, 4*n);
	for(int i=17; ~i; --i) {
		for(array<int, 2> a : r[i])
			t[i&1][a[0]]=min(a[1], t[i&1][a[0]], scmp);
		if(i) {
			memset(t[i&1^1], -1, 4*n);
			for(int j=0; j<=n-(1<<i); ++j) {
				t[i&1^1][j]=min(t[i&1][j], t[i&1^1][j], scmp);
				t[i&1^1][j+(1<<i-1)]=min(t[i&1][j], t[i&1^1][j+(1<<i-1)], scmp);
			}
		}
	}
	for(int i=0; i<n; ++i)
		if(~tp[i]&&(t[0][i]<0||!cw(e1[t[0][i]], e2[t[0][i]], tp[i])))
			ans[tp[i]]=1;
	for(int i=0; i<n; ++i)
		a1+=ans[i];
	for(int i=0; i*10<MG1; ++i) {
		for(int j=0; j<=9&&i*10+j<MG1; ++j) {
			od[i*10+j]=i;
			om[i*10+j]=j;
		}
	}
	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:85:14: warning: suggest parentheses around arithmetic in operand of '^' [-Wparentheses]
    memset(t[i&1^1], -1, 4*n);
             ~^~
circuit.cpp:87:8: warning: suggest parentheses around arithmetic in operand of '^' [-Wparentheses]
     t[i&1^1][j]=min(t[i&1][j], t[i&1^1][j], scmp);
       ~^~
circuit.cpp:87:35: warning: suggest parentheses around arithmetic in operand of '^' [-Wparentheses]
     t[i&1^1][j]=min(t[i&1][j], t[i&1^1][j], scmp);
                                  ~^~
circuit.cpp:88:8: warning: suggest parentheses around arithmetic in operand of '^' [-Wparentheses]
     t[i&1^1][j+(1<<i-1)]=min(t[i&1][j], t[i&1^1][j+(1<<i-1)], scmp);
       ~^~
circuit.cpp:88:21: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
     t[i&1^1][j+(1<<i-1)]=min(t[i&1][j], t[i&1^1][j+(1<<i-1)], scmp);
                    ~^~
circuit.cpp:88:44: warning: suggest parentheses around arithmetic in operand of '^' [-Wparentheses]
     t[i&1^1][j+(1<<i-1)]=min(t[i&1][j], t[i&1^1][j+(1<<i-1)], scmp);
                                           ~^~
circuit.cpp:88:57: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
     t[i&1^1][j+(1<<i-1)]=min(t[i&1][j], t[i&1^1][j+(1<<i-1)], scmp);
                                                        ~^~
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 8192 KB Output is correct
2 Correct 9 ms 8192 KB Output is correct
3 Correct 9 ms 8448 KB Output is correct
4 Correct 10 ms 8656 KB Output is correct
5 Correct 12 ms 8832 KB Output is correct
6 Correct 13 ms 8932 KB Output is correct
7 Correct 18 ms 9600 KB Output is correct
8 Correct 12 ms 8704 KB Output is correct
9 Correct 11 ms 8960 KB Output is correct
10 Correct 12 ms 8832 KB Output is correct
11 Correct 13 ms 8960 KB Output is correct
12 Correct 14 ms 9600 KB Output is correct
13 Correct 23 ms 10228 KB Output is correct
14 Correct 21 ms 10744 KB Output is correct
15 Correct 25 ms 11380 KB Output is correct
16 Correct 43 ms 14440 KB Output is correct
17 Correct 63 ms 14564 KB Output is correct
18 Correct 77 ms 20496 KB Output is correct
19 Correct 78 ms 20704 KB Output is correct
20 Execution timed out 146 ms 20572 KB Time limit exceeded