Codeforces Round #590 (Div. 3) Editorial
Codeforces Round #590 (Div. 3) Editorial
不要因为走得太远,就忘记为什么出发!
Problem A
题目大意:商店有n件商品,每件商品有不同的价格,找出一个最小的可能值price,使得price * n >= sum,sum指的是原来商品价格的总和。
知识点:模拟
思路:求出sum/n向上取整即可,有两种方法。一是使用ceil()函数,但注意ceil()返回的是向上取整后的浮点数,所以要进行强制类型转换;二是直接向下取整,然后用if语句判断,防止精度损失。
#include <bits/stdc++.h>
using namespace std;
int q,n,sum;
int main(){
scanf("%d",&q);
while(q--){
scanf("%d",&n);
sum = 0;
for(int i = 0;i < n;i++){
int x;
scanf("%d",&x);
sum += x;
}
printf("%d\n",(int)ceil(1.0 * sum / n));
/*int ans = sum / n;
if(ans * n >= sum){
printf("%d\n",ans);
}
else printf("%d\n",ans + 1);
*/
}
return 0;
}
Problem B1 B2
题目大意:有一台能显示至多k条短信的手机,每条短信对应的朋友编号不同,在某天你会收到n条短信。如果某条短信的发件人已存在于屏幕中,则无事发生。否则,如果短信条数已满k条,那么会删去最后一条短信,然后让这条短信显示在屏幕的第一位,其他短信依次后移。求收到n条短信后屏幕的短信情况,并按顺序输出每条短信的发件人。
知识点:模拟,STL
个人思路:n,k在hard版本中数量级达到2e5的级别,如果用map标记可能会达到最坏时间复杂度 O(n^2) ,当时第一反应是离散化标记,O(1)查询,上deque模拟短信情况(实际上就是一个队列),最后反向输出。
题解思路:运用STL中的set进行标记,用队列模拟,用vector存储并输出答案,代码比较简洁
mycode:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
int n,k,x;
int num[maxn],tp[maxn],id[maxn],re[maxn];
bool ok[maxn];
map<int,int> mp;
deque<int> q;
int main() {
scanf("%d %d",&n,&k);
for(int i = 0;i < n;++i){
scanf("%d",&num[i]);
tp[i] = num[i];
}
sort(tp,tp + n);
int m = unique(tp,tp + n) - tp;
for(int i = 0;i < m;i++){
mp[tp[i]] = i + 1;
re[i + 1] = tp[i];
}
for(int i = 0;i < n;++i) id[i] = mp[num[i]];
for(int i = 0;i < n;i++){
x = id[i];
if(q.size() < k){
if(ok[x] == 0){
q.push_back(x);
ok[x] = 1;
}
else continue;
}
else{
if(ok[x] == 1) continue;
else{
int y = q.front();
q.pop_front();
ok[y] = 0;
q.push_back(x);
ok[x] = 1;
}
}
}
printf("%d\n",q.size());
while(!q.empty()){
int x = q.back();
q.pop_back();
x = re[x];
printf("%d%c",x,q.size() == 0?'\n':' ');
}
return 0;
}
solution:
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, k;
cin >> n >> k;
queue<int> q;
set<int> vals;
for (int i = 0; i < n; ++i) {
int id;
cin >> id;
if (!vals.count(id)) {
if (int(q.size()) >= k) {
int cur = q.front();
q.pop();
vals.erase(cur);
}
vals.insert(id);
q.push(id);
}
}
vector<int> res;
while (!q.empty()) {
res.push_back(q.front());
q.pop();
}
reverse(res.begin(), res.end());
cout << res.size() << endl;
for (auto it : res) cout << it << " ";
cout << endl;
return 0;
}
Problem C
题目大意:给出一个2*n的块中每一格的管子类型,判断水流能否从(1,0)流向(2,n + 1)。
知识点:思维
思路:观察发现,1,2之间,3,4,5,6之间可以通过旋转获得彼此,所以本质上只有两种类型的管子。遇到第一种类型的管子我们只能让它朝右,让水流往右流(显然其他方向是不可能的);遇到第二种类型的管子,水流只能进行上下移动,也就是说,如果(1,k)处是第二种类型的管子,那么(2,k)处也必须是第二种类型的管子,水流所在层数发生变化。如果最后水流位于第二层,并且流到n+1列,则为可行解。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5 + 5;
int q,n;
char s[2][maxn];
bool check(){
int pos = 0,i = 0;
for(pos = 1;pos <= n;pos++){
if(s[i][pos] - '0' < 3) continue;
if(s[i ^ 1][pos] - '0' < 3) return false;
i ^= 1;
}
if(pos == n + 1 && i == 1) return true;
return false;
}
int main(){
scanf("%d",&q);
while(q--){
scanf("%d",&n);
for(int i = 0;i < 2;i++) scanf("%s",s[i] + 1);
if(check()) printf("%s\n","YES");
else printf("%s\n","NO");
}
return 0;
}
Problem D
题目大意:给出一个只含小写字母的字符串s,有q次询问,两种操作。操作一是改变某个位置的字符,操作二是统计某段子串的字符种类,对于操作二,输出答案。
知识点:STL,树状数组
思路:开26个vector套set,存储每一种小写字母的出现位置,利用set增加、删除、查询均为O(logn)的性质优化复杂度。对于操作一,删除原来的字符的位置,加入新的字符的位置即可;对于操作二,利用lower_bound()二分查找大于等于l的第一个数,如果这个数<=r,则该段区间存在该字符。
据说还可以用BIT和线段树做,速度更快。DFS貌似也可以解
时间复杂度:O(nlogn*AL),AL是字母的数量=26
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 5;
char s[maxn];
int q,len,x,pos,l,r;
vector<set<int> > v(26);
int main(){
scanf("%s",s);
len = strlen(s);
for(int i = 0;i < len;i++){
v[s[i] - 'a'].insert(i);
}
scanf("%d",&q);
while(q--){
scanf("%d",&x);
if(x == 1){
char c;
scanf("%d",&pos);
cin >> c;
--pos;
v[s[pos] - 'a'].erase(pos);
s[pos] = c;
v[c - 'a'].insert(pos);
}
else{
scanf("%d %d",&l,&r);
--l,--r;
int cnt = 0;
for(int i = 0;i < 26;i++){
set<int>::iterator it;
it = v[i].lower_bound(l);
if(it != v[i].end() && *it <= r) cnt++;
}
printf("%d\n",cnt);
}
}
return 0;
}
Codeforces Round #590 (Div. 3) Editorial的更多相关文章
- Codeforces Round #747 (Div. 2) Editorial
Codeforces Round #747 (Div. 2) A. Consecutive Sum Riddle 思路分析: 一开始想起了那个公式\(l + (l + 1) + - + (r − 1) ...
- Codeforces Round #544 (Div. 3) Editorial C. Balanced Team
http://codeforces.com/contest/1133/problem/Ctime limit per test 2 secondsmemory limit per test 256 m ...
- Codeforces Round #590 (Div. 3)
A. Equalize Prices Again 题目链接:https://codeforces.com/contest/1234/problem/A 题意:给你 n 个数 , 你需要改变这些数使得这 ...
- Codeforces Round #590 (Div. 3) E. Special Permutations
链接: https://codeforces.com/contest/1234/problem/E 题意: Let's define pi(n) as the following permutatio ...
- Codeforces Round #590 (Div. 3) D. Distinct Characters Queries(线段树, 位运算)
链接: https://codeforces.com/contest/1234/problem/D 题意: You are given a string s consisting of lowerca ...
- Codeforces Round #590 (Div. 3) C. Pipes
链接: https://codeforces.com/contest/1234/problem/C 题意: You are given a system of pipes. It consists o ...
- Codeforces Round #590 (Div. 3) B2. Social Network (hard version)
链接: https://codeforces.com/contest/1234/problem/B2 题意: The only difference between easy and hard ver ...
- Codeforces Round #590 (Div. 3) A. Equalize Prices Again
链接: https://codeforces.com/contest/1234/problem/A 题意: You are both a shop keeper and a shop assistan ...
- Codeforces Round #590 (Div. 3)(e、f待补
https://codeforces.com/contest/1234/problem/A A. Equalize Prices Again #include<bits/stdc++.h> ...
随机推荐
- PCIe - 那点点事
各位看官,这是我拷贝过来的,作为学习笔记(本人对图比较感兴趣,你说我懒也行,上图,这个看着舒服易懂): 1. Wire, lane, link 啥关系 注: PCIe 每条lane有1个双向通道(一个 ...
- 解决zabbix的cannot allocate shared memory of size错误
问题状态:zabbix_server 不能启动,系统CentOS 6.7 原因分析:这是因为内核对share memory的限制造成的. 用到如下命令ipcs [-m|l|a],sysctl [-a| ...
- iOS测试-如何指标量化app耗电量和性能XCTest Metrics
对于app端的专项测试,Android端我们可以用adb或者一些三方工具进行(例如itest)进行实时的性能监控,iOS端的话也可以用用一些三方的工具,但是需要嵌入到我们的项目当中,今天来介绍下Xco ...
- windows游戏编程封装窗口类
本系列文章由jadeshu编写,转载请注明出处.http://blog.csdn.net/jadeshu/article/details/22451353 作者:jadeshu 邮箱: jades ...
- 爬虫之解析库BeautifulSoup
介绍 Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: Beautiful Soup提供一些简单的.python式的函数用来处理导航.搜索.修改分析树等 ...
- iOS开发系列--地图与定位总结
现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.例如你到了一个陌生的 ...
- 访问redis集群提示连接超时的问题
上周在服务器通过docker部署了一个单机版redis集群,今天通过StackExchange.Redis访问的时候报了这个错: 提示我把超时时间设置一下,我去服务器上找到redis的配置文件,发现不 ...
- IDEA 重复代码快速重构(抽取重复代码快捷键)
Ctrl+Alt+M 顺带一提,eclipse的快捷键是:Alt+Shift+M;
- 【Centos】搭建 SVN 服务器
1.如果仅仅只是搭建 svn 服务器: (a).先检查 svn 是否已经安装了 rpm -qa subversion #输入这个命令后,会出现 subversion 版本号 (b).如果没有安装, ...
- (八)爬虫之js调试(登陆知乎)
上次爬取网易云音乐,折腾js调试了好久,难受....今天继续练练手,研究下知乎登陆,让痛苦更猛烈些. 1.简单分析 很容易就发现登陆的url=“https://www.zhihu.com/api/v3 ...