点此进入比赛

\(A\):><(点此看题面

大致题意: 给你一个长度为\(n-1\)、由\(<\)和\(>\)组成的的字符串,第\(i\)位的字符表示第\(i\)个数和第\(i+1\)个数的大小关系,求这个由非负整数组成的数组中元素和的最小值。

送分题都想了几分钟才做出来,真是退役预警......

显然,对于所有小于两旁的数,我们给它赋值为\(0\),然后再从它们向两边扩展即可。

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 500000
#define Gmax(x,y) (x<(y)&&(x=(y)))
using namespace std;
int n,H=1,T=0,a[N+5],q[N+5],vis[N+5];string s;
int main()
{
RI i,k;cin>>s,n=s.length()+1,s="%"+s+"%",s[1]=='<'&&(q[++T]=1),s[n-1]=='>'&&(q[++T]=n);
for(i=2;i^n;++i) s[i-1]=='>'&&s[i]=='<'&&(q[++T]=i);W(H<=T) k=q[H++],
s[k-1]=='>'&&(Gmax(a[k-1],a[k]+1),!vis[k-1]&&(vis[q[++T]=k-1]=1)),//向左扩展
s[k]=='<'&&(Gmax(a[k+1],a[k]+1),!vis[k+1]&&(vis[q[++T]=k+1]=1));//向右扩展
long long ans=0;for(i=1;i<=n;++i) ans+=a[i];return printf("%lld",ans),0;//统计答案
}

\(B\):Two Contests(点此看题面

大致题意: 有\(n\)个区间,让你把它划分成非空的两部分,使得两部分区间交集大小之和最大。

首先,我们要知道,对于一些区间\([l_i,r_i]\),它们的交集大小是\(max(min\{r_i\}-max\{l_i\}+1,0)\)。

因此,可以先将区间按左端点排序,然后枚举其中一个区间左端点最大值为\(l_i\),则另一个区间左端点最大值为\(l_n\)。

而对于右端点,有两种可能性。

设第\(1\sim i\)条线段中最小的\(r\)为\(r_{min}\),最大的为\(r_{max}\),第\(i+1\sim n\)中最小的\(r\)为\(Mn\)。

那么最优情况下,两个集合的\(min\{r_i\}\)要么分别是\(r_{min},Mn\),要么分别是\(r_{max},min(r_{min},Mn)\)。

确定了左端点和右端点,我们就可以因此而更新答案了。

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 100000
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
#define Gmax(x,y) (x<(y)&&(x=(y)))
using namespace std;
int n;set<int> p,q;
struct Il {int x,y;I bool operator < (Con Il& o) Con {return x<o.x;}}s[N+5];
class FastIO
{
private:
#define FS 100000
#define tc() (A==B&&(B=(A=FI)+fread(FI,1,FS,stdin),A==B)?EOF:*A++)
#define tn (x<<3)+(x<<1)
#define D isdigit(c=tc())
char c,*A,*B,FI[FS];
public:
I FastIO() {A=B=FI;}
Tp I void read(Ty& x) {x=0;W(!D);W(x=tn+(c&15),D);}
}F;
int main()
{
RI i,j,t,ans=0;for(F.read(n),i=1;i<=n;++i) F.read(s[i].x),F.read(s[i].y);
for(sort(s+1,s+n+1),i=1;i<=n;++i) q.insert(s[i].y);//排序,一开始默认所有线段在第二个集合
for(i=1;i<=n;++i) q.erase(s[i].y),p.insert(s[i].y),t=0,//枚举一个区间的左端点最大值,把对应右端点移入第一个集合中
Gmax(t,max(*--p.end()-s[i].x+1,0)+max(min(*p.begin(),*q.begin())-s[n].x+1,0)),//第一种情况
Gmax(t,max(*p.begin()-s[i].x+1,0)+max(*q.begin()-s[n].x+1,0)),Gmax(ans,t);//第二种情况,更新ans
return printf("%d",ans),0;
}

\(C\):Neither AB nor BA(点此看题面

大致题意: 对于一个由\(A,B,C\)三种字符组成的字符串,每次可以删除连续两个不为ABBA的字符,求有多少个长度为\(n\)的字符串可以删空。

首先,我们考虑不存在\(C\)的情况。

此时,若我们把奇数位上的\(A\)变成\(B\)、\(B\)成\(A\),就可以发现,当且仅当\(A\)和\(B\)的个数相同时,这个字符串可以删空。

同时由于改变后的字符串与原字符串一一对应,所以只要求出改变后的字符串的个数,就可以求出答案。

再考虑存在\(C\),由于\(C\)可以视为\(A\)或\(B\)中的任意一种,因此只要满足\(A\)和\(B\)的个数之差个数小于等于\(C\)的个数,就可以删空。

考虑这个答案可以容斥,即求出\(A\)和\(B\)的个数之差大于\(C\)的个数的方案数,然后用总方案数将其减去。

则此时必然存在\(A\)或\(B\)中的某一种有\(i\)个(\(i>\frac n2\)),而剩余\(n-i\)个位置可以任意填另一种字母和\(C\)。

即此时的方案数为:

\[C_n^i\times 2^{n-i}
\]

因此预处理阶乘及阶乘逆元,\(O(n)\)枚举\(i\),统计答案即可。

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 10000000
#define X 998244353
#define C(x,y) (1LL*Fac[x]*IFac[y]%X*IFac[(x)-(y)]%X)
using namespace std;
int n,Fac[N+5],IFac[N+5];
I int Qpow(RI x,RI y) {RI t=1;W(y) y&1&&(t=1LL*t*x%X),x=1LL*x*x%X,y>>=1;return t;}//快速幂
int main()
{
RI i,t=0;for(scanf("%d",&n),Fac[0]=i=1;i<=n;++i) Fac[i]=1LL*Fac[i-1]*i%X;//预处理阶乘
for(IFac[n]=Qpow(Fac[n],X-2),i=n-1;~i;--i) IFac[i]=1LL*IFac[i+1]*(i+1)%X;//预处理阶乘逆元
for(i=n/2+1;i<=n;++i) t=(1LL*C(n,i)*Qpow(2,n-i)+t)%X;//计算答案
return printf("%d",(Qpow(3,n)-2*t%X+X)%X),0;//容斥,注意乘2
}

\(D\):Balance Beam(占坑待填)

\(E\):Prefix Suffix Addition(占坑待填)

\(F\):Two Pieces(占坑待填)

【AtCoder】AtCoder Grand Contest 040 解题报告的更多相关文章

  1. 【AtCoder】AtCoder Grand Contest 035 解题报告

    点此进入比赛 \(A\):XOR Circle(点此看题面) 大致题意: 给你\(n\)个数,问是否能将它们摆成一个环,使得环上每个位置都是其相邻两个位置上值的异或值. 先不考虑\(0\),我们假设环 ...

  2. 【AtCoder】AtCoder Grand Contest 039 解题报告

    点此进入比赛 \(A\):Connection and Disconnection(点此看题面) 大致题意: 给你一个字符串,将它重复\(k\)次.进行尽量少的操作,每次修改一个位置上的字符,使得不存 ...

  3. AtCoder Beginner Contest 122 解题报告

    手速选手成功混进rated only里面的前30名,但是总排名就到110+了... A - Double Helix #include <bits/stdc++.h> #define ll ...

  4. AtCoder Beginner Contest 146解题报告

    题目地址 https://atcoder.jp/contests/abc146/tasks 感觉没有什么有意思的题... 题解 A #include <bits/stdc++.h> usi ...

  5. Atcoder Beginner Contest 124 解题报告

    心态爆炸.本来能全做出来的.但是由于双开了Comet oj一个比赛,写了ABC就去搞那个的B题 还被搞死了. 回来写了一会D就过了.可惜比赛已经结束了.真的是作死. A - Buttons #incl ...

  6. AtCoder Beginner Contest 118 解题报告

    A - B +/- A #include <bits/stdc++.h> int main() { int a, b; std::cin >> a >> b; b ...

  7. AtCoder Beginner Contest 120 解题报告

    为啥最近都没有arc啊... A - Favorite Sound #include <algorithm> #include <iostream> #include < ...

  8. AtCoder Beginner Contest 117 解题报告

    果然abc都是手速场. 倒序开的qwq. D题因为忘记1e12二进制几位上界爆了一发. A - Entrance Examination 就是除一下就行了... 看样例猜题意系列. #include& ...

  9. AtCoder Grand Contest 040

    Preface 今年准备省选啥都不说了,省选题基本上都做过一遍了,开始尝试板刷AGC 这场做完就从AGC001开始吧,感觉以我的速度和来机房的频率一个礼拜做一场都谢天谢地了 A - >< ...

随机推荐

  1. FCC---CSS Flexbox: Add Flex Superpowers to the Tweet Embed

    To the right is the tweet embed that will be used as the practical example. Some of the elements wou ...

  2. IDEA新建Spring配置文件的方法

    IDEA创建Spring Config 选择项目文件右键 输入文件名称即可 applicationContext.xml

  3. 使用“npm init”初始化项目

    使用npm init初始化项目 为什么要使用npm init初始化项目 在node开发中使用npm init会生成一个pakeage.json文件,这个文件主要是用来记录这个项目的详细信息的,它会将我 ...

  4. C# 执行 cmd 命令, 不显示任何窗口

    代码如下: 调用的命令:reg export exportPath registryKey -y Process proc = new Process(); proc.StartInfo.FileNa ...

  5. java.lang.IllegalStateException: Cannot call sendError() after the response has been committe

    1.问题描述 严重: Servlet.service() for servlet [default] in contextwith path [/OxygenCloud] threw exceptio ...

  6. Java IO系列之 ByteArrayInputStream

    http://www.cnblogs.com/skywang12345/p/io_02.html

  7. 关于操作服务器上tomcat的常用linux指令

    ll:     列出目录下的所有文件 cd:切换目录 pwd:显示目前的目录 grep  xxxxxx catalina.out    查询文件中关于某个信息的内容 grep -3  xxxxxxca ...

  8. 蓝牙spp协议分析

    基本概念 蓝牙串口是基于 SPP 协议(Serial Port Profile),能在蓝牙设备之间创建串口进行数据传输的一种设备. 蓝牙串口的目的是针对如何在两个不同设备(通信的两端)上的应用之间保证 ...

  9. Sql 中常用时间处理函数

    1.Sql 中常用时间处理函数  GETDATE()  返回当前的日期和时间 DATEPART()  返回日期/时间的单独部分 DATEADD()   返回日期中添加或减去指定的时间间隔 DATEDI ...

  10. Redis入门(一)-Redis简介

    最近几年,Rddis非常的火,受到广大中大型公司,特别是互联网公司的青睐.而作为后端开发,如果你不知道Redis或不会用,没用过,你都不好意思出去找工作.可想而知Redis对于IT行业意义多么重大.对 ...