Codeforces Round #828 (Div. 3)

A. Number Replacement 模拟

易发现一个数字只能对应一个字母,mp统计判断一下即可

复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a[N];
map<int,char> mp;
int main(){
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        for(int i=0;i<n;i++)a[i]=0;
        mp.clear();
        for(int i=0;i<n;i++)cin>>a[i];
        string s;
        cin>>s;
        int f=1;
        for(int i=0;i<s.length();i++){
            if(mp.count(a[i])){
                if(mp[a[i]]==s[i])continue;
                else{
                    f=0;
                    break;
                }
            }
            else mp[a[i]]=s[i];
        }
        if(f)puts("YES");
        else puts("NO");
    }
}
复制代码

B. Even-Odd Increments  模拟

先把原数组和加一下,统计出偶数和奇数的数量,然后在累加的时候维护其奇偶数量的变化。

复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a[N];
map<int,char> mp;
int main(){
    int t;
    cin>>t;
    while(t--){
        int n,k;
        cin>>n>>k;
        long long int sum=0,cnta=0,cntb=0;
        for(int i=0;i<n;i++){
            cin>>a[i];
            sum+=a[i];
            if(a[i]%2)cnta++;
            else cntb++;
        }
        while(k--){
            int op,x;
            cin>>op>>x;
 
            if(op==1){
                if(x%2==0){
                    sum+=cnta*x;
                }
                else {
                    sum+=cnta*x;
                    cntb+=cnta;
                    cnta=0;
                }
            }
            else {
                if(x%2==0){
                    sum+=cntb*x;
                }
                else {
                    sum+=cntb*x;
                    cnta+=cntb;
                    cntb=0;
                }
            }
            cout<<sum<<endl;
        }
    }
}
复制代码

C. Traffic Light 模拟

扫一遍,边扫边更新值,同时记录一下第一个green下标,最后判断判断一下

复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
char a[N];
map<int,char> mp;
int main(){
    int t;
    cin>>t;
    while(t--){
        int n;
        char x;
        cin>>n>>x;
        for(int i=0;i<n;i++)a[i]=0;
        if(x=='g'){
            for(int i=0;i<n;i++)cin>>a[i];
            cout<<0<<endl;
            continue;
        }
        int minidex=0,f=0;
        int maxx=0,num=0;
        for(int i=0;i<n;i++){
            cin>>a[i];
            if(a[i]=='g'&&!f){
                f=1;
                minidex=i;
            }
            if(a[i]=='g'){
                maxx=max(num,maxx);
                num=0;
            }
            else if(a[i]==x){
                if(num!=0){
                    num++;
                    continue;
                }
                else num++;
            }
            else {
                if(num==0)continue;
                else num++;
            }
        }
        if(num==0)cout<<maxx<<endl;
        else cout<<max(maxx,num+minidex)<<endl;
    }
}
复制代码

D. Divisibility by 2^n  贪心

在数组中找出2的因子个数,如果满足了n个ans就是0,否则需要通过操作来补足。操作出1-n所有数中2因子的数量,优先操作2因子数量最大的数。

复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
long long int ph[32];
int main(){
    for(int i = 1; i <= 31; ++i)ph[i] = 1<<i;
    int t;
    scanf("%d",&t);
    while(t--){
        int n;
        scanf("%d",&n);
        long long int bei=0;
        for(int i=0;i<n;i++){
                int x;
            scanf("%d",&x);
            while(x%2==0){
                x/=2;
                bei++;
            }
        }
        int r=0;
        for(int i=1;i<=32;i++){
            if(ph[i]>n)r=i;
        }
        int ans=0;
        if(bei>=n){
            printf("0\n");
            continue;
        }
        int f=0;
        for(int i = r; i >= 1; i--){
            for(int j = 1; ph[i] <= n/j ; j += 2){
             bei += i;
             ans ++;
             if(bei>= n){
                printf("%d\n",ans);
                f=1;
                break;
            }
        }
        if(f)break;
       }
 
       if(bei<n)printf("-1\n");
    }
}
复制代码

E2. Divisible Numbers (hard version)  数学暴力枚举因子

暴力枚举,虽然abcd范围是1e9,但他们因子并不多,如下图,枚举a,b的因子,乘积为a*b的因子,计算找到的第一个大于a和b的数,判断是否大于c和d

复制代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ull;
 
vector<ull> va,vb;
int main(){
    int t;
    cin>>t;
    while(t--){
        va.clear();
       vb.clear();
        ull a,b,c,d;
        cin>>a>>b>>c>>d;
        for(int i=1;i*i<=a;i++){
            if(a%i==0){
                va.push_back(i);va.push_back(a/i);
            }
        }
        for(int i=1;i*i<=b;i++){
            if(b%i==0){
                vb.push_back(i);vb.push_back(b/i);
            }
        }
        int h=0;
        for(auto it1:va){
            for(auto it2:vb){
                ull g=1ull*it1*it2;
                ull x=((a+g)/g)*g;
                if(x>c)continue;
                ull f=1ull*a*b/g;
                ull y=(ull)((b+f)/f)*f;
                if(y>d)continue;
                cout<<x<<' '<<y<<endl;
                h=1;
                break;
            }
            if(h)break;
        }
        if(!h)cout<<-1<<' '<<-1<<endl;
    }
}
复制代码

 

 F. MEX vs MED  统计问题

待补

posted @   Dengpc  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
哪有顷刻之间的心灰意冷,有的,只是日积月累的看透罢了。
点击右上角即可分享
微信分享提示