分糖果

题意

选择L~R中的某个数 , 使得x mod k的结果最大。

思路

分两种情况考虑:

若 L 和 R 对 K 取模后在同一区间,则必然在 x=R 位置取到最大值;

否则 L~R 必然跨越多个区间,则取模后的结果必然有 k-1。

而对于是否在同一区间,在除以 k 后,商是否一致判断即可。

参考代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
ll n, l, r;
cin >> n >> l >> r;
if (l / n != r / n) cout << n - 1 << endl;
else cout << r % n << endl;
return 0;
}

插入排序

题意

给定长度为 n 的整数序列 ,有 Q 种操作:

1:x v 修改序列 a 中的第 x 个元素 a[x] 为 v ,该操作次数不超过5000次;

2:x 将数组进行稳定排序,求原先第 x 个元素排序后的位置。

思路

不如维护将原先所有的 a 排序后的升序数组。对于所有操作,我们需要维护原位置到有序数组中的映射。

对于 1 操作,找到 a[x] 对应位置,显然修改值将使其往前或往后。联系到题目中提示的插入排序,可以不断向前/向后比较。注意同时维护映射关系。

对于 2 操作,直接输出映射即可。

注:如果该题中的数组长度更长、操作次数更多,我们可使用平衡树来解决该题。

参考代码

#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
const int N = 8e3+5;
int a[N];
pii p[N]; int main() {
ios::sync_with_stdio(false);
int n, q; cin >> n >> q;
for (int i = 1; i <= n; i++) {
cin >> a[i];
p[i] = {a[i], i};
}
sort(p + 1, p + 1 + n);
for (int i = 1; i <= n; i++) a[p[i].second] = i;
for (int i = 0, op, x, v; i < q; i++) {
cin >> op;
// 5000 * 8000 = 4e7
if (op == 1) {
cin >> x >> v;
int pos = a[x];
p[pos].first = v;
while (pos > 1 && p[pos] < p[pos - 1]) {
swap(a[p[pos].second], a[p[pos - 1].second]);
swap(p[pos], p[pos - 1]);
pos--;
}
while (pos < n && p[pos] > p[pos + 1]) {
swap(a[p[pos].second], a[p[pos + 1].second]);
swap(p[pos], p[pos + 1]);
pos++;
}
} else {
cin >> x;
cout << a[x] << endl;
}
}
return 0;
}

网络连接

题意

解析带端口的IP地址串,按服务器和客户端角色判断连接情况。

思路

若将带端口的IP地址串记为 a.b.c.d:e,则需要检查的项目有:

  • 有三个点号和一个冒号分隔字符串,且冒号出现在最后;
  • a,b,c,d,e均不为空,且不含有前导零;

可将对字符串的解析抽象为函数,简化代码逻辑。

参考代码

#include<bits/stdc++.h>
using namespace std;
map<string, int> dict;
const int IP = 256;
const int PORT = 65536; bool check(string s, int limit) {
// ".0.0.1:80" -> ""
if (s.empty()) return false;
// "0127.0.0.1:80" -> "0127"
if (s[0] == '0' && s.size() > 1) return false;
int val = 0;
for (int i = 0; i < s.size(); i++) {
val = val * 10 + s[i] - '0';
if (val >= limit) return false;
}
return true;
} bool parse(string ip) {
string s = "";
int dot_cnt = 0, port_cnt = 0;
for (int i = 0; i < ip.size(); i++) {
if (ip[i] == '.') dot_cnt += 1;
if (ip[i] == ':') {
if (dot_cnt != 3) return false;
port_cnt += 1;
}
if (!isdigit(ip[i])) {
if (!check(s, IP)) return false;
s = "";
} else s += ip[i];
}
return check(s, PORT) && dot_cnt == 3 && port_cnt == 1;
} void process_server(string ip, int id) {
bool valid = parse(ip);
if (!valid) {cout << "ERR" << endl; return;}
if (dict.count(ip)) {cout << "FAIL" << endl; return;}
dict[ip] = id;
cout << "OK" << endl;
} void process_client(string ip) {
bool valid = parse(ip);
if (!valid) {cout << "ERR" << endl; return;}
if (!dict.count(ip)) {cout << "FAIL" << endl; return;}
cout << dict[ip] << endl;
} int main() {
ios::sync_with_stdio(false);
int n; cin >> n;
for (int i = 1; i <= n; i++) {
string name, ip;
cin >> name >> ip;
if (name[0] == 'S') process_server(ip, i);
else process_client(ip);
}
return 0;
}

小熊的果篮

题意

有两类共 n 个水果拍成一排,称连续的排在一起的同一种水果称为“块”。

每次将每一个“块”中最左边的水果同时挑出。重复该操作直至水果用完。

每次水果被挑出后“块”会发生动态变化。

思路

尝试建模每个块,使用块头来表示每个块的开始位置,即第一个元素或与上一个元素类型不同的位置。

每个元素之间使用双向链表相连接。

对于每次输出选出的元素,我们只需要依次输出块头元素,并从双向链表中删除该元素。

当块头元素输出后,需要更新块头列表。

考虑在原块头位置的下一个元素,只有当:

  • 该下一个元素与原块头位置的上一个元素类型不同;
  • 该下一个元素不是原块头。

则能够成为新的块头位置。

