首页 > 其他分享 >我们有相遇的时间(time)

我们有相遇的时间(time)

时间:2023-08-04 22:55:18浏览次数:33  
标签:直线 getl int 相遇 tl 时间 time getp frac

终于还是写到这个了。。。

题意:

一个平面直角坐标系上,给你六个点,分别是 \((0,0),(0,1),(1,0),(1,1),(0,0.5),(1,0.5)\)。你随时可以做两种操作,第一种是选两个点的编号,在这两个点之间得到一条直线,这条直线的编号为上个直线编号加一,第二种选两条有交直线,并得到交点,交点编号为上个点编号加一。

现在给你四个参数 \(0<Xa<Xb<1e9,0<Ya<Yb<1e9\),构造一种操作方案得到点 \((\frac{Xa}{Xb},\frac{Ya}{Yb})\)。使操作一总次数不超过 \(270\) 次。

解法

考虑如何得到坐标轴上的任意一点,再做过这个点的平行坐标的线,求交就好了。\(X\) 轴 \(Y\) 轴本质一样,现在考虑 \(Y\) 轴上一点。一个很好的想法是这样:

1

上下两条线的情况本质是对称的,只需要得到两条线上的任意一点即可。

考虑倍增。每次将长度乘二或乘二加一。

实现方式是找到四个点 \((0,\frac{1}{3}),(\frac{1}{3},\frac{1}{3}),(1,\frac{5}{3}),(\frac{5}{3},\frac{5}{3})\),发现如果以 \((0,0)\) 和 \((1,1)\) 为基准点,当点在 \(y=1\) 上时,\(d\) 为它到 \((1,1)\) 距离,当在 \(y=0\) 上时为到 \((0,0)\) 的距离,那么以 \((0,0)\) 为起始点,\(d\) 初始为 \(0\)。若是当前点和 \((0,\frac{1}{3})\) 或 \((1,\frac{5}{3})\) 作直线交 \(y=0\) 或 \(y=1\) 于另一个点时,这个点的 \(d\) 会乘二并加一,如果是另外两个点的话就只会乘二。

如图,点 \(B\) 的 \(d\) 为 \(1\),连出两条直线于 \(y=1\) 交点的 \(d\) 分别是 \(3\) 和 \(2\)。

以此就可以倍增了。剩下的两件事,一是得到那四个点,而是作一条过任意点并平行于坐标轴的直线,这是初中直尺作图简单的,应该有一万种做法。

#include <bits/stdc++.h>
using namespace std;
int pid,lid;
struct opt{int type,a,b;};
vector<opt> Ans; 
inline int getl(int A,int B)
{Ans.push_back({1,A,B});++lid;return lid;}
inline int getp(int la,int lb)
{Ans.push_back({0,la,lb});++pid;return pid;}
struct solver{
    int A,B,C,D,M1,M2,I,E,F,G,H;
    int lf,lg;
    inline void beready()
    {
        lf=getl(A,B);lg=getl(C,D);
        int tl=getl(C,A),tr=getl(D,B);
        int tp=getl(B,M1),tq=getl(D,M2);
        F=getp(tl,tp),H=getp(tl,tq);
        tl=getl(C,M1),tr=getl(A,M2);
        int tmp1=getp(lf,tl),tmp2=getp(lg,tr);
        int cr=getl(tmp1,tmp2);
        E=getp(cr,getl(A,D)),G=getp(cr,getl(C,B));
    }
    int calc(int X,int opt)
    {
        int d=0;
        int nwp=((opt==0)?A:C);
        for(int i=30;i>=0;i--)
        {
            if(X&(1<<i))
            {
                if(((i&1)^opt)==0){nwp=getp(getl(nwp,E),lg);}
                else {nwp=getp(getl(nwp,G),lf);}
                d=d<<1|1;
            }
            else 
            {
                if(((i&1)^opt)==0){nwp=getp(getl(nwp,F),lg);}
                else {nwp=getp(getl(nwp,H),lf);}
                d=d<<1;
            }
        }
        return nwp;
    }
    inline int getP(int Ya,int Yb)
    {
        if(Ya==1&&Yb==2)return getl(M1,M2);
        int upP=calc(Yb-Ya+1,0);
        int dwP=calc(Ya,1);
        int RP=getp(getl(upP,dwP),getl(A,D));
        int RG=getp(getl(RP,I),getl(C,B));
        int tk=getp(lg,getl(A,M2));int tl=getp(lf,getl(D,M2));
        int EI=getp(getl(tk,B),getl(tl,C));
        return getl(RP,getp(getl(tk,tl),getl(RG,EI)));
    }
}SX,SY;
int Xa,Xb,Ya,Yb;
int A,B,C,D,M1,M2,M3,M4,I,ans=1;
int main()
{
//	freopen("ex_time1.in","r",stdin);
//	freopen("time.out","w",stdout); 
    scanf("%d%d%d%d",&Xa,&Xb,&Ya,&Yb);
    int g1=__gcd(Xa,Xb),g2=__gcd(Ya,Yb);
    Xa/=g1,Xb/=g1,Ya/=g2,Yb/=g2;
    pid=6;A=1,M1=2,D=3,B=4,M2=5,C=6;
    I=getp(getl(A,C),getl(B,D));
	M3=getp(getl(C,D),getl(getp(getl(getp(getl(C,M1),getl(B,A)),D),getl(B,C)),A));
    M4=getp(getl(M3,I),getl(A,B));
    SX.A=A,SX.B=B,SX.C=C,SX.D=D,SX.M1=M1,SX.M2=M2,SX.I=I;
    SY.A=A,SY.B=D,SY.C=C,SY.D=B,SY.M1=M4,SY.M2=M3,SY.I=I;
    SX.beready();SY.beready();
    int TY=SX.getP(Ya,Yb);
    int TX=SY.getP(Xa,Xb);
    ans=getp(TX,TY);
    printf("%d\n",Ans.size()+1);
    for(auto v:Ans)printf("%d %d %d\n",v.type,v.a,v.b);
    printf("2 %d\n",ans);
    return 0;
}

