首页 > 其他分享 >ABC347

ABC347

时间:2024-04-05 10:22:36浏览次数:24  
标签:子串 map int cy ABC347 using main

A

link

很简单
遍历,判断模\(k\)是否为\(0\),如果为\(0\),输出\(a_i/k\)。

点击查看代码
#include<bits/stdc++.h>

using namespace std;

int n,k;
int a[105];

signed main(){
	
	cin >> n >> k;
	
	for(int i = 1;i <= n;++ i){
		cin >> a[i];
		if(a[i]%k == 0) cout << a[i]/k << " ";
	}
	
	return 0;
	
}

B

link

前置知识:\(map\)
\(map\)类似数组,如\(a_b\),\(a\),\(b\)均可为任何类型,如字符串,大概意思就是,\(a\)对应\(b\)。
遍历每一个子串,看看这个子串在前面出没出现过,没出现过,答案加\(1\)。
怎样遍历子串。
首先两重循环,枚举子串的左右边界,在用一重循环,枚举在当前边界内每一个字符,组成子串。
怎样判断子串出没出过。
使用\(map\),看看\(map\)的当前字符串是否为\(1\),是,出现过,否,没出现过,答案加一,赋为\(1\),即出现过了。

点击查看代码
#include<bits/stdc++.h>

using namespace std;

char s[105];
int n;
string t;
map<string,int> mp;
int ans;

signed main(){
	
	cin >> s+1;
	n = strlen(s+1);
	
	for(int i = 1;i <= n;++ i){
		for(int j = i;j <= n;++ j){
			t.clear();
			for(int k = i;k <= j;++ k){
				t += s[k];
			}
			if(!mp[t]) mp[t] = 1,ans++;
		}
	}
	
	cout << ans;
	
	return 0;
	
}

C

link

首先,把每一个对应到第一周的上班日和第二周的休息日中。
那么只需要往后移动,把第一周上班日中的全移到第二周休息日,同时第二周休息日中的不能移出去。
找到这些中最大的和最小的(改后的数),如果大于休息日的时间,即会移出去,不可以。
还有一种方案,我们可以从前面截一段放到后面再判断。

点击查看代码
#include<bits/stdc++.h>

#define int long long

using namespace std;

int n,a,b;
int p[200005];
int d,ans = 1e18;
int ma,mi = 1e18;

signed main(){
	
	cin >> n >> a >> b;
	for(int i = 1;i <= n;++ i){
		cin >> d;
		d %= (a+b);
		if(d == 0) d = a+b;
		if(d <= a){
			d += a+b;
		}
		ma = max(ma,d);
		mi = min(mi,d);
		p[i] = d;
	}
	
	sort(p+1,p+1+n);
	
	for(int i = 1;i < n;++ i){
		ans = min(ans,a+b-p[i+1]+p[i]+1);
	}
	
	ans = min(ans,ma-mi+1);
	if(ans <= a) cout << "Yes";
	else cout << "No";
	
	return 0;
	
}

D

link

首先,我们定义一个\(cy\)为\(y\)中\(1\)的个数。
则,如果\(cy>a+b\),肯定不行。
如果\(cy=a+b\),把\(a\)个\(1\)给第一个数,\(b\)个\(1\)给第二个数,要对应到位置,即可。
如果\(cy<a+b\),\(a\)和\(b\)剩的是单数,不可以,双数可以。
双数的话,把\(a\)个\(1\)给第一个数,\(b\)个\(1\)给第二个数,找第一个和第二个数都是\(0\)的位置都赋成\(1\),即可。
注意不超过\(2^60\)。

点击查看代码
#include<bits/stdc++.h>

#define int long long

using namespace std;

int a,b,c,cy;
int ca[65];
int aa[65],ba[65];

signed main(){
	
	cin >> a >> b >> c;
	
	int t = c;
	for(int i = 0;i <= 59;++ i){
		if(t&1) ca[i] = 1,cy++;
		t >>= 1;
	}
	
	if(cy > a+b||(a+b-cy)%2 != 0){
		cout << -1;
		return 0;
	}
	
	int mu = (a+b-cy)/2;
	a -= mu,b -= mu;
	
	for(int i = 0;i <= 59;++ i){
		if(ca[i]){
			if(a) aa[i] = 1,a--;
			else if(b) ba[i] = 1,b--;
		}
	}
	
	if(a < 0||b < 0){
		cout << -1;
		return 0;
	}
	
	for(int i = 0;i <= 59;++ i){
		if(!ca[i]){
			if(mu){
				aa[i] = 1;
				ba[i] = 1;
				mu--;
			}
		}
	}
	
	if(mu){
		cout << -1;
		return 0;
	}
	
	int y,e,w;
	y = e = 0ll;
	w = 1ll;
	
	for(int i = 0;i <= 59;++ i){
		if(aa[i]) y += w;
		if(ba[i]) e += w;
		w *= 2;
	}
	
	cout << y << " " << e << endl;
	
	return 0;
	
}

