Codeforces Round #694 (Div. 2)

https://codeforces.ml/contest/1471/problems

D. Strange Definition

在归类集合的时候不一定要,找出与当前元素在同一集合的所有元素来归类集合

也可以用当前元素属于某个集合来归类集合,在问题较为复杂的时候,考虑集合中元素所具有的属性来归类

map写到外面的时候时间更快,在复杂度比较紧张的情况下,可以用int就用int

如果每个元素都进行分解较为麻烦的话,可以考虑预处理,如此题可以把所有的元素的因子都处理出来,用筛的方法

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#pragma GCC optimeize (3,"Ofast","inline")
const int Mn = 3e5 + 5;
int a[Mn];
int f[Mn];
const int Mx = 1e3;
inline void Get(){
    
    
    for(int i = 1;i <= Mx;i ++) f[i] = i * i;
}
map <int,int> mp;
inline void slove(){
    
    
    int n;scanf("%d",&n);
    mp.clear();
    int ans1 ,ans2;
    ans1 = ans2 = 0;
    for(int i = 1;i <= n;i ++){
    
    
        scanf("%d",a + i);
    }
    int cnt = 0;
    for(int i = 1;i <= n;i ++){
    
    
        int t = a[i];
        for(int i = 2;i <= Mx;i ++){
    
    
            while(t % f[i] == 0){
    
    
                t /= f[i];
            }
            if(f[i] > t) break;
        }
        mp[t] ++;
    }
    for(auto it : mp){
    
    
        ans1 = max(ans1,it.second);
        if(it.second % 2 == 0 || it.first == 1) ans2 += it.second;
    }
    ans2 = max(ans2,ans1);
    int q;
    scanf("%d",&q);
    while(q --){
    
    
        ll time;scanf("%lld",&time);
        if(time >= 1) printf("%d\n",ans2);
        else printf("%d\n",ans1);
    }
}
int main()
{
    
    
    Get();
    int _;
    scanf("%d",&_);
    while(_--)slove();
    return 0;
}

B. Strange List 注意可以用模拟写的题目尽可能用模拟写

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int Mn = 2e5 + 5;
ll a[Mn];
ll cost[Mn];
inline void slove(){
    
    
    int n;ll x;
    scanf("%d%lld",&n,&x);
    ll ans = 0;
    for(int i = 1;i <= n;i ++) scanf("%lld",a + i),cost[i] = a[i],ans += a[i];
    int num  = 32;
    int flag = 0;
    while(num --){
    
    
        if(flag) break;
        for(int i = 1;i <= n;i ++){
    
    
            if(a[i] % x == 0){
    
    
                a[i] /= x;
                ans += cost[i];
            }else{
    
    
                flag = 1;
                break;
            }
        }
    }
    printf("%lld\n",ans);
}
int main()
{
    
    
    int _;scanf("%d",&_);
    while(_--)slove();
    return 0;
}

C. Strange Birthday Party 水题

#include <bits/stdc++.h>
using namespace std;
#define ll long long
bool cmp(ll a,ll b){
    
    
    return a > b;
}
const int Mn = 3e5 + 5;
ll k[Mn],v[Mn],vis[Mn];
ll c[Mn];
inline void slove(){
    
    
    int n,m;scanf("%d%d",&n,&m);
    int pos = 1;
    for(int i =1 ;i <= n;i ++) scanf("%lld",k + i);
    for(int i = 1;i <= m;i ++) scanf("%lld",c + i);
    sort(k + 1,k + n + 1,cmp);
    ll ans =0;
    for(int i = 1;i <= n;i ++){
    
    
        if(pos > k[i]) ans += c[k[i]];
        else ans += c[pos ++];
    }
    printf("%lld\n",ans);
}
int main()
{
    
    
    int _;scanf("%d",&_);
    while(_--)slove();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_45673816/article/details/114005441