参考代码

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
struct Node {
int pre, nxt, v;
}a[N];
vector<int> head, nxt_head; int main() {
ios::sync_with_stdio(false);
int n; cin >> n;
a[0].v = a[n + 1].v = -1;
a[0].nxt = 1;
a[n + 1].pre = n;
for (int i = 1; i <= n; i++) {
cin >> a[i].v;
a[i].pre = i - 1;
a[i].nxt = i + 1;
if (a[i].v != a[i - 1].v) head.push_back(i);
}
while(head.size()) {
nxt_head.clear();
for (int id : head) {
cout << id << " ";
Node& node = a[id];
a[node.pre].nxt = node.nxt;
a[node.nxt].pre = node.pre;
if (node.v == a[node.nxt].v && node.v != a[node.pre].v)
nxt_head.push_back(node.nxt);
}
cout << endl;
swap(head, nxt_head);
}
return 0;
}

CSP-J2021 题解的更多相关文章

  1. 上午小测3 T1 括号序列 && luogu P5658 [CSP/S 2019 D1T2] 括号树 题解

    前 言: 一直很想写这道括号树..毕竟是在去年折磨了我4个小时的题.... 上午小测3 T1 括号序列 前言: 原来这题是个dp啊...这几天出了好几道dp,我都没看出来,我竟然折磨菜. 考试的时候先 ...

  2. [CSP模拟测试43、44]题解

    状态极差的两场.感觉现在自己的思维方式很是有问题. (但愿今天考试开始的一刻我不会看到H I J) A 考场上打了最短路+贪心,水了60. 然而正解其实比那30分贪心好想多了. 进行n次乘法后的结果一 ...

  3. 题解 nflsoj489 【六校联合训练 CSP #15】小D与随机

    题目链接 考虑枚举好点的集合.此时要考虑的问题是如何填入\(1\sim n\)这些数使得恰好我们枚举到的这些点是好点,即:求出有多少种合法的填数方案. \(1\)号点一定是好点.那么除\(1\)号点外 ...

  4. CCF CSP 201703-3 Markdown

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201703-3 Markdown 问题描述 Markdown 是一种很流行的轻量级标记语言(l ...

  5. CCF计算机职业资格认证考试题解

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF计算机职业资格认证考试题解 CCF计算机软件能力认证(简称CCF CSP认证)是CCF计算机职业资格认证系 ...

  6. CCF CSP 201312-3 最大的矩形

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201312-3 最大的矩形 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i( ...

  7. CCF CSP 201609-3 炉石传说

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201609-3 炉石传说 问题描述 <炉石传说:魔兽英雄传>(Hearthston ...

  8. CCF CSP 201403-3 命令行选项

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201403-3 命令行选项 问题描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些 ...

  9. CCF CSP 201709-4 通信网络

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201709-4 通信网络 问题描述 某国的军队由N个部门组成,为了提高安全性,部门之间建立了M ...

  10. CCF CSP 201409-3 字符串匹配

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201409-3 字符串匹配 问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那 ...

随机推荐

  1. 每天一个 HTTP 状态码 100

    100 Continue 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分:指示客户端应该继续当前请求:如果请求已经完成,客户端可以忽略该响应. 常用于服务器已经接受了请求头,客户端应该继续 ...

  2. C++primer第一章

    第一章 : 开始 1.1 编写一个简单的C++程序 要点:每个函数有且只能拥有一个main函数,且main的默认返回是一个int类型. 函数定义:返回类型,函数名,形参列表,函数体 1.1.1编译 运 ...

  3. 在CabloyJS中将Webpack生成的文件自动上传到阿里云OSS

    背景 阿里云OSS提供了一个Webpack插件,可在Webpack打包结束后将webpack生成的文件自动上传到阿里云OSS中 下面看看在CabloyJS中如何使用该插件 新建项目,并配置MySQL连 ...

  4. fpm工具安装

    概述 最近在对机房的编译环境做整理,过程曲折而痛苦,记录一下. 之前的一个老项目,在打包的时候用到了一个叫做fpm的工具. 编译环境涉及centos6和centos7,在新的编译环境的过程中,如何安装 ...

  5. JZOJ 5409 Fantasy & NOI 2010 超级钢琴 题解

    其实早在 2020-12-26 的比赛我们就做过 5409. Fantasy 这可是紫题啊 题目大意 给你一个序列,求长度在 \([L,R]\) 区间内的 \(k\) 个连续子序列的最大和 题解 如此 ...

  6. Spring Security整合企业微信的扫码登录,企微的API震惊到我了

    本文代码: https://gitee.com/felord/spring-security-oauth2-tutorial/tree/wwopen/ 现在很多企业都接入了企业微信,作为私域社群工具, ...

  7. QT多线程的简单使用,主线程发一份数据,子线程收两份数据

    先看效果图,示例发送数据"Hello World" 主线程:0x16f54aeda20,另两个子线程分别是0x4f1baff690.0x4f1baff6a0 因为在子线程中加了20 ...

  8. 浅议.NET遗留应用改造

    浅议.NET遗留应用改造 TLDR:本文介绍了遗留应用改造中的一些常见问题,并对改造所能开展的目标.原则.策略进行了概述. 一.背景概述 1.概述 或许仅"遗留应用"这个标题就比较 ...

  9. 关于android sdk中monitor.exe报错的问题

    今天又是被坑的一上午.来总结一下: 1. 首先是找不到monitor的问题: 这个可能是一开始环境配置错误.所以我将android sdk重装了一下就好了 2. 第二个是找到monitor.bat发现 ...

  10. 从 1.5 开始搭建一个微服务框架——日志追踪 traceId

    你好,我是悟空. 前言 最近在搭一个基础版的项目框架,基于 SpringCloud 微服务框架. 如果把 SpringCloud 这个框架当做 1,那么现在已经有的基础组件比如 swagger/log ...