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

开场先秒了 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. Flutter基础系列之混合开发(二)

    1.混合开发的场景 1.1作为独立页面加入 这是以页面级作为独立的模块加入,而不是页面的某个元素. 原生页面可以打开Flutter页面 Flutter页面可以打开原生页面 1.2作为页面的一部分嵌入 ...

  2. WebBrowser中html元素如何触发winform事件 z

    只要注册一下事件就可以了. C#代码如下: using System;using System.ComponentModel;using System.Windows.Forms; namespace ...

  3. git 给分支添加描述 管理分支实用方法

    1.背景 在我们工作中,正常情况我们处在一个迭代中,一个人最多会有几个功能,比较正常的操作我们会给每个大功能创建不同的分支,方便管理. 我们可以非常愉快的进行版本管理,遇到特殊情况我们也可以方便版本退 ...

  4. jQuery 源码解析(八) 异步队列模块 Callbacks 回调函数详解

    异步队列用于实现异步任务和回调函数的解耦,为ajax模块.队列模块.ready事件提供基础功能,包含三个部分:Query.Callbacks(flags).jQuery.Deferred(funct) ...

  5. Vue.js 源码分析(二十二) 指令篇 v-model指令详解

    Vue.js提供了v-model指令用于双向数据绑定,比如在输入框上使用时,输入的内容会事实映射到绑定的数据上,绑定的数据又可以显示在页面里,数据显示的过程是自动完成的. v-model本质上不过是语 ...

  6. IIS锁定是默认设置的 (overrideModeDefault="Deny")问题解决

    发布网站时提示错误 锁定是默认设置的 (overrideModeDefault="Deny"),或者是通过包含 overrideMode="Deny" 或旧有的 ...

  7. sklearn 学习 第一篇:分类

    分类属于监督学习算法,是指根据已有的数据和标签(分类)进行学习,预测未知数据的标签.分类问题的目标是预测数据的类别标签(class label),可以把分类问题划分为二分类和多分类问题.二分类是指在两 ...

  8. C#中一行代码实现18位数字时间戳转换为DateTime

    场景 存取的时间戳数据为: 636728674347302002 怎样将其转换为DateTime时间. 目前大多数的策略是,转换成string,然后 DateTime dateTimeStart = ...

  9. E203 bypass buffer

    如果fifo中没有数据,且有输入,则是bypass fifo,同周期内直接把输入数据转到输出数据.如果fifo中有数据,则读取fifo,成为普通的同步fifo. module sirv_gnrl_by ...

  10. MySQL的select(极客时间学习笔记)

    查询语句 首先, 准备数据, 地址是: https://github.com/cystanford/sql_heros_data, 除了id以外, 24个字段的含义如下: 查询 查询分为单列查询, 多 ...