Codeforces Round #762 (Div. 3)
Posted MangataTS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #762 (Div. 3)相关的知识,希望对你有一定的参考价值。
A. Square String?(签到+字符串分割)
题意
问你一个字符串能不能均分成两个相同的字串(长度相同)
思路
因为长度相同那么奇数长度直接输出-1
,偶数长度分割一下,然后判断一下是否相等即可
Code
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000009
ll ksm(ll a,ll b)
ll ans = 1;
for(;b;b>>=1LL)
if(b & 1) ans = ans * a % mod;
a = a * a % mod;
return ans;
ll lowbit(ll x)return -x & x;
const int N = 2e6+10;
int a[N];
int main()
int n;
cin>>n;
for(int i = 1;i <= n; ++i)
string ch;
cin>>ch;
if(ch.size() & 1) puts("NO");
else
string ch1,ch2;
ch1 = ch.substr(0,ch.size()/2);
ch2 = ch.substr(ch.size()/2,ch.size());
if(ch1 == ch2) puts("YES");
else puts("NO");
return 0;
B. Squares and Cubes
题意
找出N范围内所有的平方数和立方数
思路
可能很多人想的是直接用公式: n 2 + n 3 − n 6 \\sqrt[2]n+\\sqrt[3]n-\\sqrt[6]n 2n+3n−6n,但是这样会有精度误差,我也是用这个公式各种向上向下取整来调试,最后还是写了循环扫
我们只用处理一下 i ∗ i < = n i * i <= n i∗i<=n范围内的数字即可,每次记录一下,如果有重复的就不算了,也就是我们将复杂度降低到了 n 2 × T \\sqrt[2]n \\times T 2n×T
或者你可以预处理1e9的数据,然后二分查找
Code1
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000009
ll ksm(ll a,ll b)
ll ans = 1;
for(;b;b>>=1LL)
if(b & 1) ans = ans * a % mod;
a = a * a % mod;
return ans;
ll lowbit(ll x)return -x & x;
const int N = 2e6+10;
ll n;
map<ll,ll> vis;
int main()
int t;
scanf("%d",&t);
while(t--)
vis.clear();
ll p2 = 0,p3 = 0,pt = 0;
scanf("%lld",&n);
ll ans = 0;
for(ll i = 1;i <= n; ++i)
p2 = i * i,p3 = p2 * i;
if(p2 > n) break;
if(!vis[p2] && p2 <= n)
vis[p2] = true,ans++;
if(!vis[p3] && p3 <= n)
vis[p3] = true,ans++;
printf("%lld\\n",ans);
return 0;
Code2
#include <bits/stdc++.h>
using i64 = long long;
std::vector<int> good;
void solve()
int n;
std::cin >> n;
std::cout << std::upper_bound(good.begin(), good.end(), n) - good.begin() << "\\n";
int main()
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
const int limit = 1E9;
for (int i = 1; i * i <= limit; i++)
good.push_back(i * i);
for (int i = 1; i * i * i <= limit; i++)
good.push_back(i * i * i);
std::sort(good.begin(), good.end());
good.erase(std::unique(good.begin(), good.end()), good.end());
int t;
std::cin >> t;
while (t--)
solve();
return 0;
C. Wrong Addition(模拟)
题意
给你一个数字S和a,问你能否找到一种b,使得满足他的运算规则,即:将两位上面的加法的结果直接放在数字的位数上面:
eg:
17236 + 03465 = 1106911 //这里的后面11就是6+5的结果直接放在ans的后面
如果能找到那么输出b,否则输出-1
思路
我们直接从两个数字的最低位模拟到最高位,如果哪个数字到了最高位了,我们用0补齐,进行运算,假设我们这里用 a [ i ] − s [ j ] a[i]-s[j] a[i]−s[j]
- 如果k大于0,且前一位是一个1,那么我们直接插入 10 − k 10-k 10−k,否则就不能构成
- 如果k等于0,那么我们直接插入0即可
- 如果k小于0,那么我们直接插入-k即可
Code
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000009
ll ksm(ll a,ll b)
ll ans = 1;
for(;b;b>>=1LL)
if(b & 1) ans = ans * a % mod;
a = a * a % mod;
return ans;
ll lowbit(ll x)return -x & x;
const int N = 2e6+10;
int a[N];
int main()
int t;
cin>>t;
while(t--)
string s,a;
cin>>a>>s;
bool fg = true;
string b = "";
for(int i = a.size()-1,j = s.size()-1;(i >= 0 || j >= 0);--i,--j)
int k ;
if(i < 0)
k = '0' - s[j];
else if(j < 0)
k = a[i] - '0';
else
k = a[i]-s[j];
if(k > 0)
if(j - 1 < 0)
fg = false;
break;
else
--j;
if(s[j] != '1')
fg = false;
break;
else
b.insert(0,to_string(10 - k));
else
b.insert(0,to_string(-k));
if(fg)
int i = 0,len = b.size();
while(i < len && b[i] == '0') i++;
for(;i < len; ++i)
cout<<b[i];
cout<<'\\n';
else
puts("-1");
return 0;
E. MEX and Increments(思维+贪心)
题意
问你对一个数列的任意进行随意增长,使得这个数列可以得到的最小值(MEX)的最小操作次数是多少,如果没有一个操作能做到就输出-1,否则输出操作的次数,我们要求[0,n]的所有MEX
思路
对于这一次我们是否能找到一种满足情况的操作,我们在上一次就能知道,所以我们每次都提前处理一下,其实我们发现如果我们元素在递增的过程中,有一处断开了,那么下一次我们就不能找到一种满足情况的操作,详情请看代码
Code
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000009
ll ksm(ll a,ll b)
ll ans = 1;
for(;b;b>>=1LL)
if(b & 1) ans = ans * a % mod;
a = a * a % mod;
return ans;
ll lowbit(ll x)return -x & x;
const int N = 2e6+10;
map<ll,ll> vis;
ll a[N];
int main()
int n,t;
scanf("%d",&t);
while(t--)
scanf("%d",&n);
vis.clear();
for(int i = 0;i < n; ++i)
scanf("%lld",&a[i]);
vis[a[i]] ++;
ll ans = 0;
vector<int> V;
V.clear();
for(int i = 0;i <= n; ++i)
if(ans == -1)
printf("-1%c",i==n?'\\n':' ');
continue;
printf("%lld%c",ans+vis[i],i==n?'\\n':' ');
while(vis[i]--) V.push_back(i);
if(V.empty()) ans = -1;
else
ans += i - V.back();
V.pop_back();
return 0;
以上是关于Codeforces Round #762 (Div. 3)的主要内容,如果未能解决你的问题,请参考以下文章
上分准备 VP Codeforces Round #762 (Div. 3) 4题ABCE
Codeforces Round #436 E. Fire(背包dp+输出路径)