8.14题解

Posted hzjuruo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8.14题解相关的知识,希望对你有一定的参考价值。

T1

大水题一道,然而我死活没想到,维护了很多没有用的东西,其实离正解不太远,但就是想不到,我是折叠之后修正了每个点所在的位置,但是事实上只有后面的翻折点更新他的位置才有意义,所以只需要更新后面没用到的点的新位置即可

技术图片
 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 
View Code

T2

考场$exgcd$打挂了,记了一个假的板子,当然,事实上$exgcd$我是学一次忘一次,非常尴尬,当然考场上没有暴力枚举很可惜,以为自己的$exgcd$是对的,这没办法,接下来上正解,前方数学题,请自备纸笔

首先对于原式子$L\leqS*x\%M\leqR$,我们可以想到如果不取模,也就是找的$S$的某个倍数符合条件,那么此时的$x$一定就是所求的最小正整数解,接下来我们考虑需要取模的情况,接下来是式子的化减及变形

  $L\leqS*x\%M\leqR$

$\Leftrightarrow$$L\leqS*x-M*y\leqR$

$\Leftrightarrow$$-R\leqM*y-S*x\leq-L$

$\Leftrightarrow$$-R\%S\leqM*y\%S\leq-L\%S$

到此,这个式子又回到了最初的样子,那么我们像$exgcd$那样,打一个函数,不停的调用,就相当于我们是在不停的缩小问题规模,那么可以求解的边界就是出现了不需要$\%S$的答案,那么此时的$y=\lceil\frac-RM\rceil$,当然了此时的$-R$应该已经在取模意义下变为了正数,那再把$y$带回原式子,如果它满足$\leq-L$就是一个合法解,否则继续递归下去,那么假设我们现在已经得到了一个合法的$y$,接下来就是通过$y$求解$x$,仿照$y$的求解过程,我们可以得到$x=\lceil\fracL+M*yS\rceil$,依旧带回判断是否成立,即可得到最后的答案

T3

恶心人的类似数位DP的东西,依旧是鸽了

以上是关于8.14题解的主要内容,如果未能解决你的问题,请参考以下文章

正睿2018暑假集训 比赛题选做

8.14 内置方法

双周赛 52,单周赛 241 题解

精LintCode领扣算法问题答案:入门

8.8~8.14

题解目录