codeforces 568 D Sign Posts
Posted third2333
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codeforces 568 D Sign Posts相关的知识,希望对你有一定的参考价值。
codeforces 568 D Sign Posts
http://blog.csdn.net/u013023344/article/details/47704549
这题是搜索乱搞
因为不是最小点的解
设我们有L条直线 M 个点
如果点数大于直线数 直接每个点对应一个直线就行了
else 找到一个交点 该交点 覆盖了 x 个还没被覆盖的点
然后将 边数-=x 点数-=1
因为交点数量巨大
所以我们随机 两条边的交点 看这个交点是否满足
多次随机
1 #include<cstdio> 2 #include<ctime> 3 #include<cstdlib> 4 typedef long double lb; 5 typedef long long ll; 6 const int N=100100; 7 const lb eps=1e-12; 8 int i,j,k,n,m,nm,ch,ff; 9 int p[N]; 10 struct cc { int a,b,c;} A[N]; 11 struct dd { int x,y;} ans[9]; 12 void R(int &x) { 13 ff=x=0;ch=getchar(); 14 while (ch<‘0‘ || ‘9‘<ch) { if (ch==‘-‘) ff=1;ch=getchar();} 15 while (‘0‘<=ch && ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar(); 16 if (ff) x=-x; 17 } 18 int Rand() { 19 return rand()<<15|rand(); 20 } 21 int main() { 22 srand((int) time(0)); 23 R(n);R(m); 24 for (i=1;i<=n;i++) R(A[i].a),R(A[i].b),R(A[i].c); 25 for (i=1;i<=n;i++) p[i]=i; 26 nm=n; 27 for (i=1;i<=m && nm;i++) { 28 int ma=0,t1,t2; 29 for (j=1;j<=30;j++) { 30 int x=Rand()%nm+1,y=Rand()%nm+1; 31 if (x>y) { 32 int t=x;x=y;y=t; 33 } 34 x=p[x];y=p[y]; 35 if ((ll) A[x].a*A[y].b==(ll) A[y].a*A[x].b) { 36 if (1>ma) ma=1,t1=x,t2=-1; 37 continue; 38 } 39 lb X=((lb) A[y].c*A[x].b-(lb) A[x].c*A[y].b)/((lb) A[x].a*A[y].b-(lb) A[y].a*A[x].b); 40 lb Y=((lb) A[y].c*A[x].a-(lb) A[x].c*A[y].a)/((lb) A[x].b*A[y].a-(lb) A[y].b*A[x].a); 41 int cnt=0; 42 for (k=1;k<=nm;k++) { 43 lb t=X*A[p[k]].a+Y*A[p[k]].b+A[p[k]].c; 44 if (-eps<t && t<eps) cnt++; 45 } 46 if (cnt>ma) { 47 ma=cnt; 48 t1=x;t2=y; 49 } 50 } 51 ans[i].x=t1;ans[i].y=t2; 52 if (t2==-1) { 53 int tmp=nm;nm=0; 54 for (j=1;j<=tmp;j++) if (p[j]!=t1) p[++nm]=p[j]; 55 } 56 else { 57 int x=t1,y=t2; 58 lb X=((lb) A[y].c*A[x].b-(lb) A[x].c*A[y].b)/((lb) A[x].a*A[y].b-(lb) A[y].a*A[x].b); 59 lb Y=((lb) A[y].c*A[x].a-(lb) A[x].c*A[y].a)/((lb) A[x].b*A[y].a-(lb) A[y].b*A[x].a); 60 int tmp=nm;nm=0; 61 for (k=1;k<=tmp;k++) { 62 lb t=X*A[p[k]].a+Y*A[p[k]].b+A[p[k]].c; 63 if (!(-eps<t && t<eps)) p[++nm]=p[k]; 64 } 65 } 66 } 67 if (nm) return puts("NO"),0; 68 puts("YES"); 69 printf("%d\n",i-1); 70 for (j=1;j<i;j++) printf("%d %d\n",ans[j].x,ans[j].y); 71 }
以上是关于codeforces 568 D Sign Posts的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #568 (Div. 2)A
Codeforces Round #568 (Div. 2)B
codeforces 568a//Primes or Palindromes?// Codeforces Round #315 (Div. 1)
Codeforces 985 E - Pencils and Boxes
Codeforces Round #568 (Div. 2) F - Two Pizzas (状态压缩,暴力)
Codeforces Round #568 (Div. 2) G1. Playlist for Polycarp (easy version) (状压dp)