Codeforces Round #789 (Div. 2) A-C

A

题目

https://codeforces.com/problemset/problem/1677/A

题解

思路

知识点:模拟。

(比较显然,不写了)

时间复杂度 \(O(nlogn)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>

using namespace std;

int a[100];

int main(){
std::ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t;
cin>>t;
while(t--){
int n;
cin>>n;
for(int i = 0;i<n;i++){
cin>>a[i];
}
sort(a,a+n);
int cnt = 0;
bool ok = false;
for(int i = 0;i<n-1;i++){
if(a[i] == a[i+1] || !a[i]){
ok = true;
break;
}
}
for(int i = 0;i<n;i++){
if(a[i]) cnt++;
}
cout<<(cnt+!ok)<<'\n';
}
return 0;
}

B

题目

https://codeforces.com/problemset/problem/1678/B1

https://codeforces.com/problemset/problem/1678/B2

题解

思路

知识点:贪心。

对于给定偶数长度的0/1串,奇数子串与其他串(不论奇偶的其他)的分界点有且仅有一个位于某一对中间。比如,\(111001100011\) 划分以后变成 \(11,10,01,10,00,11\) ,发现 \(111\) 的末尾 \(1\) 出现在 \(10\) 中,\(000\) 的首部 \(0\) 出现在 \(10\) 中。因此我们可以通过按对(即两个两个不相交)遍历,若遇到一次 \(01\) 或 \(10\) 则操作次数加 \(1\) 。

与此同时,我们发现若修改一处 \(01\) 或 \(10\) 可以修改成 \(00\) 或 \(11\) ,从而被前段或者后段的 \(00\) 或 \(11\) 吸收不改变总段数,因此可以将修改等价认为直接删除这段 \(01\) 或 \(10\) ,即在程序中不考虑这种情况对总数影响,只需要记录 \(00\) 或 \(11\) 的连续成段情况、特别地,如果 \(0/1\) 串本身没有 \(00\) 或 \(11\) 的对,或者说全串由 \(01\) 或 \(10\) 组成,那么它们可以自成唯一一段互相吸收,需要特判。

时间复杂度 \(O(n)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>

using namespace std;

int main(){
std::ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t;
cin>>t;
while(t--){
int n;
cin>>n;
string s;
cin>>s;
int op = 0,cnt = 0;
char pre = '?';
for(int i = 0;i<n;i+=2){///两两配对
if(s[i] != s[i+1]) op++;///操作次数+1
else{
if(pre != s[i]) cnt++;///不同数字,段数+1
pre = s[i];///更新段数字
}
}
cout<<op<<' '<<max(1,cnt)<<'\n';///如果没有00/11吸收01/10,那么01/10可以自成一段
}
return 0;
}

C

题目

https://codeforces.com/problemset/problem/1677/A

题解

思路

知识点:DP,枚举。

注意到 \(a<b<c<d\) ,可以考虑枚举 \(b,c\) 两个点,用 \(a,d\) 分别在 \([1,b-1]\) 和 \([c+1,n]\) 的区间匹配。

匹配条件是 \(p_a < p_c \and p_b >p_d\) ,考虑用数组 \(cnt[i][j]\) 表示满足 \(p_x \leq j , x \in [1,i]\) 的 \(x\) 个数。于是 \(a\) 的匹配个数是 \(cnt[b-1][p[c]]\) ,\(d\) 的匹配个数是 \(cnt[n][p[b]] - cnt[c][p[b]]\) 。因此,对于一组 \(b,c\) 可以得到 \(cnt[b-1][p[c]] \cdot (cnt[n][p[b]] - cnt[c][p[b]])\) 的组数,枚举 \(b,c\) 累加即可。

时间复杂度 \(O(n^2)\)

空间复杂度 \(O(n^2)\)

代码

#include <bits/stdc++.h>

using namespace std;

int p[5007],cnt[5007][5007];//注意初始化

int main(){
std::ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t;
cin>>t;
while(t--){
int n;
cin>>n;
for(int i = 1;i<=n;i++){
cin>>p[i];
}
for(int i = 1;i<=n;i++){///预处理cnt[i][j] 为 [1,i] 中小于等于 j 的数字个数
for(int j = 1;j<=n;j++) cnt[i][j] = cnt[i-1][j];///传递上个区间
for(int j = p[i];j<=n;j++) cnt[i][j]++;///j从p[i]开始都大于等于i,遍历+1
}
///枚举b,c,以此为准求[1,b-1]和[c+1,d]间合法a,d个数
long long ans = 0;
for(int b = 2;b<=n-2;b++){
for(int c = b+1;c<=n-1;c++){
ans += 1LL * cnt[b-1][p[c]] * (cnt[n][p[b]] - cnt[c][p[b]]);
}
}
cout<<ans<<'\n';
}
return 0;
}

Codeforces Round #789 (Div. 2) A-C的更多相关文章

  1. Codeforces Round #789 (Div. 2)

    题集链接 A. Tokitsukaze and All Zero Sequence 题意 Tokitsukaze 有一个长度为 n 的序列 a. 对于每个操作,她选择两个数字 ai 和 aj (i≠j ...

  2. Codeforces Round #366 (Div. 2) ABC

    Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...

  3. Codeforces Round #354 (Div. 2) ABCD

    Codeforces Round #354 (Div. 2) Problems     # Name     A Nicholas and Permutation standard input/out ...

  4. Codeforces Round #368 (Div. 2)

    直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...

  5. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  6. Codeforces Round #279 (Div. 2) ABCDE

    Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems     # Name     A Team Olympiad standard input/outpu ...

  7. Codeforces Round #262 (Div. 2) 1003

    Codeforces Round #262 (Div. 2) 1003 C. Present time limit per test 2 seconds memory limit per test 2 ...

  8. Codeforces Round #262 (Div. 2) 1004

    Codeforces Round #262 (Div. 2) 1004 D. Little Victor and Set time limit per test 1 second memory lim ...

  9. Codeforces Round #371 (Div. 1)

    A: 题目大意: 在一个multiset中要求支持3种操作: 1.增加一个数 2.删去一个数 3.给出一个01序列,问multiset中有多少这样的数,把它的十进制表示中的奇数改成1,偶数改成0后和给 ...

随机推荐

  1. SpringCloud入门简述

    1.微服务简述 ​ 微服务,是一个小型的服务,也是一种设计理念,将一个大型繁杂的系统拆分为多个小型的服务,进行独立部署,这些服务在独立进程中运行,通过特定的协议进行通信 ​ 优点: 轻量化:一个服务不 ...

  2. .NET Core企业微信网页授权登录

    1.开发前准备 参数获取 corpid 每个企业都拥有唯一的corpid,获取此信息可在管理后台"我的企业"-"企业信息"下查看"企业ID" ...

  3. React 父组件调用子组件的方法

    父组件调用子组件的方法 React v16.3.0 及以后版本使用 import React, {Component} from 'react'; export default class Paren ...

  4. GO语言学习——切片三 append()方法为切片添加元素、切片的扩容策略、使用copy()函数复制切片、从切片中删除元素

    append()方法为切片添加元素 注意:通过var声明的零值切片可以在append()函数直接使用,无需初始化. var s []int s = append(s, 1, 2, 3) append( ...

  5. Windows与Linux如何实现相互远程桌面连接?

    今天跟大家一起讨论下,利用Windows自带的远程桌面连接工具,实现远程Linux桌面及在Linux系统中远程Windows桌面 一.Windows远程Linux桌面 1)本次实验以CentOS 7. ...

  6. 老生常谈系列之Aop--CGLIB动态代理的底层实现原理

    老生常谈系列之Aop--CGLIB动态代理的底层实现原理 前言 上一篇老生常谈系列之Aop--JDK动态代理的底层实现原理简单讲解了JDK动态代理的实现,动态代理常用实现里面的双子星还有另一位--CG ...

  7. p2p-tunnel 打洞内网穿透系列(二)TCP转发访问内网共享文件夹

    系列文章 p2p-tunnel 打洞内网穿透系列(一)客户端配置及打洞 p2p-tunnel 打洞内网穿透系列(二)TCP转发访问远程共享文件夹 p2p-tunnel 打洞内网穿透系列(三)TCP转发 ...

  8. 如何使用 Javascript 将图标字体渲染为图片

    前言 在软件开发中肯定要用到图标,比如下图的 Groove 音乐中就用到了许多图标.一种获取这些图标的方法是把 Groove 音乐截个图,然后熟练地开启 Photoshop,开始抠图.这种方式很逊,效 ...

  9. 992. Sort Array By Parity II - LeetCode

    Question 992. Sort Array By Parity II Solution 题目大意:给一个int数组,一半是奇数一半是偶数,分别对偶数数和奇数数排序并要求这个数本身是偶数要放在偶数 ...

  10. webpack.config.js和vue.config.js的区别

    webpack.config.js是webpack的配置文件,所有使用webpack作为打包工具的项目都可以使用,vue的项目可以使用,react的项目也可以使用. vue.config.js是vue ...