https://codeforces.ml/contest/1471/problems
Codeforces Round #694Div. 2
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;
}