很久没打CF了 把那天的题解补上
A.
大水题 向上取整就行了 直接放代码 很好理解
#include <bits/stdc++.h>
using namespace std;
int main (){
int n;
cin>>n;
while(n--){
int t,x;
cin>>t;
int sum=0;
for(int i=0;i<t;i++){
cin>>x;
sum+=x;
}
if(sum%t==0){
cout<<sum/t<<endl;
}
else {
cout<<sum/t+1<<endl;
}
}
return 0;
}
B.
类似与QQ的聊天系统。
模拟就行了,用set 来查重,用queue来放联系人
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
ll n,k,x;
cin>>n>>k;
queue<ll>q;
set<ll>s;
for(ll i=0;i<n;i++){
cin>>x;
if(s.count(x)==1){
continue;
}
s.insert(x);
if(q.size()==k){
s.erase(q.front());
q.pop();
}
q.push(x);
}
ll t=q.size();
cout<<t<<endl;
ll a[t];
for(ll i=0;i<t;i++){
a[i]=q.front();
q.pop();
}
for(ll i=t-1;i>=0;i--){
cout<<a[i]<<" ";
}
return 0;
}
C. Pipes
给你一个2行k列的矩阵,每个格子有一种水管,问你水能不能从(0,0)流到(1,k-1)
其实也是个水题 每种管子只有唯一的一种流法,只能从管子的一端进,另一端出。遇到1,2 号管子时,也就是那种直的管子(不会换行) 就直接跳过就行了,但是如果是后面四种管子,就会换到本列的另外一行,这里用异或进行操作。
要注意的是,如果发现当前管道行不通了,要返回上一个格子,以免在最后一个格子的时候发生错误。
无奈。。。比赛时想得太多了。。。
#include <bits/stdc++.h>
using namespace std;
int main (){
int n;
cin>>n;
while(n--){
int k;
cin>>k;
string s[2];
cin>>s[0]>>s[1];
int i=0,j=0;
for(j=0;j<k;j++){
if(s[i][j]=='1'||s[i][j]=='2'){
continue;
}
else {
i^=1;
if(s[i][j]=='1'||s[i][j]=='2'){
i^=1;
break;
}
}
}
if(j==k&&i==1){
cout<<"YES"<<endl;
}
else cout<<"NO"<<endl;
}
return 0;
}
cf好卡啊 想粘个代码都打不开
D.Distinct Characters Queries
给你一个字符串 ,然后给你两个操作,1为修改第x个字符为b
2为查询[l,r] 间有多少个不同的字母,其中保证字符串中全为小写字母。
普通查询肯定会超时,这里开26个树状数组,每个维护一个字母在某个i 是否出现。 然后查询的时候 就查询该区间是否出现了该字母。
#include <bits/stdc++.h>
using namespace std;
const int MAX=1e5+5;
int d;
int c[30][MAX],book[30];
int lowbit(int x){
return x&(-x);
}
void add(int index,int x,int k){
while(x<=d){
c[index][x]+=k;
x+=lowbit(x);
}
}
int query(int index,int x){
int sum=0;
while(x>0){
sum+=c[index][x];
x-=lowbit(x);
}
return sum;
}
int main(){
int t,a,b,c;
char s[MAX];
cin>>s;
d=strlen(s);
for(int i=0;i<d;i++){
add(s[i]-'a',i+1,1);
}
cin>>t;
while(t--){
cin>>a;
if(a==1){
char x;
cin>>b>>x;
add(x-'a',b,1);
add(s[b-1]-'a',b,-1);
s[b-1]=x;
}
else{
cin>>b>>c;
memset(book,0,sizeof(book));
int sum=0;
for(int i=0;i<26;i++){
book[i]+=query(i,b-1);
}
for(int i=0;i<26;i++){
if(book[i]<query(i,c))
sum++;
}
cout<<sum<<endl;
}
}
return 0;
}