标签:子串,map,int,cy,ABC347,using,main
From: https://www.cnblogs.com/wmmdbk/p/18114490/ABC347

相关文章

  • ABC347G 题题解
    还算是比较经典了。首先我们注意到一个性质:\(1+3+\cdots+n=n^2\)。所以我们可以把平方拆开。然后容易证明\(a_{i,j}\)填\(1\)一定比填\(0\)不劣。我们可以把\(a_{i,j}\)拆成\(4\)个点,然后我们想到了最小割。构造网络:\(a_{i,j,x}\leftarrowa_{i,......
  • ABC347 C~D~?(更新中)
    Portal:https://atcoder.jp/contests/abc347/tasksABC347只过了\(A,B\),再创新低,。。。遂来补题C-IdealHolidays题意简述输入\(n,a,b,d_1,d_2,…,d_n\),表示在Atcoder国每周分为\(a\)天休息日和\(b\)天工作日,现在有\(n\)个事件,第\(i\)个事件落在第\(d_i\)日。我忘了今天是这......
  • ABC347F 题解
    我们考虑这三个正方形的相对位置有多少种情况。我们把正方形的顶点设为\((x_i,y_i)\)。容易发现,放置合法当且仅当\(\foralli\neqj,|\x_i-x_j\|\geqd\\text{or}|\y_i-y_j\|\geqd\)。发现这只有可能是以下两种情况。于是便可以开始写了。/***********......
  • [ABC347] AtCoder Beginner Contest 347 题解
    [ABC347]AtCoderBeginnerContest347题解A模拟。BSA模板,把所有子串丢进哈希表里即可。C逆天题,这个分讨并不显然。考虑计算所有天数到今天的偏移量,然后如果最远的和最近的天数的距离\(\leA\)肯定可以,否则可以把所有天向右平移一段距离,然后使得最远的天到达第二周的......
  • [ABC347C] Ideal Holidays题解
    [ABC347C]IdealHolidays题解原题传送门原题传送门(洛谷)​ 题意翻译:​ 在\(AtCoder\)王国中,一个周有\(A+B\)天。其中在一周中,\([1,A]\)天是假日,\([A+1,B]\)天是工作日。​ 高桥有\(N\)个计划,第\(i\)个计划安排在\(i\)天后。他不知道今天是周几,但他想知道是否......
  • AT_abc347_d 的题解
    (一)数学题。根据\(C\)的值,可以得出\(x\)和\(y\)有\(s1+s\)个相同的数位和\(s2\)个不同的数位。\(s1\)是\(C\)的二进制中\(0\)的数量,\(s2\)是\(C\)的二进制中\(1\)的数量。\(x\)和\(y\)可以通过在开头放\(s\)个\(1\)的方式既不改变异或大小,又能凑到......
  • AT_abc347_e的题解
    (一)可能因为我太菜了,感觉D>E。用\(vis_i\)表示\(i\)是否出现,\(sum_i\)表示当前集合大小。用vector维护出现的区间的端点。将\(sum\)数组前缀和即可。(二)AC代码。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intn,q,x,siz,sum[200010];......
  • AT_abc347_e 题解
    很水。一个las数组,记录a[i]这个数上一次被加入是什么时候。注意,为防误判,在a[i]被删除的时候,将las[a[i]]设为\(0\)。你也可以这么理解:las是记录在哪出现的visit数组。每次加入一个数的时候,\(\left|S\right|\)就加\(1\),并且使las[a[i]]等于i。删除时,\(\left|S......
  • AT_abc347_c 题解
    最开始的思路爆炸了我就不写了。先d[i]%=(a+b)。然后,排序,破环为链,相当于存储了下一周。再然后,从\(1\)到\(n\)进行一个循环,若d[i+n-1]-d[i]+1<=a就输出Yes。它的原理是什么?翻译一下上面那个语句,就是“我前一个任务的日期的下一周距离我这个任务的日期小于等于节假日天......
  • ABC347题解
    省流:输+赢D按位分析。既然两个数异或后的结果是\(C\),那就考虑\(C\)中为\(1\)的数中有几个是在\(X\)当中的。假如\(\text{a-popcnt(X)==b-popcnt(Y)}\),那么在\(C\)中为\(0\)的数中随便选\(\text{a-popcnt(x)}\)个即可。注意longlong。codeE假如......