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 }

 

posted @ 2017-10-08 09:15  third2333  阅读(232)  评论(0编辑  收藏  举报