点我看题

题目质量一言难尽(至少对我来说

所以我不写D的题解了


A - mod M

发现如果把M选成2,就可以把答案压到至多2。所以答案只能是1或2,只要判断答案能不能是1即可。如果答案是1,那么M必须是所有任意两个数的差的GCD的因子,只要检查这个GCD是否是1即可。实现的话之间取所有相邻两个数的GCD就行了。

时间复杂度\(O(nloga_i)\)。

点击查看代码
#include <bits/stdc++.h>

#define rep(i,n) for(int i=0;i<n;++i)
#define repn(i,n) for(int i=1;i<=n;++i)
#define LL long long
#define pii pair <int,int>
#define pb push_back
#define fi first
#define se second
#define mpr make_pair using namespace std; int n;
vector <int> v; int main()
{
cin>>n;
int x;
rep(i,n)
{
scanf("%d",&x);
v.pb(x);
}
sort(v.begin(),v.end());v.erase(unique(v.begin(),v.end()),v.end());
if(v.size()==1)
{
puts("1");
return 0;
}
int ans=0;
rep(i,v.size()-1) ans=__gcd(ans,v[i+1]-v[i]);
if(ans>1) puts("1");
else puts("2");
return 0;
}

B - dp

注意翻转次数可以是0的,所以先用原串更新一下答案。

考虑一个区间[l,r],我们把他翻转会是什么情况。首先这个区间中如果全是d肯定是不优的,不用考虑。其次,如果r的位置在原串中是d,那把r往左移,移到任意一个区间内p的位置再翻转,一定会更优。现在就已经确定了只有结尾是p的区间才可能被翻转,考虑一个右端点r,满足原串中它的位置是p,选择哪个左端点l翻转会最优(l可以等于r)。找出[0,r]中的第一个是p的位置x,很容易发现,如果l选在x右边,肯定不如直接选在x好。l选在x左边的话,如果[x,r]中全是p,那么显然选在x更好;否则找出[x,r]中最靠右的一个d,可以发现它会导致选x时的整个串第一个p的位置比选在x左边时的整个串第一个p的位置靠后,所以还是选在x最好。对于每个r,找出x,翻转[x,r],用这个串更新答案即可。

时间复杂度\(O(n^2)\)。

点击查看代码
#include <bits/stdc++.h>

#define rep(i,n) for(int i=0;i<n;++i)
#define repn(i,n) for(int i=1;i<=n;++i)
#define LL long long
#define pii pair <int,int>
#define pb push_back
#define fi first
#define se second
#define mpr make_pair using namespace std; int n;
string s,ans; int main()
{
cin>>n>>s;
ans=s;
rep(i,n) if(s[i]=='p')
{
string t=s;t[i]='d';
ans=min(ans,t);
t=s;
rep(j,i) if(s[j]=='p')
{
reverse(t.begin()+j,t.begin()+i+1);
for(int k=j;k<=i;++k) if(t[k]=='p') t[k]='d';else t[k]='p';
ans=min(ans,t);
break;
}
}
cout<<ans<<endl;
return 0;
}

C - Lights Out on Tree

注意到一个节点最终的状态是它一开始的状态 异或上 从根到它的路径上被翻转节点数的奇偶性。所以如果有上下两个相邻节点初始状态不同,那么下面那个一定要挨一次翻转。如果根节点初始状态是正面,那么它也需要被翻转一次。发现只要翻转了上面提到的几种节点,整棵树就满足要求了。接下来主要问题就是对父亲节点和自己的初始状态不懂的节点计数。这个也是很容易做到的,因为这种节点只有两种,一种是在\(S_i\)集合里的,还有一种是集合中节点的直接儿子。求出集合中节点的儿子数量之和再减一下就行了,细节不再赘述。

时间复杂度\(O(n)\)。

点击查看代码
#include <bits/stdc++.h>

#define rep(i,n) for(int i=0;i<n;++i)
#define repn(i,n) for(int i=1;i<=n;++i)
#define LL long long
#define pii pair <int,int>
#define pb push_back
#define fi first
#define se second
#define mpr make_pair using namespace std; int n,q,p[200010],sn[200010],mark[200010]; int main()
{
cin>>n>>q;
for(int i=2;i<=n;++i)
{
scanf("%d",&p[i]);
++sn[p[i]];
}
repn(qn,q)
{
int m,x,ans=0,sum=0;
scanf("%d",&m);
vector <int> v;
rep(i,m) scanf("%d",&x),v.pb(x),mark[x]=qn,sum+=sn[x];
rep(i,m) if(v[i]==1||mark[p[v[i]]]!=qn) ++ans;else --sum;
ans+=sum;
printf("%d\n",ans);
}
return 0;
}

E - ≥ K

对我来说这E比D简单多了

把相邻两个元素之和\(\geq k\)转化一下,可以把每一个数先都加上\(\frac k2\),然后条件就变成相邻两个数之和非负,然后就好办多了。k可能是奇数,所以先把输入的所有数都乘2。

把负数和非负数分开,发现最终序列的结构是这样:

\[\cdots 负数,非负数,非负数 \cdots(一堆非负数),负数,非负数,非负数 \cdots(一堆非负数),\cdots
\]

也就是不能有两个负数相邻。还有就是与负数相邻的数的绝对值不得小于这个负数的绝对值。

这启发我们按照绝对值从大到小往序列里放数,绝对值相同的先放非负数再放负数。这样负数在被插入时就不会违反上面的第二个条件。观察发现插入一个负数时其实是占用了两个非负数之间的空隙(也可以是序列头尾的空间),这个空隙以后不能再放任何数(非负数也不行,因为会违反第一个条件),也可以看成是把旁边的两个非负数合并成1个了。具体来说,在插入某个特定绝对值的数时:



接下来



然后

这样这题就做完了,实现很简单。时间复杂度\(O(nlogn)\)。

点击查看代码
#include <bits/stdc++.h>

#define rep(i,n) for(int i=0;i<n;++i)
#define repn(i,n) for(int i=1;i<=n;++i)
#define LL long long
#define pii pair <LL,LL>
#define pb push_back
#define fi first
#define se second
#define mpr make_pair using namespace std; const LL MOD=998244353; LL qpow(LL x,LL a)
{
LL res=x,ret=1;
while(a>0)
{
if((a&1)==1) ret=ret*res%MOD;
a>>=1;
res=res*res%MOD;
}
return ret;
} LL n,k,a[200010],ans=1,fac[400010],inv[400010];
map <LL,pii> mp; LL C(LL nn,LL mm){return fac[nn]*inv[mm]%MOD*inv[nn-mm]%MOD;} int main()
{
fac[0]=1;repn(i,400005) fac[i]=fac[i-1]*i%MOD;
rep(i,400003) inv[i]=qpow(fac[i],MOD-2);
cin>>n>>k;
rep(i,n) scanf("%lld",&a[i]),a[i]+=a[i]-k;
rep(i,n)
{
if(a[i]>=0) ++mp[-a[i]].fi;
else ++mp[a[i]].se;
}
LL len=1;
for(auto it:mp)
{
if(it.se.fi>0) (ans*=C(it.se.fi+len-1,len-1))%=MOD;
len+=it.se.fi;
if(it.se.se>len)
{
puts("0");
return 0;
}
(ans*=C(len,it.se.se))%=MOD;
len-=it.se.se;
}
cout<<ans<<endl;
return 0;
}

这几题代码都很短诶

[题解] Atcoder Regular Contest ARC 148 A B C E 题解的更多相关文章

  1. [题解] Atcoder Regular Contest ARC 146 A B C D 题解

    点我看题 A - Three Cards 先把所有数按位数从多到少排序,答案的位数一定等于位数最多的三个数的位数之和\(tot\).对于每个i,把有i位的数排序,并记录每个i的排序结果.最后枚举答案中 ...

  2. [题解] Atcoder Regular Contest ARC 147 A B C D E 题解

    点我看题 A - Max Mod Min 非常诈骗.一开始以为要观察什么神奇的性质,后来发现直接模拟就行了.可以证明总操作次数是\(O(nlog a_i)\)的.具体就是,每次操作都会有一个数a被b取 ...

  3. [题解] Atcoder Regular Contest ARC 151 A B C D E 题解

    点我看题 昨天刚打的ARC,题目质量还是不错的. A - Equal Hamming Distances 对于一个位置i,如果\(S_i=T_i\),那么不管\(U\)的这个位置填什么,对到\(S\) ...

  4. AtCoder Regular Contest 094 (ARC094) CDE题解

    原文链接http://www.cnblogs.com/zhouzhendong/p/8735114.html $AtCoder\ Regular\ Contest\ 094(ARC094)\ CDE$ ...

  5. AtCoder Regular Contest 096

    AtCoder Regular Contest 096 C - Many Medians 题意: 有A,B两种匹萨和三种购买方案,买一个A,买一个B,买半个A和半个B,花费分别为a,b,c. 求买X个 ...

  6. AtCoder Regular Contest 061

    AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...

  7. AtCoder Regular Contest 092

    AtCoder Regular Contest 092 C - 2D Plane 2N Points 题意: 二维平面上给了\(2N\)个点,其中\(N\)个是\(A\)类点,\(N\)个是\(B\) ...

  8. AtCoder Regular Contest 093

    AtCoder Regular Contest 093 C - Traveling Plan 题意: 给定n个点,求出删去i号点时,按顺序从起点到一号点走到n号点最后回到起点所走的路程是多少. \(n ...

  9. AtCoder Regular Contest 094

    AtCoder Regular Contest 094 C - Same Integers 题意: 给定\(a,b,c\)三个数,可以进行两个操作:1.把一个数+2:2.把任意两个数+1.求最少需要几 ...

随机推荐

  1. 安卓系统使用USB转串口

    概述 安卓系统支持多种 USB 外围设备,提供两种模式来支持实现 USB 外设接入系统:USB 配件模式和 USB 主机模式. 在 USB 配件模式下,接入的 USB 设备充当 USB 主机,并为 U ...

  2. 题解【P1833 樱花】

    题目 有 \(n\) 棵樱花,有三种: 只能看一次 最多看 \(A_i\) 遍 能无限看 看每棵樱花都需要一定时间 \(T_i\),求从 \(T_s\) 开始,到 \(T_e\) 结束(时间)最多能看 ...

  3. linux安全之网络设置

    可以通过/etc/sysctl.conf控制和配置Linux内核及网络设置. # 避免放大攻击 net.ipv4.icmp_echo_ignore_broadcasts = 1 # 开启恶意icmp错 ...

  4. YII学习总结5(视图)

    <?php namespace app\controllers; use yii\web\Controller; class HelloController extends Controller ...

  5. 「APIO2010」巡逻 题解

    来源 LCA 个人评价:lca求路径,让我发现了自己不会算树的直径(但是本人似乎没有用lca求) 1 题面 「APIO2010」巡逻 大意:有一个有n个节点的树,每条边权为1,一每天要从1号点开始,遍 ...

  6. 1个小时!从零制作一个! AI图片识别WEB应用!

    0 前言 近些年来,所谓的人工智能也就是AI. 在媒体的炒作下,变得神乎其神,但实际上,类似于图片识别的AI,其原理只不过是数学的应用. 线性代数,概率论,微积分(著名的反向传播算法). 大家觉得这些 ...

  7. 【springcloud】环境搭建与Rest使快速上手

    SpringCloud环境搭建 --- Rest使用 个人主页:https://www.cnblogs.com/xbudian/ 今天来到SpringCloud的学习,我们从spring boot微服 ...

  8. 稳定好用的短连接生成平台,支持API批量生成

    ​ https://www.5w.fit/ 01 安全:快码拥有两种模式:防封模式和极速模式,防封模式使短链更加安全! 02 无流量劫持:快码短链绝不劫持流量! 03 极速:专属大量服务器,支持高并发 ...

  9. 搞定面试官 - 可以介绍一下在 MySQL 中你平时是怎么使用 COUNT() 的嘛?

    大家好,我是程序员啊粥. 相信在大家的工作中,有很多的功能都需要用到 count(*) 来统计表中的数据行数.同时,对于一些大数据的表,用 count 都是瑟瑟发抖,往往会结合缓存等进行处理. 那么, ...

  10. EMAS Serverless系列~4步教你快速搭建小程序

    体验简介 本实验基于 EMAS Serverless 的云函数.云数据库.云存储等云服务能力一站式快速开发小程序<私人云相册>.Demo 主要包括如下功能: 1 相册管理 2 上传相片 3 ...