首页 > 其他分享 >ABC367

ABC367

时间:2024-08-20 11:17:21浏览次数:10  
标签:std int qzh link using include ABC367

A

link

先判断一下时间是否跨天,如果跨天了,把后一个加上\(24\),使后一个大于前一个,再判断国王喊的时间或喊的时间加\(24\)是否在范围内。

神奇的代码
#include<bits/stdc++.h>

using namespace std;

signed main(){
	
	int a,b,c;
	cin >> a >> b >> c;
	
	if(b > c) c += 24;
	if(b <= a&&a <= c||b <= a+24&&a+24 <= c) cout << "No";
	else cout << "Yes";
	
	return 0;
	
} 

B

link

输入后再用\(cout\)输出即可,因为\(cout\)会去掉末尾的\(0\)。

神奇的代码
#include<bits/stdc++.h>

using namespace std;

signed main(){
	
	double x;
	cin >> x;
	cout << x;
	
	return 0;
	
} 

C

link

搜索即可,每个数按从小到大搜,输出的一定是字典序从小到大的。

神奇的代码
#include<bits/stdc++.h>

using namespace std;

int n,k;
int r[10];
int sum,res[10];

void dfs(int x){
	if(x > n){
		if(sum%k == 0){
			for(int i = 1;i <= n;++ i)
				cout << res[i] << " ";
			cout << endl;
		}
		return;
	}
	for(int i = 1;i <= r[x];++ i){
		res[x] = i;
		sum += i;
		dfs(x+1);
		sum -= i; 
	}
}

signed main(){
	
	cin >> n >> k;
	for(int i = 1;i <= n;++ i) cin >> r[i];
	
	dfs(1);
	
	return 0;
		
}

D

link

化环为链。
我们把长度为\(n\)的环变为长度为\(2n\)的链,这样环上能走的链上也都能走,但是会有重复,那么我们针对后半部分,看它为\(t\)时哪些\(s\)满足要求。
这里如果是\(s\)走到\(t\),那么路程就是\(qzh_{t-1}-qzh_{s-1}\),\(qzh_i\)为\(a_i\)的前缀和,后半部分也一样做前缀和,但是要把前半部分的\(a_i\)也累加上。解释一下为什么是\(qzh_{t-1}-qzh_{s-1}\),因为\(a_i\)就可以走到\(i+1\)了,那么加到\(qzh_{t-1}\)就可以走到\(t\)了,然后\(qzh_{s-1}\)是走到\(s\)的,这一部分不需要。
首先,考虑如果在环上的要求:从前边段这个的后面走到它才行,否则会有绕圈。其次,考虑是\(m\)的倍数的要求,我们知道如果\((qzh_{t-1}-qzh_{s-1})%m=0\),那么\(qzh_{t-1}%m=qzh_{s-1}%m\),所以,对于每一个\(n+t\)(因为是后半段),我们只要找在\(t+1\)及以后的\(s\)中\(qzh_{s-1}%m\)和\(qzh_{t-1}%m\)一样的个数即可,那么我们可以转化为\(t+1\)及以后的\(s\)中\(qzh_s%m\)和\(qzh_{t}%m\)一样的个数。
那么我们可以用一个桶存\(%m\)的余数的个数,一开始把所有前半段的都加上,然后每次把前半段的这一个去掉(前面那些已经在前面去掉了),计入答案后把这一个加上,如果先加了会多,因为\(s\)不能是自己。

神奇的代码
#include<bits/stdc++.h>

#define int long long

using namespace std;

int n,m;
int a[200005];
int qzh[400005];
int g[1000005];
int ans;

signed main(){
	
	cin >> n >> m;
	for(int i = 1;i <= n;++ i){
		cin >> a[i];
		qzh[i] = (qzh[i-1]+a[i])%m;
	}
	
	for(int i = 1;i <= n;++ i){
		qzh[n+i] = (qzh[n+i-1]+a[i])%m;
	}
	
	for(int i = 1;i <= n;++ i) g[qzh[i]]++;
	
	for(int i = n+1;i <= 2*n;++ i){
		g[qzh[i-n]]--;
		ans += g[qzh[i]];
		g[qzh[i]]++; 
	}
	
	cout << ans;
	
	return 0;
	
}

标签:std,int,qzh,link,using,include,ABC367
From: https://www.cnblogs.com/wmmdbk/p/18369098

相关文章

  • [ABC367D] Pedometer-xzy巨佬简洁做法
    [ABC367D]Pedometer-xzy巨佬简洁做法https://www.luogu.com/article/n64n78cs对照巨佬的代码进一步理解//徐知鱼#include<bits/stdc++.h>usingnamespacestd;inlineintread(){ intx=0,f=1; charch=getchar(); while(!isdigit(ch)){ if(ch=='-')f=......
  • 题解:AT_abc367_c [ABC367C] Enumerate Sequences
    大致题意让你按照字典序输出一些长\(n\)的序列,序列中的数字有范围,且序列和需要为\(k\)。分析直接深搜。搜索的时候对从第一个元素开始,每个元素从小到大枚举所有可能的值,这样就保证答案按照字典序升序排列。用一个vector存储序列,到达边界之后计算一遍和,判断是否满足条件,然......
  • 题解:AT_abc367_d [ABC367D] Pedometer
    首先肯定要单层循环枚举元素,然后想方法求出一个元素的所有答案。一开始我写了一个二分找\(m\)倍数的方法,发现\(m\)小的时候还不如暴力。于是联想到之前做过的一道题,可以借助于取模的前缀和数组。对于当前元素\(i\),如果一个元素之前的前缀和与\(i\)之前的前缀和对\(m\)......
  • Atcoder [ABC367F] Rearrange Query 题解
    简要题意给定两个长度为\(N\)的序列\(A\)和\(B\)。有\(Q\)个查询,每个查询给定\(l,r,L,R\),其中\(l\leqr,L\leqR\),要求判断\(A\)的第\(l\)项到第\(r\)项构成的集合与\(B\)的第\(L\)项到第\(R\)项构成的集合是否相等。题解显然两个相等的集合所有元素......
  • Atcoder [ABC367C] Enumerate Sequences 题解
    简要题意给定\(n,k\)和\(R_i\),你需要输出所有满足下列条件的整数序列:长度为\(n\)。第\(i\)个元素的范围为\([1,R_i]\)。一个序列的所有元素的总和为\(k\)的倍数。输出请按照按照从左至右按位从小到大的顺序输出。题解注意到数据范围很小,我们可以直接爆搜,这里用......
  • 题解:AT_abc367_e [ABC367E] Permute K times
    题意给你一个长度为\(N\)的序列\(X\),其中每个元素都介于\(1\)和\(N\)之间(含),以及一个长度为\(N\)的序列\(A\)。打印在\(A\)上执行以下操作\(K\)次的结果。将\(A_i\)替换为\(A_{X_i}\)。每个操作同时进行。思路元素\(i\)经过\(k\)次变化后的值就是元素......