标签:直线,getl,int,相遇,tl,时间,time,getp,frac
From: https://www.cnblogs.com/hikkio/p/17607255.html

相关文章

  • Java Runtime.exec()的使用
    JavaRuntime.exec()的使用 Sun的doc里其实说明还有其他的用法:exec(String[]cmdarray,String[]envp,Filedir)Executesthespecifiedcommandandargumentsinaseparateprocesswiththespecifiedenvironmentandworkingdirectory.那个dir就是调用的程序......
  • centos7中安装 ntp时间同步服务器
     001、查看ntp服务状态[root@PC1home]#cat/etc/redhat-release##系统版本CentOSLinuxrelease7.6.1810(Core) 002、启动ntp服务[root@PC1home]#systemctlstartntpd##没有安装ntpd服务Failedtostartntpd.service:Unitnotfound. 003、使......
  • python fitz模块报错RuntimeError: Directory ‘static/’ does not exist 解决方案
    报错fitz模块报错RuntimeError:Directory‘static/’doesnotexist原因使用Python处理PDF文档时,需要使用fitz模块。由于Python3.8以上版本与fitz有兼容问题,会出现以下错误信息:RuntimeError:Directory‘static/’doesnotexist解决办法卸载fitz模块,安装pymupdf模块......
  • 时间复杂度如何计算?
    1.O(1)在这个案例中,println语句执行1次,return0语句执行1次,语句共执行2次。常数的时间复杂度为O(1)。intfunc1(){println("Hello,world");//执行1次return0;}2.O(n)在这个案例中,inti语句执行1次,i<n语句执行n+1次(最后1次是不符合判断),i++语句执行n次,println......
  • Linux文件与目录的三种时间状态(mtime,atime,ctime)区别
    最后一次修改文件或目录的时间最后一次改变文件或目录(改变的是原数据即:属性)的时间如:记录该文件的inode节点被修改的时间。touch命令除了-d和-t选项外都会改变该时间。而且chmod,chown等命令也能改变该值。最后一次访问文件或目录的时间对于文件:当修改mtime时,c......
  • 20W奖金+实习机会:阿里巴巴达摩院最新时间序列赛事来了!
     Datawhale赛事 赛事:2021“AIEarth”人工智能挑战赛2021“AIEarth”人工智能创新挑战赛,由阿里巴巴达摩院联合南京信息工程大学、国家气候中心、国家海洋环境预报中心、安徽省气象局共同创办。大赛以“AI助力精准气象和海洋预测”为主题,聚焦全球大气海洋研究前沿方向,推进人工智......
  • go语言基础-时间和日期
    time 包为我们提供了一个数据类型 time.Time(作为值使用)以及显示和测量时间和日期的功能函数。当前时间可以使用 time.Now() 获取,或者使用 t.Day()、t.Minute() 等等来获取时间的一部分;你甚至可以自定义时间格式化字符串,例如: fmt.Printf("%02d.%02d.%4d\n",t.Day(),t.Mon......
  • 年月日时间范围选择框
     <viewclass="search-bar-box"style="background:#fff;"@click="openPicker"><viewstyle="width:100%;height:100%;padding:024rpx;"><sofar-picker:visable.sync=&q......
  • 解读 --- System.Windows.Forms.Timer是前台线程吗?
    引言今天同事问了我一个问题,System.Windows.Forms.Timer是前台线程还是后台线程,我当时想的是它是跟着UI线程一起结束的,应该是前台线程吧?我确实没有仔细研究过他们的异同,所以带着这个疑问探究一下System.Windows.Forms.Timer。System.Windows.Forms.Timer机制System.Windows.F......
  • Qt TwinCAT3中的变量回调函数的时间戳读取方式
    官网提供了例程,官网真是个宝库。基本ADS的操作都里面有例程了,但是可能会稍微分散一点,不过多看几遍,也就慢慢整理你所需要的东西出来了。https://infosys.beckhoff.com/index_en.htm1#include<Windows.h>2#include<conio.h>3#include<winbase.h>45#include<TcA......