这场怎么说呢……有喜有悲吧。

开场先秒了 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) 题解的更多相关文章

  1. Codeforces Round #182 (Div. 1)题解【ABCD】

    Codeforces Round #182 (Div. 1)题解 A题:Yaroslav and Sequence1 题意: 给你\(2*n+1\)个元素,你每次可以进行无数种操作,每次操作必须选择其 ...

  2. Codeforces Round #608 (Div. 2) 题解

    目录 Codeforces Round #608 (Div. 2) 题解 前言 A. Suits 题意 做法 程序 B. Blocks 题意 做法 程序 C. Shawarma Tent 题意 做法 ...

  3. Codeforces Round #525 (Div. 2)题解

    Codeforces Round #525 (Div. 2)题解 题解 CF1088A [Ehab and another construction problem] 依据题意枚举即可 # inclu ...

  4. Codeforces Round #528 (Div. 2)题解

    Codeforces Round #528 (Div. 2)题解 A. Right-Left Cipher 很明显这道题按题意逆序解码即可 Code: # include <bits/stdc+ ...

  5. Codeforces Round #466 (Div. 2) 题解940A 940B 940C 940D 940E 940F

    Codeforces Round #466 (Div. 2) 题解 A.Points on the line 题目大意: 给你一个数列,定义数列的权值为最大值减去最小值,问最少删除几个数,使得数列的权 ...

  6. Codeforces Round #573 (Div. 1) 差F

    Codeforces Round #573 (Div. 1) E 题意:二维平面上有 n 个点,你可以放至多 m 条直线使得 (0,0) 与每个点的连线至少与一条直线相交.求原点与所有直线的距离最小值 ...

  7. Codeforces Round #677 (Div. 3) 题解

    Codeforces Round #677 (Div. 3) 题解 A. Boring Apartments 题目 题解 简单签到题,直接数,小于这个数的\(+10\). 代码 #include &l ...

  8. Codeforces Round #665 (Div. 2) 题解

    Codeforces Round #665 (Div. 2) 题解 写得有点晚了,估计都官方题解看完切掉了,没人看我的了qaq. 目录 Codeforces Round #665 (Div. 2) 题 ...

  9. Codeforces Round #160 (Div. 1) 题解【ABCD】

    Codeforces Round #160 (Div. 1) A - Maxim and Discounts 题意 给你n个折扣,m个物品,每个折扣都可以使用无限次,每次你使用第i个折扣的时候,你必须 ...

随机推荐

  1. python运维开发常用模块(7)web探测模块pycurl

    1.模块介绍 pycurl(http://pycurl.sourceforge.net)是一个用C语言写的libcurl Python实现,功能非常强大,支持的操作协议有FTP.HTTP.HTTPS. ...

  2. JavaScript(这里主要侧重于 JavaScript HTML DOM)杂项

    JavaScript基础 ------学习网站https://www.runoob.com/js/js-tutorial.html Javascript语言的特点: 安全性:2.易用性:3.动态交互性 ...

  3. 发布TS类型文件到npm

    最近发布了@types/node-observer包到npm,这里记录下发布过程 TS类型文件的包名通常以@types开头,使用npm publish发布以@types开头的包时需要使用付费账号.   ...

  4. 一个人的公众号,我写了1w+

    大家好,我是Bypass,一个人一直保持着写博客的习惯,为此维护了一个技术公众号,致力于分享原创高质量干货,写的内容主要围绕:渗透测试.WAF绕过.代码审计.应急响应.企业安全. 一直以来,我把它当成 ...

  5. kmv 学习笔记 工具

    qemu:kmv的文本管理工具,包括qemu-kvm.qemu-img libvirt:是一套免费.开源的支持Linux下主流虚拟化工具的C函数库,libvirtd是运行的守护进程的名称.包括GUI: ...

  6. 使用Git Bash在码云上上传和下载代码

    前提是在码云上已经新建一个空的项目 1.新建一个目录,存放下载下来的项目,我在D盘新建了一个"gitspace"文件夹,用来存放下载下来的项目 2.进入刚刚新建的文件夹,即进入&q ...

  7. Windows Server 2008 R2 install Visual Studio 2015 failed

    Please download and install Windows Server 2008 R2 Service Pack 1 (KB976932) . https://www.microsoft ...

  8. 基于log4net的日志组件扩展封装,实现自动记录交互日志 XYH.Log4Net.Extend(微服务监控)

    背景: 随着公司的项目不断的完善,功能越来越复杂,服务也越来越多(微服务),公司迫切需要对整个系统的每一个程序的运行情况进行监控,并且能够实现对自动记录不同服务间的程序调用的交互日志,以及通一个服务或 ...

  9. C# vb .NET生成QR二维码

    二维码比条形码具有更多优势,有些场合使用二维码比较多,比如支付.通过将某些数据生成二维码,就可以实现一码走天下.那么如何在C#,.Net平台代码里生成二维码呢?答案是使用SharpBarcode! S ...

  10. JavaScript HTML DOM 节点

    要向HTML DOM添加新元素,必须首先创建元素(元素节点),然后将其附加到现有元素. <!DOCTYPE html> <html> <meta charset=&quo ...