首页 > 其他分享 >AT coder 380

AT coder 380

时间:2024-11-22 11:42:06浏览次数:1  
标签:coder int ll cnt long cin 380 字符串

A

题目:六个数字中是否满足1有1个,2有两个,三有三个;

模拟

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 2e5+5;
map<int, int> ma;
int n,flag;

void ac() {
	cin >> n;

	while (n) {
		int cnt = n % 10;
		ma[cnt]++;
		n /= 10;
	}
	if (ma[1]==1 && ma[2]== 2 && ma[3] == 3) cout << "Yes" << endl;
	else cout << "No" << endl;
}

B

题目:长度为N的串,首项为“|”,之后是根据数组A的每一项的数字添加对应得*号之后添加一个‘|’,求A数组;

模拟

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 2e5+5;
map<int, int> ma;
int n,flag;
string s;
void ac() {
	cin >> s;
	int ans = 0;
	for (int i = 1; i < s.size(); i++) {
		if (s[i] == '-') {
			ans++;
		}
		if (s[i] == '|') {
			cout << ans << " ";
			ans = 0;
		}
	}
}

C

题目:给定一个01字符串,连续得1组成一个块,输出将m块字符移动到n块字符后的字符串

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 2e5+5;
map<int, int> ma;
int n,k;
string s;
void ac() {
	cin >> n >> k >> s;
	int l1=0,l = 0, r = 0, cnt = 0,flag=0;
	for (int i = 0; i < n; i++) {
		if (s[i] == '1' && !flag) {
			cnt++;//记录块数
			if (cnt == k) {//找到了第m块
				l = i;
				break;
			}
			flag = 1;
		}
		if (s[i] == '0' && flag) {
			flag = 0;
			if (cnt == k - 1) {//找到了第n块;
				l1 = i;
			}
		}
	}
	cnt = l - l1;//n块结尾到m块开头得距离;
	for (int i = l; i < n; i++) {
		if (s[i] == '0') break;
		else {
			swap(s[i], s[i - cnt]);//交换字符(距离与cnt相同,直到m块结尾)
		}
	}
	cout << s;
}

D

题目:给定一个字符串S,将其大小写反转得到字符串T,将他加入S后面得到新的字符串S,再重复这个步骤10^100次,问第i个字符是什么

分析:通过模拟字符串步骤发现,在原字符串大小为一块,初始为0,在块数的二进制中1的个数为偶,是原字符串,反之是反转后的字符串,所以只用找出i位于哪个块中即可得到该处字符的答案;

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 2e5+5;
string s;
ll q,k;

ll sum1(ll x) {//找二进制1的个数
	ll res = 0;
	while(x) {
		if (x % 2 == 1) {
			res++;
		}
		x /= 2;
	}
	return res;
}

void ac() {
	cin >> s >> q;
	ll cnt = s.size();
	while (q--) {
		cin >> k;
		k--;
		ll c = k % cnt;//找出k位于原字符串的位置
		ll wei = 0;
		//cout << c<<" " << s[c] << endl;
		if (k >= cnt) 
			wei = k / cnt;//找到k在哪个字符串块里;
		ll x = sum1(wei);
		//cout << x << endl;
		if (x%2==0) {
			cout << s[c] << " ";
		}
		else {
			if (s[c] >= 'a' && s[c] <= 'z') {
				printf("%c ", s[c] - 'a' + 'A');
			}
			else if (s[c] >= 'A' && s[c] <= 'Z') {
				printf("%c ", s[c] - 'A' + 'a');
			}
		}
	}
}

E

题目:一行有N个单元格i与i+1相邻,i被涂上第i种颜色,有两种操作1.(1 x c)将以下单元格重新涂成颜色c:通过重复移动到与当前单元格相同颜色的相邻单元格,从单元格x到达的所有可到达单元格(相邻的块才能颜色相同可以合并为一个块,被一起染色)2.(2 c)输出c颜色的块数;

分析:并查集合并,考虑合并的格子是否相邻,相邻则合并为一个块,一起变色

ll n, q, f[N], ans[N],C[N],si[N],a, x, c;

ll find(ll x) {
	return f[x] == x ? x : f[x] = find(f[x]);
}
void marge(ll x, ll y) {
	ll fx = find(x), fy = find(y);
	if (fx == fy) return;
	if (fx > fy)swap(fx, fy);//保证是小的数是根节点
	f[fy] = fx;
	si[fx] += si[fy];
}

