Codeforces round 690 解题报告

本文档包含多个编程竞赛题目及其解决方案,涉及字符串处理、搜索、数学计算、区间操作等算法。A部分是输出数组的逆序对;B部分判断特定字符串特征;C部分搜索并输出结果;D部分根据合并次数判断数组是否能通过合并操作得到;E1和E2分别解决不同数学问题;F部分利用树状数组处理区间查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A、前后前后输出一下

#include<bits/stdc++.h>
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define debug(x) cout<<#x<<" is "<<x<<endl
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define DBG 0
const int N = 300 + 5;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const ll LLINF = (1LL<<60);
using namespace std;
const int mod = 998244353;
ll fast_pow(ll a,ll b){
	ll ans = 1;
	while(b){
		if(b&1)ans = (ans * a)%mod;
		a = (a * a)%mod;
		b>>=1;
	}
	return (ans%mod);
}
inline int read()
{
	int X=0; bool flag=1; char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') flag=0; ch=getchar();}
	while(ch>='0'&&ch<='9') {X=(X<<1)+(X<<3)+ch-'0'; ch=getchar();}
	if(flag) return X;
	return ~(X-1);
}
inline void write(ll X)
{
	if(X<0) {X=~(X-1); putchar('-');}
	if(X>9) write(X/10);
	putchar(X%10+'0');
}
typedef pair<int,int> pii; 
int a[N];
void solve(){
	int n;
	cin>>n;
	for(int i = 1;i <= n;i++)cin>>a[i];
	int l = 1,r = n;
	while(l<=r){
		if(l == r)
			cout<<a[l]<<" ";
		else
			cout<<a[l]<<" "<<a[r]<<" ";
		l++;
		r--;
	}
	cout<<endl;
} 
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
#if DBG
	freopen("input.txt","r",stdin);
#endif
	int t;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

B、判断一下头部2、20、202、2020尾部020、20、0、2020即可

#include<bits/stdc++.h>
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define debug(x) cout<<#x<<" is "<<x<<endl
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define DBG 0
const int N = 200 + 5;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const ll LLINF = (1LL<<60);
using namespace std;
const int mod = 998244353;
ll fast_pow(ll a,ll b){
	ll ans = 1;
	while(b){
		if(b&1)ans = (ans * a)%mod;
		a = (a * a)%mod;
		b>>=1;
	}
	return (ans%mod);
}
inline int read()
{
	int X=0; bool flag=1; char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') flag=0; ch=getchar();}
	while(ch>='0'&&ch<='9') {X=(X<<1)+(X<<3)+ch-'0'; ch=getchar();}
	if(flag) return X;
	return ~(X-1);
}
inline void write(ll X)
{
	if(X<0) {X=~(X-1); putchar('-');}
	if(X>9) write(X/10);
	putchar(X%10+'0');
}
typedef pair<int,int> pii;
char s[N];
void solve(){
	int n;
	cin>>n;
	
	string s;
	cin>>s;
	bool f = (s.substr(0,2) == "20" && s.substr(n - 2,n) =="20")||s.substr(0,4) =="2020" || s.substr(n - 4,n) =="2020";
	f|= s.substr(0,3) =="202" && s[n-1] == '0';
	f|= s[0] =='2' && s.substr(n-3,n) == "020"; 
	if(f)
		cout<<"YES"<<endl;
	else
		cout<<"NO"<<endl; 	
} 
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
#if DBG
	freopen("input.txt","r",stdin);
#endif
	int t;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

C、搜索一下结果然后输出

#include<bits/stdc++.h>
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define debug(x) cout<<#x<<" is "<<x<<endl
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define DBG 0
const int N = 50 + 5;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const ll LLINF = (1LL<<60);
using namespace std;
const int mod = 998244353;
ll fast_pow(ll a,ll b){
	ll ans = 1;
	while(b){
		if(b&1)ans = (ans * a)%mod;
		a = (a * a)%mod;
		b>>=1;
	}
	return (ans%mod);
}
inline int read()
{
	int X=0; bool flag=1; char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') flag=0; ch=getchar();}
	while(ch>='0'&&ch<='9') {X=(X<<1)+(X<<3)+ch-'0'; ch=getchar();}
	if(flag) return X;
	return ~(X-1);
}
inline void write(ll X)
{
	if(X<0) {X=~(X-1); putchar('-');}
	if(X>9) write(X/10);
	putchar(X%10+'0');
}
typedef pair<int,int> pii;
int x;
ll minn[N];
void solve(){
	cin>>x;
	if(minn[x] != LLINF)
		cout<<minn[x]<<endl;
	else
		cout<<-1<<endl;
}
bool vis[10];
void dfs(int sum,ll number){

	minn[sum] = min(minn[sum],number);
	for(int i = 1;i <= 9;i++){
		if(!vis[i]){
			vis[i] = 1;
			dfs(sum + i,number * 10 + i);
			vis[i] = 0;
		}
	}
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
#if DBG
	freopen("input.txt","r",stdin);
#endif
	int t ;
	cin>>t;
	for(int i = 0;i < N;i++)
		minn[i] = LLINF;
	dfs(0,0);
	while(t--){
		solve();
	}
	return 0;
}

