点我看题

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

所以我不写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. Mybatis源码解读-配置加载和Mapper的生成

    问题 Mybatis四大对象的创建顺序? Mybatis插件的执行顺序? 工程创建 环境:Mybatis(3.5.9) mybatis-demo,参考官方文档 简单示例 这里只放出main方法的示例, ...

  2. C++ 处理类型名(typedef,auto和decltype)

    随着程序越来越复杂,程序中用到的类型也越来越复杂,这种复杂性体现在两个方面.一是一些类型难于"拼写",它们的名字既难记又容易写错,还无法明确体现其真实目的和含义.二是有时候根本搞不 ...

  3. mysql防SQL注入搜集

    SQL注入 例:脚本逻辑 $sql = "SELECT * FROM user WHERE userid = $_GET[userid] "; 案例1:SELECT * FROM ...

  4. C#中引用类型的变量做为参数在方法调用时加不加 ref 关键字的不同之处

    ​ 一直以为对于引用类型做为参数在方法调用时加不加 ref 关键字是没有区别的.但是今天一调试踪了一下变量内存情况才发现大有不同. 直接上代码,结论是:以下代码是使用了 ref 关键字的版本.它输出1 ...

  5. powershell 执行策略

    前言 上一篇博文,我介绍了一下powershell和cmd的对比.通过学习,我发现powershell的确比cmd更加power,也更加适应现在的使用场景. 那么本文将继续介绍一个powershell ...

  6. ceph 006 rbd高级特性 rbd快照 镜像克隆 rbd缓存 rbd增量备份 rbd镜像单向同步

    版本 [root@clienta ~]# ceph -v ceph version 16.2.0-117.el8cp (0e34bb74700060ebfaa22d99b7d2cdc037b28a57 ...

  7. Excel 运算符(四):引用运算符

    引用运算符用于将单元格区域合并运算,包括:冒号.,逗号. 空格. : 运算 :运算符用于定义一个连续的数据区域,例如"A1:B3",表示从 A1 到 B3 的 6 个单元格. 并集 ...

  8. .Net Core使用Coravel实现任务调度

    前言 前段时间需要在一个新项目里添加两个后台任务,去定时请求两个供应商的API来同步数据:由于项目本身只是一个很小的服务,不太希望引入太重的框架,同时也没持久化要求:于是我开始寻找在Quartz.Ne ...

  9. 《HelloGitHub》第 77 期

    兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...

  10. django_day09_项目相关

    django_day09_项目相关 展示数据: 给模板一个querySet对象列表,循环出对象列表obj 普通字段 obj.字段名 ----> 数据库中的数据 外键 obj.外键 ------- ...