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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值