Codeforces Round #590 (Div. 3)(e、f待补

https://codeforces.com/contest/1234/problem/A

A. Equalize Prices Again

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 int main(){
 5     int n,a;
 6     int t;
 7     cin>>t;
 8     ll sum = 0,ans;
 9     while(t--){
10         cin>>n;sum = 0;
11         for(int i = 0;i < n;++i){
12             cin>>a;sum+=a;
13         }
14         ans = sum/n;
15         if(sum%n)ans+=1;
16         cout<<ans<<endl;
17     }
18 }
AC代码

https://codeforces.com/contest/1234/problem/B1

B1. Social Network (easy version)

https://codeforces.com/contest/1234/problem/B2

B2. Social Network (hard version)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a;
int n ,k ,now=0,fi=0;
vector<ll>s;
map<ll,int>mp;
int main(){
    cin>>n>>k;
    for(int i = 0;i < n;++i){
        cin>>a;
        if(mp[a]==0){
                mp[a]=1;s.push_back(a);
            if(now<k){
                now++;
            }
            else if(now==k){
                mp[s[fi]]=0;fi++;
            }
        }
    }
    cout<<now<<endl;
    int l =s.size()-1;
    int cnt=0;
    while(cnt<now&&l>=0){
        if(mp[s[l]])cnt++,cout<<s[l]<<" ";
        l--;
    }
    cout<<endl;
 
    return 0;
}
AC代码

https://codeforces.com/contest/1234/problem/C

C. Pipes

旋转一遍发现前两种其实是不同方向摆放的一种管道,后四个同理,也就是只有两个管道,一个是直流另一个会变向,然后问题就很简单了。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4  
 5 int main(){
 6     int t,n;
 7     cin>>t;
 8     while(t--){
 9         cin>>n;
10         string a[3];cin>>a[0]>>a[1];
11         int now=0,flag =1;
12         for(int i = 0;i <n;++i){
13             if(a[now][i]=='1'||a[now][i]=='2')continue;
14             else{
15                now=1-now;
16                if(a[now][i]=='1'||a[now][i]=='2'){
17                 flag=0;break;
18                }
19             }
20         }
21         if(flag==0||now==0)cout<<"no"<<endl;
22         else cout<<"yes"<<endl;
23     }
24     return 0;
25 }
AC代码

https://codeforces.com/contest/1234/problem/D

D. Distinct Characters Queries

用线段树维护不同字母的个数orz学到了新东西,待会再看看set的做法?

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5+7;
int a[N],ans[30];
int tree[4*N][26];
void build(int l,int r,int rt){
    if(l==r){tree[rt][a[l]]++;return ;}
    int mid=(l+r)/2;
    build(l,mid,rt*2);
    build(mid+1,r,rt*2+1);
    for(int i = 0;i < 26;++i)tree[rt][i]=tree[rt*2][i]+tree[rt*2+1][i];
}
void f5(int l,int r,int rt,int x,int p,int f){
    if(l==r){tree[rt][p]--;tree[rt][f]++;return ;}
    int mid=(l+r)>>1;
    if(x<=mid)f5(l,mid,rt<<1,x,p,f);
    else f5(mid+1,r,rt<<1|1,x,p,f);
    for(int i = 0;i < 26;++i)tree[rt][i]=tree[rt<<1][i]+tree[rt<<1|1][i];
}
void query(int l,int r,int rt,int ll,int rr){
    if(r<=rr&&l>=ll){
        for(int i = 0;i < 26;++i)ans[i]+=tree[rt][i]; return ;
    }
    int mid=(l+r)>>1;
    if(ll<=mid)query(l,mid,rt<<1,ll,rr);
    if(rr>mid)query(mid+1,r,rt<<1|1,ll,rr);
}
int main()
{
    ios::sync_with_stdio(0);
    string s;cin>>s;int n = s.size();
    for(int i = 0;i < n;++i)a[i+1]=s[i]-'a';
    build(1,n,1);
    int m;cin>>m;
    while(m--){
        int flag,x,l,r;char c;cin>>flag;
        if(flag==1){
            cin>>x>>c;
            f5(1,n,1,x,s[x-1]-'a',c-'a');
            s[x-1]=c;
        }
        else{
            cin>>l>>r;memset(ans,0,sizeof(ans));
            query(1,n,1,l,r);
            int tot=0;
            for(int i = 0;i < 26;++i)if(ans[i])tot++;
            cout<<tot<<endl;
        }
    }
    return 0;
}
AC代码

 

posted @ 2019-10-03 12:19  小草今天又在摸鱼吗  阅读(224)  评论(0编辑  收藏  举报