CF593C Beautiful Function 构造

正解:构造

解题报告:

传送门!

我知道我咕了好几篇博客似乎,,,但我不听!我就是要发新博客QAQ!(理不直气也壮

这题,想明白了还是比较简单的QwQ实现起来似乎也没有很复杂QAQ

首先思考一下,显然不可能构造出一个简单的函数就能通过所有的圆,一定是要一个个对症下药的

那反正我们要让它一一对应干脆就让它都穿过圆心嘛多方便

然后就考虑,怎么做到让它都穿过圆心呢

显然我们最好是能做出一个函数大概长这样:f(t)=h1(t)+h2(t)+h3(t)+...

然后我们通过某种方式使得它刚好取到第一个圆圆心位置x1的时候只有h1有值为y1,其他各项都=0

第二个圆第三个圆同理

那怎么构出来呢?

为什么不问问神奇绝对值呢?

于是考虑到绝对值的美妙性质

然后就做完了

具体怎么利用不难请读者自行课后思考

大概说下怎么构造出来趴,,,QwQ

首先我们要知道我们需要的h1(t)可以满足只有在t=t1时有值其他时候是没有值的

然后我们就可以这样:

令d=|t-t1| 做出(1-d+|1-d|)

当t1!=t时d>0且d为整数,所以d>=1,然后就会变成1-d-(1-d)=0

只有x1=x时d=0就变成1+1=2

欧克理解了绝对值怎么用之后就差不多了鸭

就对圆i,就给f加上⌊xi/2⌋*(1-d+|1-d|)  给g加上⌊yi/2⌋*(1-d+|1-d|)

然后就做完了!

昂对了还有就是,因为这里的/2是直接向下取整了的嘛

所以事实上它有可能不能通过圆心,而是离圆心有1的距离

但是因为它保证了每个圆的r>=1所以没有关系!

最后吐槽一下,,,它的输出极玄学的,,,我jio得你会这题思路并不能说明你能A此题,,,反正我最后依然没有理解到底要怎么个输出法,,,规则极多:D

CF593C Beautiful Function 构造CF593C Beautiful Function 构造
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rp(i,x,y) for(register ll i=x;i<=y;++i)

inline ll read()
{
    register char ch=getchar();register ll x=0;register bool y=1;
    while(ch!='-' && (ch>'9' || ch<'0'))ch=getchar();
    if(ch=='-')ch=getchar(),y=0;
    while(ch>='0' && ch<='9')x=(x<<1)+(x<<3)+(ch^'0'),ch=getchar();
    return y?x:-x;
}

int point[51][3],n;

void solve(int l , int r , int dir)
{
    if(l==r)printf("(%01d*abs(((1-abs((t-%d)))+abs((abs((t-%d))-1)))))",point[l][dir]/2,l,l);
    else{printf("(");solve(l,(l+r)>>1,dir);printf("+");solve(((l+r)>>1)+1,r,dir);printf(")");}
}

int main()
{
    n=read();
    rp(i,1,n)point[i][0]=read(),point[i][1]=read(),point[i][2]=read();\
    solve(1,n,0);printf("\n");solve(1,n,1);
    return 0;
}
所以这个是拿的神仙的代码,,,只改了下格式和读入QAQ