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 ii<=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 10k,否则就不能构成
  • 如果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+输出路径)

[ACM]Codeforces Round #534 (Div. 2)

CodeForces 762D Maximum path

codeforces 762 C. Two strings

[Codeforces]762F - Tree nesting