• AGC036 A-Triangle | 构造


    题目链接

    题意:

    给出一个数$S(1leqslant S leqslant 10^{18})$。

    要求在平面直角坐标系中找到三个点$(X_1,Y_1),(X_2,Y_2),(X_3,Y_3)$,满足$0leqslant X_1,Y_1,X_2,Y_2,X_3,Y_3 leqslant 10^9$且以这三个点为顶点的三角形的面积等于$dfrac{S}{2}$。输出任意一种方案。

     

    题解:

    比赛时做这题做到自闭。

    考虑令$(X_1,Y_1)$为$(0,0)$,那么最后形成的三角形就会类似于下面这样子。

    如图,用矩形面积减去周围三个三角形面积可得所求三角形面积为$dfrac{1}{2}  X_3 Y_2 - dfrac{1}{2} X_2 Y_3$。

    那么我们就要使得$dfrac{1}{2} X_3 Y_2 - dfrac{1}{2} X_2 Y_3 = dfrac{S}{2}$,即$X_3 Y_2 - X_2 Y_3 = S$。

    考虑令$(X_2,Y_2)$为$(1,10^9)$,那么就有$10^9 X_3  - Y_3 = S$。

    由于坐标均为非负数,所以一定有$10^9 X_3 geqslant S$,那$-Y_3$可以看成是在减去$10^9 X_3$比$S$多出来的部分。

    所以我们只要找到一个最小的$X_3$,使得$10^9 X_3 geqslant S$,再使$Y_3=10^9 X_3 - S$即可。

    这样子处理,求出来的$X_3$和$Y_3$一定是小于等于$10^9$的。

    然后我们就做完了。

    #include<iostream>
    #include<cstdio>
        using namespace std;
        const long long k=1e9;
    int main()
    {
        long long S=0;
        scanf("%lld",&S);
        long long x1=0,y1=0;
        long long x2=1,y2=k;
        long long x3=S/k+(S%k!=0),y3=x3*k-S;
        printf("%lld %lld %lld %lld %lld %lld",x1,y1,x2,y2,x3,y3);
        return 0;
    }
    AGC036 A

    做题时思维要发散,可以先猜想一些结论,然后再去慢慢验证,最后得出正解。

  • 相关阅读:
    Vue-cli
    vue—cli脚手架
    车联网——安全
    技术游玩
    高效寻找GitHub开源项目
    【孤*执】#2019SX# 最后der省选模板总结 ——BY.hss
    【浮*光】#状态压缩# 状压DPの相关练习题
    【浮*光】#字符串# 字符串の相关练习题
    【暖*墟】#数据结构# 可持久化Trie 与 XOR问题
    【浮*光】#数据结构# 数据结构の相关练习题
  • 原文地址:https://www.cnblogs.com/wozaixuexi/p/11325502.html
Copyright © 2020-2023  润新知