考虑c固定时快速算出所有位置的最小差异值,
把平方拆掉后构造一下发现是个卷积形式,fft即可。
m的范围很小,且答案关于m是一个单峰函数,所以我一开始以为是三分m,算了算复杂度好像很可过的样子,
写出来后发现不开O2只有70分(BZOJ可过)
看了别人的程序才知道c可以直接算出来!!!
其实只要让两个环上的总和最接近,答案就是最小的。
1 #include2 #define R register 3 #define db double 4 using namespace std; 5 const int N=50010,oo=INT_MAX; 6 const db PI=acos(-1); 7 int n,nn,m,x[N<<2],y[N<<2],rev[N<<2],maxp,s; 8 int read(){ 9 int x=0,w=1;char c=0;10 while(c<'0'||c>'9') c=getchar();11 while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();12 return x*w;13 }14 struct Com{15 db real,image;16 Com operator+(const Com& k)const{ return (Com){real+k.real,image+k.image};}17 Com operator-(const Com& k)const{ return (Com){real-k.real,image-k.image};}18 Com operator*(const Com& k)const{ return (Com){real*k.real-image*k.image,real*k.image+image*k.real};}19 Com operator/(const int& k)const{ return (Com){real/k,image/k};}20 }fa[N<<2],fb[N<<2],fc[N<<2];21 inline void fft(Com* a,int b){22 for(R int i=0;i i) swap(a[rev[i]],a[i]);23 for(R int len=2;len<=s;len<<=1){24 Com wn=(Com){cos(2.0*PI/len),b*sin(2.0*PI/len)};25 for(R int i=0;i>1);j++,w=w*wn){28 Com a0=a[i+j],a1=w*a[i+j+(len>>1)];29 a[i+j]=a0+a1,a[i+j+(len>>1)]=a0-a1;30 }31 }32 }33 if(b==-1) for(R int i=0;i>1]>>1)^(((i&1)<<(maxp-1)));60 for(int i=0;i
三分代码:
1 #include2 #define R register 3 #define db double 4 using namespace std; 5 const int N=50010,oo=INT_MAX; 6 const db PI=acos(-1); 7 int n,nn,m,x[N<<2],y[N<<2],rev[N<<2],maxp,s; 8 int read(){ 9 int x=0,w=1;char c=0;10 while(c<'0'||c>'9') c=getchar();11 while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();12 return x*w;13 }14 struct Com{15 db real,image;16 Com operator+(const Com& k)const{ return (Com){real+k.real,image+k.image};}17 Com operator-(const Com& k)const{ return (Com){real-k.real,image-k.image};}18 Com operator*(const Com& k)const{ return (Com){real*k.real-image*k.image,real*k.image+image*k.real};}19 Com operator/(const int& k)const{ return (Com){real/k,image/k};}20 }fa[N<<2],fb[N<<2],fc[N<<2];21 void fft(Com* a,int b){22 for(R int i=0;i i) swap(a[rev[i]],a[i]);23 for(R int len=2;len<=s;len<<=1){24 Com wn=(Com){cos(2.0*PI/len),b*sin(2.0*PI/len)};25 for(R int i=0;i>1);j++,w=w*wn){28 Com a0=a[i+j],a1=w*a[i+j+(len>>1)];29 a[i+j]=a0+a1,a[i+j+(len>>1)]=a0-a1;30 }31 }32 }33 if(b==-1) for(R int i=0;i>1]>>1)^(((i&1)<<(maxp-1)));58 for(int i=0;i