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,那么路程就是qzht1qzhs1qzhiai的前缀和,后半部分也一样做前缀和,但是要把前半部分的ai也累加上。解释一下为什么是qzht1qzhs1,因为ai就可以走到i+1了,那么加到qzht1就可以走到t了,然后qzhs1是走到s的,这一部分不需要。
首先,考虑如果在环上的要求:从前边段这个的后面走到它才行,否则会有绕圈。其次,考虑是m的倍数的要求,我们知道如果(qzht1qzhs1),那么qzht1,所以,对于每一个n+t(因为是后半段),我们只要找在t+1及以后的sqzhs1qzht1一样的个数即可,那么我们可以转化为t+1及以后的sqzhsqzht一样的个数。
那么我们可以用一个桶存的余数的个数,一开始把所有前半段的都加上,然后每次把前半段的这一个去掉(前面那些已经在前面去掉了),计入答案后把这一个加上,如果先加了会多,因为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;
	
}

E

link

倍增。
我们用倍增的思想,用xi,j代表第i个位置操作2j次后是a的哪一位上的数,预处理后对于每一个数要二进制分解k去操作,哪一位有1,就变一下。

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

#define int long long

using namespace std;

int n,k;
int x[200005][64];
int a[200005];

signed main(){
	
	cin >> n >> k;
	for(int i = 1;i <= n;++ i) cin >> x[i][0];
	for(int i = 1;i <= n;++ i) cin >> a[i];
	
	for(int i = 1;i <= 63;++ i){
		for(int l = 1;l <= n;++ l){
			x[l][i] = x[x[l][i-1]][i-1];
		}
	}
	
	for(int i = 1;i <= n;++ i){
		int p = i;
		int t = k;
		int lg = 0;
		while(t){
			if(t&1){
				p = x[p][lg];
			}
			lg++;
			t >>= 1;
		}
		cout << a[p] << " ";
	} 
	
	return 0;
	
}

F

link

哈希,如果单纯是和的话太容易卡了,那么我们用和和平方和,可是还是会被卡,那么我们把1n的数随机映射到unsignedlonglong范围内的数,如1映射为10086223331145,这时就不容易被卡了,那么已经这么大了,再加容易超过unsignedlonglong的范围,那么可以自然溢出,相当于对264取模。

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

#define int unsigned long long

using namespace std;

int n,q;
int a[200005],b[200005];
int w[200005];
int qa[200005],qb[200005];
int pa[200005],pb[200005];

//mt19937 随机生成[0,2^32)的 
//mt19937_64 随机生成[0,2^64)的 
mt19937_64 r(114514); 

signed main(){
	
	cin >> n >> q;
	for(int i = 1;i <= n;++ i)
		w[i] = r();
	for(int i = 1;i <= n;++ i){
		cin >> a[i];
		qa[i] = qa[i-1]+w[a[i]];
		pa[i] = pa[i-1]+w[a[i]]*w[a[i]];
	}
	for(int i = 1;i <= n;++ i){
		cin >> b[i];
		qb[i] = qb[i-1]+w[b[i]];
		pb[i] = pb[i-1]+w[b[i]]*w[b[i]];
	}
	
	while(q--){
		int al,ar,bl,br;
		cin >> al >> ar >> bl >> br;
		if(ar-al == br-bl
		&&qa[ar]-qa[al-1] == qb[br]-qb[bl-1]
		&&pa[ar]-pa[al-1] == pb[br]-pb[bl-1])
			cout << "Yes\n";
		else cout << "No\n";
	}
	
	return 0;
	
}
posted @   不认命,就是哪吒的命!  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示