zoukankan      html  css  js  c++  java
  • 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
    ",i-1);
    70     for (j=1;j<i;j++) printf("%d %d
    ",ans[j].x,ans[j].y);
    71 }
  • 相关阅读:
    使用PaintCode便捷地实现动画效果
    程序员常用markdown语法记忆小结之博客园markdown编辑器的效果
    kafka-重复消费-1
    nosql
    ThreadLocal
    内存溢出、内存泄漏
    springboot邮件服务
    三次握手、四次挥手
    悲观锁乐观锁简单整理
    beanstalkd
  • 原文地址:https://www.cnblogs.com/third2333/p/7636560.html
Copyright © 2011-2022 走看看