D、从小到大枚举合并次数,当合并次数确定时每个值也确定了 k = sum /(n - i),check一下能否每个值合并成k即可

#include<bits/stdc++.h>
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define debug(x) cout<<#x<<" is "<<x<<endl
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define DBG 0
const int N = 3000 + 5;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const ll LLINF = (1LL<<60);
using namespace std;
const int mod = 998244353;
ll fast_pow(ll a,ll b){
	ll ans = 1;
	while(b){
		if(b&1)ans = (ans * a)%mod;
		a = (a * a)%mod;
		b>>=1;
	}
	return (ans%mod);
}
inline int read()
{
	int X=0; bool flag=1; char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') flag=0; ch=getchar();}
	while(ch>='0'&&ch<='9') {X=(X<<1)+(X<<3)+ch-'0'; ch=getchar();}
	if(flag) return X;
	return ~(X-1);
}
inline void write(ll X)
{
	if(X<0) {X=~(X-1); putchar('-');}
	if(X>9) write(X/10);
	putchar(X%10+'0');
}
typedef pair<int,int> pii;
ll a[N];
int n;
bool check(ll k){
	ll t = 0;
	for(int i =1;i <= n;i++){
		if(t + a[i] < k)t+= a[i];
		else if(t + a[i] == k)t = 0;
		else if(t + a[i] > k)return false;
	} 
	return t== 0;
}
void solve(){
	cin>>n;
	ll sum = 0;
	bool all_same = true;
	for(int i = 1;i <= n;i++){
		cin>>a[i];
		sum += a[i];
		if(i > 1 && a[i] != a[i -1 ])all_same = false;
	}
	if(all_same){
		cout<<0<<endl;
		return;
	}
	
	for(int i =1;i <= n - 1;i++){
		if(sum % (n - i) != 0)continue;
		ll k = sum /(n - i);
		if(check(k)){
			cout<<i<<endl;
			break;
		}		
	}
} 
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
#if DBG
	freopen("input.txt","r",stdin);
#endif
	int t;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

E1、没想到很好的方法(数学8行QAQ),枚举每个数a[i]为中点,枚举前面和后面的个数,后面用树状数组维护

#include<bits/stdc++.h>
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define debug(x) cout<<#x<<" is "<<x<<endl
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define DBG 0
const int N = 2e5 + 5;
typedef  long long ll;
const int INF = 0x3f3f3f3f;
const ll LLINF = (1LL<<60);
using namespace std;
const int mod = 998244353;
ll fast_pow(ll a,ll b){
	ll ans = 1;
	while(b){
		if(b&1)ans = (ans * a)%mod;
		a = (a * a)%mod;
		b>>=1;
	}
	return (ans%mod);
}
inline int read()
{
	int X=0; bool flag=1; char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') flag=0; ch=getchar();}
	while(ch>='0'&&ch<='9') {X=(X<<1)+(X<<3)+ch-'0'; ch=getchar();}
	if(flag) return X;
	return ~(X-1);
}
inline void write(ll X)
{
	if(X<0) {X=~(X-1); putchar('-');}
	if(X>9) write(X/10);
	putchar(X%10+'0');
}
typedef pair<int,int> pii;
ll a[N],cnt[N],n;
struct BIT {
	ll a[N];
	int n;
	void init(int nn) {
		n = nn;
		for(int i = 1; i <= n; i++)a[i] = 0;
	}
	int lowbit(int x) {
		return x&(-x);
	}

	void update(int i,ll x) {
		if(i == 0)return;
		while(i <= n) {
			a[i] += x;
			i += lowbit(i);
		}
	}
	ll query(int i) {
		ll ans = 0;
		while(i > 0) {
			ans += a[i];
			i -= lowbit(i);
		}
		return ans;
	}
}t;
void solve(){
	ll ans = 0;
	cin>>n;
	t.init(n);
	for(int i = 1;i <= n;i++){
		cin>>a[i];
		cnt[i] = 0;
		t.update(a[i],1);
	}
	for(int i = 1;i <= n;i++){
		t.update(a[i],-1);
		for(int j = -2;j <= 2;j++){
			if(a[i] + j <= 0 || a[i] + j > n)continue;
			ll maxk = max(a[i] + j,a[i]);
			ll mink = min(a[i] + j,a[i]);
			ll ans1 = t.query(min(n,mink + 2));
			ll ans2 = t.query(max(0LL,maxk - 3));
			ans += cnt[a[i] + j] * (ans1 - ans2); 
		}
		cnt[a[i]]++;
	}
	cout<<ans<<endl;
} 
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
#if DBG
	freopen("input.txt","r",stdin);
#endif
	int t;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

E2、补题

