Codeforces Round #513 (rated, Div. 1 + Div. 2)
前记
眼看他起高楼;眼看他宴宾客;眼看他楼坍了。
比赛历程
开考前一分钟还在慌里慌张地订正上午考试题目。
“诶这个数位dp哪里见了鬼了???”瞥了眼时间,无奈而迅速地关去所有其他窗口,临时打了一个缺省源。
A. Phone Numbers
那么就是模拟。
#include<bits/stdc++.h> int n,x;
char s[]; int read()
{
char ch = getchar();
int num = ;
bool fl = ;
for (; !isdigit(ch); ch=getchar())
if (ch=='-') fl = ;
for (; isdigit(ch); ch=getchar())
num = (num<<)+(num<<)+ch-;
if (fl) num = -num;
return num;
}
int main()
{
n = read();
scanf("%s",s);
for (int i=; i<n; i++)
if (s[i]=='') x++;
printf("%d\n",std::min(x, n/));
return ;
}
B. Maximum Sum of Digits
结论题。构造尽可能多的999……
#include<bits/stdc++.h>
typedef long long ll; ll n,num; long long read()
{
char ch = getchar();
long long num = ;
bool fl = ;
for (; !isdigit(ch); ch=getchar())
if (ch=='-') fl = ;
for (; isdigit(ch); ch=getchar())
num = (num<<)+(num<<)+ch-;
if (fl) num = -num;
return num;
}
ll calc(ll x)
{
ll ret=;
for (; x; x/=) ret += x%;
return ret;
}
int main()
{
n = read(), num = ;
while (num < n) num = num*+;
num /= ;
printf("%lld\n",calc(num)+calc(n-num));
return ;
}
C. Maximum Subrectangle
有点意思的题:找一个面积最大,权值和小于lim的矩阵。但是这个矩阵有个特殊性质:它不是没有规律地给定,而是由两个数列相乘构造而来。n<=2000.
做法一:
先枚举一个维,将这个维所有的段长和元素和都存下来,然后sort一下。另一维枚举,二分寻找最大能够匹配的段。
时间复杂度$O(n^2log_2n)$
做法二:
然而上面一个做法的浪费在于存下所有的段。注意到这个决策是单调的,对于长度相同的段,只有元素和最小的是有用的。那么对于两个维,都记录这个最小值。最后分别枚举两维的长度时直接匹配。
时间复杂度$O(n^2)$
#include<bits/stdc++.h>
const int maxn = ; struct node
{
int a,b;
bool operator < (node x) const
{
if (a < x.a) return a < x.a;
return b < x.b;
}
}sv[];
int a[maxn],b[maxn],n,m,lim;
int sa[maxn],sb[maxn];
int mna[maxn],mnb[maxn];
int cnt,ans; int read()
{
char ch = getchar();
int num = ;
bool fl = ;
for (; !isdigit(ch); ch=getchar())
if (ch=='-') fl = ;
for (; isdigit(ch); ch=getchar())
num = (num<<)+(num<<)+ch-;
if (fl) num = -num;
return num;
}
int main()
{
memset(mna, 0x3f3f3f3f, sizeof mna);
memset(mnb, 0x3f3f3f3f, sizeof mnb);
n = read(), m = read();
for (int i=; i<=n; i++) a[i] = read(), sa[i] = sa[i-]+a[i];
for (int i=; i<=m; i++) b[i] = read(), sb[i] = sb[i-]+b[i];
lim = read();
for (int i=; i<=n; i++)
for (int j=i; j<=n; j++)
mna[j-i+] = std::min(mna[j-i+], sa[j]-sa[i-]);
for (int i=; i<=m; i++)
for (int j=i; j<=m; j++)
mnb[j-i+] = std::min(mnb[j-i+], sb[j]-sb[i-]);
for (int i=; i<=n; i++)
for (int j=; j<=m; j++)
if (1ll*mna[i]*mnb[j] <= 1ll*lim)
ans = std::max(ans, i*j);
printf("%d\n",ans);
return ;
}
D. Social Circles
开场时候原本就打算手速D的,又恰巧总榜上D被秒掉了。于是弃了BC就去看D……
想了好久也没有什么靠谱做法,这时t老师6分钟就写完了D,瞬间心态崩坏。
想啊想啊,是个贪心?图论?然而一点没往结论题方向想。
没办法只能转回头去做C。脑子里一团浆糊,什么也想不进去。
最后是等到XCW在1:09大力猜结论过了pretest机房才大队人马过D。
大致题意:有n个人,每个人要求自己左边有li张空椅子;右边有ri张空椅子。可以把不同的人任意分组。问最小需要的总椅子数量。
结论是:这些人的左右手要求是可以互换的。那么就是排序之后取max。
好像现在官方题解还没出来?那么这个结论我也没法证明……
#include<bits/stdc++.h>
const int maxn = ; int n,a[maxn],b[maxn];
long long ans; int main()
{
scanf("%d",&n);
for (int i=; i<=n; i++) scanf("%d",&a[i]);
for (int i=; i<=n; i++) scanf("%d",&b[i]);
std::sort(a+, a+n+);
std::sort(b+, b+n+);
for (int i=; i<=n; i++) ans += std::max(a[i], b[i]);
printf("%lld\n",ans);
return ;
}
E. Sergey and Subway
花CD的时间太久了……E题题意直接去问同学了。
然而刚开始一段时间把题意理解错了。
大致题意:现在有一颗树,边权均为1。每次操作将原树上距离为2的点,在新树上连接一条边权为1的边。进行操作直到不能再操作为止。询问新树两两点对距离和。
首先是结论:原树上长度为$d$的路径,在新树上长度变为$\frac{d+1}{2}(向下取整)$。
这个比较容易理解:对于长度为2的路径,长度变为1;长度为1的路径,长度不变;然后任意一条路径都可以视作由2、1的路径拼接而成。
第一感觉是点分?但是一看时间不大对了直接去求助t老师了。
t老师:不用点分……一开始我写了一个很复杂的上下dp。这个题超傻逼的,只要枚举边计算贡献。然后计奇数路径条数。深度奇偶性不同的就是奇数路径。
哇好有道理的样子哦。想了想就开始码(然而中间还码错了点小细节耽搁一会),然后就愉快地过掉了。(但是毕竟还是手速太慢,E题最后只有1008的分)
#include<bits/stdc++.h>
const int maxn = ; long long ans;
int n,tot[maxn],dep[maxn],sum[];
int edges[maxn<<],nxt[maxn<<],head[maxn],edgeTot; int read()
{
char ch = getchar();
int num = ;
bool fl = ;
for (; !isdigit(ch); ch=getchar())
if (ch=='-') fl = ;
for (; isdigit(ch); ch=getchar())
num = (num<<)+(num<<)+ch-;
if (fl) num = -num;
return num;
}
void addedge(int u, int v)
{
edges[++edgeTot] = v, nxt[edgeTot] = head[u], head[u] = edgeTot;
edges[++edgeTot] = u, nxt[edgeTot] = head[v], head[v] = edgeTot;
}
void dfs(int x, int fa)
{
tot[x] = , dep[x] = dep[fa]+, sum[dep[x]&]++;
for (int i=head[x]; i!=-; i=nxt[i])
{
int v = edges[i];
if (v!=fa){
dfs(v, x);
tot[x] += tot[v];
long long t = 1ll*tot[v]*(n-tot[v]);
ans += t;
}
}
}
int main()
{
memset(head, -, sizeof head);
n = read();
for (int i=; i<n; i++) addedge(read(), read());
dfs(, );
ans += 1ll*sum[]*sum[];
printf("%lld\n",ans/);
return ;
}
xor则是发现了点分FFT的写法,恰巧以前度教出过一道类似的题,于是机房大队人马搬来自己代码争先恐后地过了pretest。
【后话:除了我和xor其他人都FST了;反正WA、RE、TLE全齐了】
后记
哎,暑假一共就打了两场,打得还非常差。现在也不过是一直在expert徘徊。
反观同级甚至初中的大佬,已经不是Grandmaster就是Master最差Candiate Master了。
考试时候依然起伏不定,思维发挥也没有达到所期望的那种地步。
即便是往年今日,zx2003也早就上紫了啊!
“How BAD do you want it?”