void ac() {
	cin >> n >> q;
	for (int i = 1; i <= n; i++) ans[i] = 1,f[i]=i,C[i]=i,si[i]=1;//ans记录第i种颜色的块数,f:并查集合并数组,si:记录合并后的块数,C:颜色
	while (q--) {
		cin >> a;
		if (a == 1) {
			cin >> x >> c;
			x = find(f[x]);//找到根节点
			ans[C[x]] -= si[x];//根节点块数减去将被染色的块
			ans[c] += si[x];
			C[x] = c;//该点变色
			if (C[find(x + si[x])] == c) marge(x, x + si[x]);//该块的与后面的块相邻
			if (C[find(x - 1)] == c) marge(x - 1, x);//与前面相邻
		}
		else {
			cin >> c;
			cout << ans[c] << endl;
		}
	}
}

标签:coder,int,ll,cnt,long,cin,380,字符串
From: https://www.cnblogs.com/27hhhh/p/18562462

相关文章

  • 计算机毕业设计必看必学38034+Web影评系统设计与实现原创定制程序单片机,java、PHP、p
    摘   要网络的兴起,让电影从业者和影迷之间的交流变得更加的便捷,影评系统可以成为电影公司和制片方的重要参考,通过分析用户对电影的评价和反馈,了解观众的需求和口碑反应。基于这些信息,电影公司可以制定更有效的营销策略,提升电影的知名度和票房。同时也让用户有了一个可......
  • Atcoder Regular Contest 061 题解
    ARC061C.ManyFormulas*1089首先预处理出原数区间\([i,j]\)所代表的真实数字。然后注意到\(|s|\leq10\),所以直接爆搜回溯最后判断即可。或者状压枚举也可以,反正非常简单。#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;strings;LLSum[11][11]......
  • Atcoder Regular Contest 060 题解
    ARC060C.TakandCards*1583简单题。考虑一个非常非常常见的Trick。把区间平均值为\(k\)转化为区间和为\(0\)只需要将每个数都减去\(k\)即可。然后就是一个朴素的背包求和为\(0\)方案数。注意处理负数下标就好了。#include<bits/stdc++.h>usingnamespacestd;typ......
  • Atcoder Regular Contest 059 题解
    ARC059C.BeTogether签到题。枚举要改成哪个,因为值域只有\([-100,100]\)。然后对总代价取个\(\min\)即可。#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;constLLMAXN=105;LLn,A[MAXN];intmain(){ ios::sync_with_stdio(false); cin.ti......
  • atcoder 专项2
    有些题其实都挺有价值的,搞得我都想每个都单独建随笔,但是这样还是太多太乱了,之前那个难度较低,部分题甚至可以直接删除,遂新开一个2记录更高质量的题目。[ABC379E]SumofAllSubstrings看到有思路但是想到要用高精度就头疼,但是这题并没有用到很复杂的高精度,相反甚至更像是一个......
  • Atcoder Regular Contest 058 题解
    ARC058C.Iroha'sObsession*1174\(n\)再大一点的就是巨大恶心分类讨论。但我们注意到\(n\leq10^4\),所以我们可以直接暴力枚举然后写个check。首先我们先把被ban掉的数存标记一下。然后从\(n\)开始往上查,一直查到\(10^6\)基本就可以了。然后每次检查一下有没有数位被......
  • AtCoder Beginner Contest 380
    AtCoderBeginnerContest380总结A用桶统计\(1\),\(2\),\(3\)出现的次数,判断即可。#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<queue>#include......
  • AtCoder Beginner Contest 352 - VP记录
    A-AtCoderLine赛时整活想写异或版本的swap写错了还WA了一发。不过现在会写了:x^=y^=x^=y点击查看代码#include<cstdio>#include<algorithm>usingnamespacestd;intmain(){ intn,x,y,z; scanf("%d%d%d%d",&n,&x,&y,&z); if(x>y)swap(x,y); p......
  • ABC380 DEFG 题解
    ABC380题解赛时秒了ABCDE(好吧其实还是略有卡顿,写完大概花了55min),看到F有博弈直接跑了,没注意到数据范围这么小,看到G一下就会了大致思路,但具体细节上搞复杂了,快写完了才发现不用维护这么多(恼),然后因为某些神秘错误现在都还没有调出来。至于F,赛后看见数据范围这么小,自己独立......
  • Atcoder Beginner Contest 367
    老规矩此处略过前三题,不过B值得关注一下。D题 Pedometer思路肥肠煎蛋,只需要搞一个前缀额然后看前面的前缀和是否有跟当前的前缀和同余的情况(%M)暴力求解这步是O(n^2)的,因此需要优化。这里就用到了一个技巧——哈希表消除分支。所谓的哈希表消除分支其实就是mp[pre_s]存一......