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