Codeforces Round 573 (Div.1) 题解
这场怎么说呢……有喜有悲吧。
开场先秒了 A。看到 B,感觉有点意思,WA 了 2 发后也过了。
此时还在 rk 前 200。
开 C,一看就不可做。跟榜,切 D 人数是 C 的两倍。
开 D。一眼感觉很 SB,然后就想了个假做法,WA 了 3 发。
1:10 时开始重构。再 WA1 发。结果 WA 了 4 发,才过掉。
怎么全世界的 D 都比我高分……
system test 前 predictor 说我的 rating 变化是……0。顿时很慌。
幸好 B 题 FST 了一片(DQ 和 deco 也 FST 了),rk 从 350+ 翻到了 320+。
最后 rating+=8。我还是太菜了……
A
直接模拟即可。每次找到最小的还没被删的东西,看看能删到哪里。可以 $O(m)$。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int maxn=;
#define MP make_pair
#define PB push_back
#define lson o<<1,l,mid
#define rson o<<1|1,mid+1,r
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline ll read(){
char ch=getchar();ll x=,f=;
while(ch<'' || ch>'') f|=ch=='-',ch=getchar();
while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
return f?-x:x;
}
int m,ans;
ll n,k,p[maxn];
int main(){
n=read();m=read();k=read();
FOR(i,,m) p[i]=read();
FOR(i,,m){
ll at=(p[i]-i+k)/k;
int j=i;
while(j<=m && p[j]-i+<=at*k) j++;
j--;
i=j;ans++;
}
printf("%d\n",ans);
}
B
先判先手能不能走第一步:
- $0$ 出现了至少两次,不行。
- 有数出现了至少三次,不行。
- 有数($x$)出现了至少两次,且满足条件的 $x$ 不止一个,不行。
- 有数($x$)出现了至少两次,且 $x-1$ 也出现了,不行。(这个情况 pretest 没有,所以 FST 了一片)、
- 否则就可以。
如果先手能走第一步,那么可以证明最后状态肯定是 $0$ 到 $n-1$ 的一个排列。判下奇偶性就可以了。
时间复杂度 $O(n\log n)$,因为要排序/map。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int maxn=;
#define MP make_pair
#define PB push_back
#define lson o<<1,l,mid
#define rson o<<1|1,mid+1,r
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline ll read(){
char ch=getchar();ll x=,f=;
while(ch<'' || ch>'') f|=ch=='-',ch=getchar();
while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
return f?-x:x;
}
int n,a[maxn];
bool hhh;
ll s;
int main(){
n=read();
FOR(i,,n) s+=a[i]=read();
sort(a+,a+n+);
if(!a[] && a[]==a[]) return puts("cslnb"),;
FOR(i,,n-) if(a[i]==a[i-] && a[i]==a[i+]) return puts("cslnb"),;
FOR(i,,n-) if(a[i]==a[i+] && a[i]==a[i-]+) return puts("cslnb"),;
FOR(i,,n-) if(a[i]==a[i+]){
if(hhh) return puts("cslnb"),;
hhh=true;
}
puts((s-1ll*n*(n-)/)&?"sjfnb":"cslnb");
}
C
太神仙了吧……先咕着。
D
全部离散化。
枚举最小的 $y=y'$。那么只用考虑所有在 $y=y'$ 上及其上方的点。
假设 $y=y'$ 的点有 $(x_1,y'),(x_2,y')\dots(x_k,y')$,那么这些答案的和就是 $f(cnt(1,szx,y'))-f(cnt(1,x_1-1,y'))-f(cnt(x_k+1,szx,y'))-\sum\limits_{i=1}^{k-1}f(cnt(x_i+1,x_{i+1}-1,y'))$。
注意,离散化过了,离散化后所有点的最大 $x$ 坐标是 $szx$。$f(x)=\frac{x(x+1)}{2}$,也就是长度为 $x$ 的区间有多少个子区间。$cnt(l,r,a)$ 表示 $x$ 坐标在 $[l,r]$ 的点中有几个的 $y$ 坐标 $\ge a$。
(建议画图理解)
可以上扫描线+树状数组。从上往下扫。树状数组维护哪些列上有点。$cnt(l,r,y')$ 就是个区间求和。每次对于每个点,如果它所在的列还没被加入树状数组中,加入。
时间复杂度 $O(n\log n)$。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int maxn=;
#define MP make_pair
#define PB push_back
#define lson o<<1,l,mid
#define rson o<<1|1,mid+1,r
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline ll read(){
char ch=getchar();ll x=,f=;
while(ch<'' || ch>'') f|=ch=='-',ch=getchar();
while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
return f?-x:x;
}
int n,x[maxn],y[maxn],tmpx[maxn],tmpy[maxn],szx,szy,b[maxn],cnt[maxn];
vector<int> xs[maxn];
ll ans;
void update(int p,int v){
for(int i=p;i<=szx;i+=i&-i) b[i]+=v;
}
int query(int p){
int s=;
for(int i=p;i;i-=i&-i) s+=b[i];
return s;
}
int query(int l,int r){
if(l>r) return ;
return query(r)-query(l-);
}
int main(){
n=read();
FOR(i,,n) tmpx[i]=x[i]=read(),tmpy[i]=y[i]=read();
sort(tmpx+,tmpx+n+);szx=unique(tmpx+,tmpx+n+)-tmpx-;
sort(tmpy+,tmpy+n+);szy=unique(tmpy+,tmpy+n+)-tmpy-;
FOR(i,,n) x[i]=lower_bound(tmpx+,tmpx+szx+,x[i])-tmpx,y[i]=lower_bound(tmpy+,tmpy+szy+,y[i])-tmpy;
FOR(i,,n) xs[y[i]].push_back(x[i]);
FOR(i,,szy) sort(xs[i].begin(),xs[i].end());
ROF(i,szy,){
FOR(j,,(int)xs[i].size()-) if(++cnt[xs[i][j]]==) update(xs[i][j],);
int len=query(,szx);
ans+=1ll*len*(len+)/;
len=query(,xs[i][]-);
ans-=1ll*len*(len+)/;
len=query(xs[i][(int)xs[i].size()-]+,szx);
ans-=1ll*len*(len+)/;
FOR(j,,(int)xs[i].size()-){
len=query(xs[i][j]+,xs[i][j+]-);
ans-=1ll*len*(len+)/;
}
}
cout<<ans<<endl;
}
E
PB 说这是个 SB 题,没有思维难度,比 C 还简单……我说我不会还被喷了 QwQ
回来再说吧。
F
其实说句实话,这辈子都没想过改出 Div.1 的 F。不管了。
Codeforces Round 573 (Div.1) 题解的更多相关文章
- Codeforces Round #182 (Div. 1)题解【ABCD】
Codeforces Round #182 (Div. 1)题解 A题:Yaroslav and Sequence1 题意: 给你\(2*n+1\)个元素,你每次可以进行无数种操作,每次操作必须选择其 ...
- Codeforces Round #608 (Div. 2) 题解
目录 Codeforces Round #608 (Div. 2) 题解 前言 A. Suits 题意 做法 程序 B. Blocks 题意 做法 程序 C. Shawarma Tent 题意 做法 ...
- Codeforces Round #525 (Div. 2)题解
Codeforces Round #525 (Div. 2)题解 题解 CF1088A [Ehab and another construction problem] 依据题意枚举即可 # inclu ...
- Codeforces Round #528 (Div. 2)题解
Codeforces Round #528 (Div. 2)题解 A. Right-Left Cipher 很明显这道题按题意逆序解码即可 Code: # include <bits/stdc+ ...
- Codeforces Round #466 (Div. 2) 题解940A 940B 940C 940D 940E 940F
Codeforces Round #466 (Div. 2) 题解 A.Points on the line 题目大意: 给你一个数列,定义数列的权值为最大值减去最小值,问最少删除几个数,使得数列的权 ...
- Codeforces Round #573 (Div. 1) 差F
Codeforces Round #573 (Div. 1) E 题意:二维平面上有 n 个点,你可以放至多 m 条直线使得 (0,0) 与每个点的连线至少与一条直线相交.求原点与所有直线的距离最小值 ...
- Codeforces Round #677 (Div. 3) 题解
Codeforces Round #677 (Div. 3) 题解 A. Boring Apartments 题目 题解 简单签到题,直接数,小于这个数的\(+10\). 代码 #include &l ...
- Codeforces Round #665 (Div. 2) 题解
Codeforces Round #665 (Div. 2) 题解 写得有点晚了,估计都官方题解看完切掉了,没人看我的了qaq. 目录 Codeforces Round #665 (Div. 2) 题 ...
- Codeforces Round #160 (Div. 1) 题解【ABCD】
Codeforces Round #160 (Div. 1) A - Maxim and Discounts 题意 给你n个折扣,m个物品,每个折扣都可以使用无限次,每次你使用第i个折扣的时候,你必须 ...
随机推荐
- python运维开发常用模块(7)web探测模块pycurl
1.模块介绍 pycurl(http://pycurl.sourceforge.net)是一个用C语言写的libcurl Python实现,功能非常强大,支持的操作协议有FTP.HTTP.HTTPS. ...
- JavaScript(这里主要侧重于 JavaScript HTML DOM)杂项
JavaScript基础 ------学习网站https://www.runoob.com/js/js-tutorial.html Javascript语言的特点: 安全性:2.易用性:3.动态交互性 ...
- 发布TS类型文件到npm
最近发布了@types/node-observer包到npm,这里记录下发布过程 TS类型文件的包名通常以@types开头,使用npm publish发布以@types开头的包时需要使用付费账号. ...
- 一个人的公众号,我写了1w+
大家好,我是Bypass,一个人一直保持着写博客的习惯,为此维护了一个技术公众号,致力于分享原创高质量干货,写的内容主要围绕:渗透测试.WAF绕过.代码审计.应急响应.企业安全. 一直以来,我把它当成 ...
- kmv 学习笔记 工具
qemu:kmv的文本管理工具,包括qemu-kvm.qemu-img libvirt:是一套免费.开源的支持Linux下主流虚拟化工具的C函数库,libvirtd是运行的守护进程的名称.包括GUI: ...
- 使用Git Bash在码云上上传和下载代码
前提是在码云上已经新建一个空的项目 1.新建一个目录,存放下载下来的项目,我在D盘新建了一个"gitspace"文件夹,用来存放下载下来的项目 2.进入刚刚新建的文件夹,即进入&q ...
- Windows Server 2008 R2 install Visual Studio 2015 failed
Please download and install Windows Server 2008 R2 Service Pack 1 (KB976932) . https://www.microsoft ...
- 基于log4net的日志组件扩展封装,实现自动记录交互日志 XYH.Log4Net.Extend(微服务监控)
背景: 随着公司的项目不断的完善,功能越来越复杂,服务也越来越多(微服务),公司迫切需要对整个系统的每一个程序的运行情况进行监控,并且能够实现对自动记录不同服务间的程序调用的交互日志,以及通一个服务或 ...
- C# vb .NET生成QR二维码
二维码比条形码具有更多优势,有些场合使用二维码比较多,比如支付.通过将某些数据生成二维码,就可以实现一码走天下.那么如何在C#,.Net平台代码里生成二维码呢?答案是使用SharpBarcode! S ...
- JavaScript HTML DOM 节点
要向HTML DOM添加新元素,必须首先创建元素(元素节点),然后将其附加到现有元素. <!DOCTYPE html> <html> <meta charset=&quo ...