Codeforces Round #590 (Div. 3)
B1,B2 https://codeforces.com/contest/1234/problem/B2
题意:
模拟一个队列操作,队列有固定的长度,依次进队,如果已经在队中则跳过,如果不在队中,将队首元素出队,然后进队,输出最后队列的大小和依次顺序。
题解:
queue + pair 模拟一遍
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxx = 200005;
map<int,int> mp;
queue<int> q;
int a[maxx];
int main()
{
int n,k,x;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
if(q.size() < k)
{
if(mp[x] == 0){
q.push(x);
mp[x] = 1;
}
else{
continue ;
}
}
else{
if(mp[x] == 0){
mp[x] = 1;
int now = q.front();
mp[now] = 0;
q.pop();
q.push(x);
}
else{
continue ;
}
}
}
int cnt = 0;
while(!q.empty()){
a[++cnt] = q.front();
q.pop();
}
cout<<cnt<<endl;
for(int i=cnt;i>=1;i--){
cout<<a[i]<<" ";
}
return 0;
}C:https://codeforces.com/contest/1234/problem/C
题意:
当时打完D再看的C,题意直接读错了。。。
题目意思:给出的六种管道,其实就相当于俩种管道,一种是直的,另一种是可以拐弯的,问你是否能从左上角流到右下角
题解:
分析单独一列的所有组合情况;如果俩个管道都是直,从前面任意一行流过来的管道都能流过去,如果俩个都是弯的管道,从前面一行的哪个位置流过来的水,都能通过旋转来将水流过去,如果一个是弯的管道一个是直的,无论如何都无法流过去。所以我们只需要模拟记录水流的位置是位于上方还是下方,往后遍历,如果存在一个弯的和一个直的或者最后水流位于上方就输出'NO',否则'YES'
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
int t,n;
string s[3];
cin>>t;
while(t--)
{
int i, k = 0;
cin>>n;
cin>>s[0]>>s[1];
for(i=0;i<n;i++)
{
if(s[k][i] > '2'){
k = 1-k;
if(s[k][i] <= '2'){
break;
}
}
}
if(k == 0 || i != n){
printf("NO\n");
continue ;
}
printf("YES\n");
}
}D:https://codeforces.com/contest/1234/problem/D
题意:
线段树的题意,给出一个字符串,俩个操作
1 x y 是将x位置的字符变成y ; 2 x y 询问[x,y]位置上有多少不同的字符
题解:
线段树板子应该可以过,不过优先考虑简单的写法,因为小写字符一共26个,我们只需要记录每个字符所在的位置存到set里即可,每次询问[x,y]区间的字符个数,只需遍历26个字符即可,具体看代码
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxx = 100005;
set<int> pos[27];
set<int>::iterator it;
char s[maxx];
int main()
{
scanf("%s",s+1);
int len = strlen(s+1) , n , x;
for(int i=1;i<=len;i++){
int k = s[i]-'a';
pos[k].insert(i);
}
scanf("%d",&n);
while(n--)
{
scanf("%d",&x);
if(x == 2)
{
int l , r ,cnt = 0;
scanf("%d %d",&l,&r);
for(int i=0;i<26;i++)
{
it = pos[i].lower_bound(l);
//cout<<*it<<endl;
if(*it <= r && *it >= l){
cnt++;
}
}
cout<<cnt<<endl;
}
else{
int p;
char c;
cin>>p>>c;
getchar();
int k = c-'a';
char nowc = s[p];
s[p] = c;
pos[nowc-'a'].erase(p);
pos[c-'a'].insert(p);
}
}
return 0;
}
查看9道真题和解析
海康威视公司福利 1325人发布