正解:构造
解题报告:
我知道我咕了好几篇博客似乎,,,但我不听!我就是要发新博客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
#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