#include<bits/stdc++.h>
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define debug(x) cout<<#x<<" is "<<x<<endl
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define DBG 0
const int N = 2e5 + 5;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const ll LLINF = (1LL<<60);
using namespace std;
const int mod = 1e9 + 7;
ll fast_pow(ll a,ll b){
	ll ans = 1;
	while(b){
		if(b&1)ans = (ans * a)%mod;
		a = (a * a)%mod;
		b>>=1;
	}
	return (ans%mod);
}
inline int read()
{
	int X=0; bool flag=1; char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') flag=0; ch=getchar();}
	while(ch>='0'&&ch<='9') {X=(X<<1)+(X<<3)+ch-'0'; ch=getchar();}
	if(flag) return X;
	return ~(X-1);
}
inline void write(ll X)
{
	if(X<0) {X=~(X-1); putchar('-');}
	if(X>9) write(X/10);
	putchar(X%10+'0');
}
typedef pair<int,int> pii;
ll fac[N],inv[N],a[N];


void init(){
	fac[0] = 1;
	for(int i = 1;i < N;i++)
		fac[i] =(fac[i - 1] * i)%mod;
	inv[N - 1] = fast_pow(fac[N - 1],mod - 2);
	for(int i = N - 2;i >= 0;i--)
		inv[i] = (inv[i + 1] * (i + 1))%mod;
}
ll c(ll a,ll b){
	if(a < b)return 0LL;
	ll ans = (((fac[a] * inv[b]) % mod) * inv[a - b])%mod;
	return ans;
}

void solve(){
	int n,m,k;
	cin>> n >> m >> k;
	for(int i = 1;i <= n;i++)cin >> a[i];
	sort(a + 1,a + 1 + n);
	ll ans = 0,l = 1;
	for(int r = m;r <= n;r++){
		while(a[r] - a[l] > k)l++;
		if(r - l + 1 < m)continue;
		ans = (ans + c(r - l, m - 1))%mod; 
	}
	cout<<ans<<endl;
} 
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
#if DBG
	freopen("input.txt","r",stdin);
#endif
	int t;
	init();
	cin >> t;
	 while(t--){
	 	solve();
	 }
	return 0;
}

F、先离散化一下,树状数组t1维护左端点,t2维护右端点,枚举每个区间,求右端点小于当前区间左端点个数和左端点大于当前区间右端点个数,最简单的单点更新区间查询,复杂度O(nlogn)

#include<bits/stdc++.h>
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define debug(x) cout<<#x<<" is "<<x<<endl
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define DBG 0
const int N = 2e5 + 5;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const ll LLINF = (1LL<<60);
using namespace std;
const int mod = 998244353;
ll fast_pow(ll a,ll b){
	ll ans = 1;
	while(b){
		if(b&1)ans = (ans * a)%mod;
		a = (a * a)%mod;
		b>>=1;
	}
	return (ans%mod);
}
inline int read()
{
	int X=0; bool flag=1; char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') flag=0; ch=getchar();}
	while(ch>='0'&&ch<='9') {X=(X<<1)+(X<<3)+ch-'0'; ch=getchar();}
	if(flag) return X;
	return ~(X-1);
}
inline void write(ll X)
{
	if(X<0) {X=~(X-1); putchar('-');}
	if(X>9) write(X/10);
	putchar(X%10+'0');
}
typedef pair<int,int> pii;
struct BIT {
	ll a[N<<2];
	int n;
	void init(int nn) {
		n = nn;
		for(int i = 1; i <= n; i++)a[i] = 0;
	}
	int lowbit(int x) {
		return x&(-x);
	}

	void update(int i,ll x) {
		if(i == 0)return;
		while(i <= n) {
			a[i] += x;
			i += lowbit(i);
		}
	}
	ll query(int i) {
		ll ans = 0;
		while(i > 0) {
			ans += a[i];
			i -= lowbit(i);
		}
		return ans;
	}
}t1,t2;
map<int,int> hs;
vector<int> point;
vector<pii> inter;
void init(){
	hs.clear();
	point.clear();
	inter.clear();
}
void solve(){
	init();
	int n;
	cin >> n;
	for(int i = 1;i <= n;i++) {
		int l,r;
		cin >> l >> r;
		if(hs.count(l) == 0)hs[l] = 1,point.pb(l);
		if(hs.count(r) == 0)hs[r] = 1,point.pb(r);
		inter.pb(mp(l,r));
	}
	t1.init(point.size());
	t2.init(point.size());
	sort(point.begin(),point.end());
	for(int i = 0;i < point.size();i++){
		hs[point[i]] = i + 1;
	}
	for(int i = 0;i < inter.size();i++){
		int l = inter[i].fi,r = inter[i].se;
		t1.update(hs[l],1);
		t2.update(hs[r],1);
	}
	ll ans = n - 1;
	for(int i = 0;i < inter.size();i++){
		int l = inter[i].fi,r = inter[i].se;
		ll ans1 = t2.query(hs[l] - 1);
		ll ans2 = t1.query(point.size()) - t1.query(hs[r]);
		ans = min(ans1 + ans2,ans);
	}
		cout<<ans<<endl;
} 
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
#if DBG
	freopen("input.txt","r",stdin);
#endif
	int t;
	cin >> t;
	while(t--)
		solve();
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值