Codeforces Round #513 (rated, Div. 1 + Div. 2)的更多相关文章
- Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship
Problem Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship Time Limit: 2000 mSec P ...
- Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems(动态规划+矩阵快速幂)
Problem Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems Time Limit: 3000 mSec P ...
- Educational Codeforces Round 43 (Rated for Div. 2)
Educational Codeforces Round 43 (Rated for Div. 2) https://codeforces.com/contest/976 A #include< ...
- Educational Codeforces Round 35 (Rated for Div. 2)
Educational Codeforces Round 35 (Rated for Div. 2) https://codeforces.com/contest/911 A 模拟 #include& ...
- Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings
Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings 题目连接: http://cod ...
- Codeforces Educational Codeforces Round 44 (Rated for Div. 2) E. Pencils and Boxes
Codeforces Educational Codeforces Round 44 (Rated for Div. 2) E. Pencils and Boxes 题目连接: http://code ...
- Educational Codeforces Round 63 (Rated for Div. 2) 题解
Educational Codeforces Round 63 (Rated for Div. 2)题解 题目链接 A. Reverse a Substring 给出一个字符串,现在可以对这个字符串进 ...
- Educational Codeforces Round 39 (Rated for Div. 2) G
Educational Codeforces Round 39 (Rated for Div. 2) G 题意: 给一个序列\(a_i(1 <= a_i <= 10^{9}),2 < ...
- Educational Codeforces Round 48 (Rated for Div. 2) CD题解
Educational Codeforces Round 48 (Rated for Div. 2) C. Vasya And The Mushrooms 题目链接:https://codeforce ...
随机推荐
- ios 适配问题
两张图解决
- bzoj5492:[Hnoi2019]校园旅行
传送门 %%%myy 考虑30分做法:暴力bfs,\(f[i][j]\)表示\(i\)到\(j\)可以形成回文串 然而为什么我场上只想到了70分做法,完全没想到30分怎么写.. 100分: 考虑缩边, ...
- 利用Hough变换识别图像中的直线
引入 近期看到2015年数学建模A题太阳影子定位中的第四问,需要根据附件中视频里的直杆的太阳影子的变化确定拍摄地点.其实确定拍摄地点这个问题并不是十分困难,因为有前三问的铺垫,我们已经得出了太阳影子长 ...
- Django -- 权限初识
待 需求分析-场景 假设需要为公司设计一个人员管理系统,并为各级领导及全体员工分配系统登录账号.有如下几个要求: 1.权限等级不同 公司领导登录后可查看所有员工的信息,部门领导登陆后之可查看本部门员工 ...
- netty~引用对象引用
从InBound里读取的ByteBuf要手动释放,还有自己创建的ByteBuf要自己负责释放.这两处要调用这个release方法. write Bytebuf到OutBound时由netty负责释放, ...
- CoreCLR
CoreCLR 在这篇中我将讲述GC Collector内部的实现, 这是CoreCLR中除了JIT以外最复杂部分,下面一些概念目前尚未有公开的文档和书籍讲到. 为了分析这部分我花了一个多月的时间,期 ...
- Mysql系列常见面试题(三)
1.Mysql数据表在什么情况下容易损坏? 服务器突然断电导致数据文件损坏,强制关机,没有先关闭Mysql服务等. 2.Mysql有关全校的表都有那几个? Mysql服务器通过权限表老控制用户对数据库 ...
- Generator 和 函数异步应用 笔记
Generator > ES6 提供的一种异步编程解决方案 > Generator 函数是一个状态机,封装了多个内部状态.还是一个遍历器对象生成函数.返回<label>遍历器对 ...
- 《移动Web前端高效开发实战》笔记3--代码检查任务
在项目的开发过程中,统一的代码风格对于项目的可协作性以及可维护性来说相当重要,因此可以采用一些插件来进行代码风格的检查. 本例中的源文件包含两类:Sass文件和采用ECMAScript 6规范的Jav ...
- 《超实用的Node.js代码段》连载二:正确拼接Buffer
对于初学Node.js框架的开发人员来说,可能认为Buffer模块比较易学.重要性也不是那么突出.其实,Buffer模块在文件I/O和网络I/O中应用非常广泛,其处理二进制的性能比普通字符串性能要高出 ...