AtCoder Regular Contest 077 被虐记&题解
直到\(7:58\)才知道今天\(8:00\)有\(AtCoder\)的菜鸡来写题解啦.
C - pushpush
题目:
给定一个长为\(n\)的序列,第\(i\)次操作做如下的事 :
- 将\(a_i\)插入到数组\(b\)的尾部.
- 翻转数组\(b\).
一开始数组\(b\)为空,进行完所有操作后输出\(b\)数组。
\(n \leq 2\times 10^5,0\leq a_i \leq 10^9\)
题解:
用一个双端队列模拟就好了.
#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){
x=0;static char ch;static bool flag;flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
#define rg register int
#define rep(i,a,b) for(rg i=(a);i<=(b);++i)
#define per(i,a,b) for(rg i=(a);i>=(b);--i)
deque<int>q;
int main(){
int n;read(n);
int p = 1,x;
if(n&1) p ^= 1;
rep(i,1,n){
read(x);
if(p&1) q.push_back(x);
else q.push_front(x);
p ^= 1;
}
while(!q.empty()){
printf("%d",q.front());
q.pop_front();
if(q.empty()) putchar('\n');
else putchar(' ');
}
return 0;
}
D - 11
题目:
给定一个长度为\(n+1\)的序列\(a\),每个元素都在\([1,n]\)范围内且只有一种元素出现了两次.
对于\(k = 1 \space .. n+1\),求出长度为\(k\)的本质不同的子序列个数.
\(n \leq 10^5\)
题解:
如果所有的元素都不互相同那么\(ans_k = {n+1 \choose k}\)
那么处理出出现了两次的元素的下标\(p1,p2\),设\(d = p2 - p1 + 1\)
那么可以发现所有本质相同的子序列一定是因为这两个元素。
所以容易发现重复的方案为\(n+1-d \choose k-1\)
所以有: \(ans_k = {n+1 \choose k} - {n+1-1 \choose k-1}\)
预处理组合数做到单点\(O(1)\)
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){
x=0;static char ch;static bool flag;flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
#define rg register int
#define rep(i,a,b) for(rg i=(a);i<=(b);++i)
#define per(i,a,b) for(rg i=(a);i>=(b);--i)
const int maxn = 100010;
const int mod = 1e9+7;
int frac[maxn],inv[maxn];
inline int qpow(int x,int p){
int ret = 1;
for(;p;p>>=1,x=1LL*x*x%mod) if(p&1) ret=1LL*ret*x % mod;
return ret;
}
inline int C(int n,int m){
if(m > n) return 0;
return 1LL*frac[n]*inv[m]%mod*inv[n-m]%mod;
}
int last[maxn];
int main(){
int n;read(n);++ n;
frac[0] = 1;
rep(i,1,n) frac[i] = 1LL*i*frac[i-1] % mod;
inv[n] = qpow(frac[n],mod-2);
per(i,n-1,0) inv[i] = 1LL*inv[i+1]*(i+1) % mod;
int x,p1,p2;
rep(i,1,n){
read(x);
if(last[x] != 0){
p1 = last[x];
p2 = i;
}
last[x] = i;
}
int num = n - (p2 - p1 + 1);
rep(k,1,n){
int ans = C(n,k) - C(num,k-1);
if(ans < 0) ans += mod;
printf("%d\n",ans);
}
return 0;
}
E - guruguru
题目:
现在有一个数字\(x\)和一个上限\(m\),进行第一种操作可以使\(x \to x+1\),若当前的\(x = m\)那么第一种操作会\(x \to 1\).
第二种操作会使得\(x \to k\)其中\(k\)是一个常量.
现在给定一个长为\(n\)的序列\(a\),你需要让这个数依次变成\(a_2,a_3,...,a_n\)
初始的数为\(a_1\),你需要确定一个常数\(k\)使得最少的操作次数最小.
$n,m \leq 10^5 $
题解:
容易发现对于每两个相邻的数\(a_i,a_{i+1}\),对整个\(k\)选择区间造成的影响总是可以拆成:
- 一个常数数列和两个等差数列
- 一个等差数列和两个常数数列
这个东西直接拆开用线段树维护即可。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(ll &x){
x=0;static char ch;static bool flag;flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
#define rg register int
#define rep(i,a,b) for(rg i=(a);i<=(b);++i)
#define per(i,a,b) for(rg i=(a);i>=(b);--i)
const ll maxn = 100010;
ll a[maxn],d[maxn],n,m;
ll lazy[maxn<<2],tag[maxn<<2],num[maxn<<2];
void modify(ll rt,ll l,ll r,ll L,ll R,ll v){
if(L <= l && r <= R){
lazy[rt] += v;
return ;
}
ll mid = l+r >> 1;
if(L <= mid) modify(rt<<1,l,mid,L,R,v);
if(R > mid) modify(rt<<1|1,mid+1,r,L,R,v);
}
void insert(ll rt,ll l,ll r,ll L,ll R,ll s){
if(L <= l && r <= R){
tag[rt] += s;++ num[rt];
return ;
}
ll mid = l+r >> 1;
if(R <= mid) insert(rt<<1,l,mid,L,R,s);
else if(L > mid) insert(rt<<1|1,mid+1,r,L,R,s);
else{
insert(rt<<1,l,mid,L,mid,(R-mid)+s);
insert(rt<<1|1,mid+1,r,mid+1,R,s);
}
}
ll res;
void query(ll rt,ll l,ll r,ll p){
res += lazy[rt];
res += tag[rt] + num[rt]*(r - p);
if(l == r) return ;
ll mid = l+r >> 1;
if(p <= mid) query(rt<<1,l,mid,p);
else query(rt<<1|1,mid+1,r,p);
}
int main(){
read(n);read(m);
rep(i,1,n){
read(a[i]);
if(i > 1){
ll x = (a[i] - a[i-1] + m) % m;
if(a[i] > a[i-1]){
modify(1,1,m,1,a[i-1],x);
if(a[i]+1 <= m) modify(1,1,m,a[i]+1,m,x);
if(a[i-1]+1 <= a[i]) insert(1,1,m,a[i-1]+1,a[i],1);
}else{
modify(1,1,m,a[i]+1,a[i-1],x);
insert(1,1,m,1,a[i],1);
if(a[i-1]+1 <= m) insert(1,1,m,a[i-1]+1,m,a[i]+1);
}
}
}
ll ans = 1LL << 60;
rep(i,1,m){
res = 0;query(1,1,m,i);
ans = min(ans,res);
}
printf("%lld\n",ans);
return 0;
}
做题经历
开眼看题发现\(T1\)一个双端队列就搞定了啊。
然后听到旁边的\(gls\)说第一题跟\(a+b\)差不多水吧.
... ... ... ... ... ...
然后发现\(gls\)注册的是\(Beginner\space Contest\)...
\(shs\)不小心把\(T1\) \(Wa\)了一发.
\(T2\)大家都是一边过直接秒了.
貌似\(T3\)只有我这个\(SB\)写了颗线段树。
$shs \space : \(我就写的差分啊
\)lrd \space : $差分不就行了,用个卵的线段树啊?
我承认我写了个卵。。。
dalao 们都太强了!
AtCoder Regular Contest 077 被虐记&题解的更多相关文章
- AtCoder Regular Contest 094 (ARC094) CDE题解
原文链接http://www.cnblogs.com/zhouzhendong/p/8735114.html $AtCoder\ Regular\ Contest\ 094(ARC094)\ CDE$ ...
- AtCoder Regular Contest 077 C - pushpush
题目链接:http://arc077.contest.atcoder.jp/tasks/arc077_a Time limit : 2sec / Memory limit : 256MB Score ...
- AtCoder Regular Contest 077
跟身在国外的Marathon-fan一起打的比赛,虽然最后没出F但还是涨分了. C - pushpush 题意:n次操作,每次往一个序列后面塞数,然后把整个序列翻转. #include<cstd ...
- AtCoder Regular Contest 077 E - guruguru
https://arc077.contest.atcoder.jp/tasks/arc077_c 有m个点围成一个圈,按顺时针编号为1到m,一开始可以固定一个位置x,每次操作可以往顺时针方向走一步或直 ...
- AtCoder Regular Contest 077 D - 11
题目链接:http://arc077.contest.atcoder.jp/tasks/arc077_b Time limit : 2sec / Memory limit : 256MB Score ...
- AtCoder Regular Contest 077 E - guruguru 线性函数 前缀和
题目链接 题意 灯有\(m\)个亮度等级,\(1,2,...,m\),有两种按钮: 每次将亮度等级\(+1\),如\(1\rightarrow 2,2\rightarrow 3,...,m-1\rig ...
- 【arc077f】AtCoder Regular Contest 077 F - SS
题意 给你一个形如"SS"的串S,以及一个函数\(f(x)\),\(x\)是一个形如"SS"的字符串,\(f(x)\)也是一个形如"SS"的 ...
- AtCoder Regular Contest 128 部分题题解
关于鄙人罚坐两小时那件事...该开始看A题,这不就是个DP记录路径吗?Wrong了,嗯,我没用double,又Wrong,怎么回事,使劲检查自己的算法和细节问题,一个小时过去了,...这没错啊,又反复 ...
- AtCoder Regular Contest 096
AtCoder Regular Contest 096 C - Many Medians 题意: 有A,B两种匹萨和三种购买方案,买一个A,买一个B,买半个A和半个B,花费分别为a,b,c. 求买X个 ...
随机推荐
- MarkDown初学者使用指南
换MarkDown编辑器了,突然发现自己不会,尴尬!所以顺便总结下Markdown的常用语法 标题 一级标题(格式:#+XXXXX) 二级标题(格式:##+XXXXXX) 三级标题(格式:###+XX ...
- 详解Linux系统下PXE服务器的部署过程
在大规模安装服务器时,需要批量自动化方法来安装服务器,来减少日常的工作量. 但是批量自动化安装服务器的基础是网络启动服务器(bootserver). 下面我们就介绍一下 网络启动服务器的 安装和配置方 ...
- Spring框架下Junit测试
Spring框架下Junit测试 一.设置 1.1 目录 设置源码目录和测试目录,这样在设置产生测试方法时,会统一放到一个目录,如果没有设置测试目录,则不会产生测试代码. 1.2 增加配置文件 Res ...
- CSS + Jquery
关于 position 1.父视图通过设置relative 子视图设置absolute ,这样可以相当于父视图来设置. 2.relative 不脱离文本流 位置还保留着 3.absolute 脱离 ...
- Java中的equals学习小结
Java中的equals是十分重要的,和= =要区别开来,现在小结其主要内容,而且要将 = =和 equals列为重要的对比概念来学习 1.声明格式 public boolean equals ...
- 修改Tomcat默认端口号,避免与IDEA冲突
修改Tomcat默认端口号,避免与IDEA冲突 APT安装默认位置如下 /var/lib/tomcat8/conf 修改server.xml中的8080端口为8088或其他. 重启服务,试试看效果. ...
- Eclipse的编码格式设置
在使用Eclipse开发中,许多文件编码默认是ISO-8859-1,不支持中文(如常用的JSP).这样我们每次建文件都要手动改编码,其实我们可以在设置文件默认编码,今后再创建时就不用每次修改编码了, ...
- 智课雅思词汇---二十三、名词性后缀mony
智课雅思词汇---二十三.名词性后缀mony 一.总结 一句话总结:Latin: action, result of an action or condition; a suffix that for ...
- js的onclick字符串参数的解决办法
<a href='#' onclick='onedit(\""+ name + "\")';>编辑</a>" 一些写法实例~~ ...
- Oracle DBLink连接数过多的问题(Ora-02020)
前不久开发人员编译存储时报ORA -02020 错,如下是解决方案步骤. 报错全信息: Error:OR A -04052在查: 找远程对象 NIP.PB_PERADDRESSLIST@DB_NI ...