T1
大水题一道,然而我死活没想到,维护了很多没有用的东西,其实离正解不太远,但就是想不到,我是折叠之后修正了每个点所在的位置,但是事实上只有后面的翻折点更新他的位置才有意义,所以只需要更新后面没用到的点的新位置即可
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #define maxn 3010 5 #define int long long 6 using namespace std; 7 int n,m,l,r; 8 int d[maxn]; 9 signed main() 10 { 11 //freopen("1.in","r",stdin); 12 //freopen("1W.out","w",stdout); 13 scanf("%lld%lld",&n,&m); l=0; r=n; 14 for(int i=1;i<=m;++i) scanf("%lld",&d[i]); 15 for(int i=1;i<=m;++i) 16 { 17 int len1=d[i]-l,len2=r-d[i]; 18 if(len1>=len2) 19 { 20 for(int j=i+1;j<=m;++j) 21 if(d[j]>=d[i]&&d[j]<=r) d[j]=2*d[i]-d[j]; 22 r=d[i]; 23 } 24 else 25 { 26 for(int j=i+1;j<=m;++j) 27 if(d[j]>=l&&d[j]<=d[i]) d[j]=2*d[i]-d[j]; 28 l=d[i]; 29 } 30 } 31 printf("%lld\n",r-l); 32 return 0; 33 }
T2
考场$exgcd$打挂了,记了一个假的板子,当然,事实上$exgcd$我是学一次忘一次,非常尴尬,当然考场上没有暴力枚举很可惜,以为自己的$exgcd$是对的,这没办法,接下来上正解,前方数学题,请自备纸笔
首先对于原式子${L}\leq{S*x{\%}M}\leq{R}$,我们可以想到如果不取模,也就是找的$S$的某个倍数符合条件,那么此时的$x$一定就是所求的最小正整数解,接下来我们考虑需要取模的情况,接下来是式子的化减及变形
${L}\leq{S*x{\%}M}\leq{R}$
$\Leftrightarrow$${L}\leq{S*x-M*y}\leq{R}$
$\Leftrightarrow$${-R}\leq{M*y-S*x}\leq{-L}$
$\Leftrightarrow$${-R{\%}S}\leq{M*y{\%}S}\leq{-L{\%}S}$
到此,这个式子又回到了最初的样子,那么我们像$exgcd$那样,打一个函数,不停的调用,就相当于我们是在不停的缩小问题规模,那么可以求解的边界就是出现了不需要${\%}S$的答案,那么此时的$y={\lceil}\frac{-R}{M}{\rceil}$,当然了此时的$-R$应该已经在取模意义下变为了正数,那再把$y$带回原式子,如果它满足${\leq}{-L}$就是一个合法解,否则继续递归下去,那么假设我们现在已经得到了一个合法的$y$,接下来就是通过$y$求解$x$,仿照$y$的求解过程,我们可以得到$x={\lceil}\frac{L+M*y}{S}{\rceil}$,依旧带回判断是否成立,即可得到最后的答案
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<iostream> 2 #include<cstdio> 3 #define int long long 4 using namespace std; 5 int t; 6 int maths(int l,int r,int mod1,int mod2) 7 { 8 if(l>mod2||l>r) return -1; 9 int x=(l-1)/mod1+1; 10 if(x*mod1<=r) return x; 11 int y=maths(((-r%mod1)+mod1)%mod1,((-l%mod1)+mod1)%mod1,mod2%mod1,mod1); 12 if(y==-1) return -1; 13 int ls=l+mod2*y-1; x=ls/mod1+1; 14 if(x*mod1-mod2*y<=r) return x; 15 return -1; 16 } 17 main() 18 { 19 scanf("%lld",&t); 20 while(t--) 21 { 22 int M,S,L,R; scanf("%lld%lld%lld%lld",&M,&S,&L,&R); 23 int ans=maths(L,min(R,M-1),S,M); printf("%lld\n",ans); 24 } 25 return 0; 26 }
T3
恶心人的类似数位DP的东西,依旧是鸽了