Codeforces Round 753 (Div. 3)(集训队加训2)

C++编程问题:模拟、周期计算、线段树应用与贪心算法实例
文章介绍了C++编程中的四个主题:字符串模拟求解、基于模运算的周期性问题、线段树的数据结构用于单点修改和区间查询,以及贪心策略在特定问题中的应用。

A.

模拟

#include<bits/stdc++.h>
#define eps 1e-5
#define INF 1e9
using namespace std;
typedef long long ll;
const int N = 2e6 + 9;
int a[N],cl[N];
void Lan(){
	string s1,s2;
	cin>>s1>>s2;
	s1=" "+s1;
	s2=" "+s2;
	for(int i=1;i<s1.size();i++){
		cl[s1[i]-'a']=i;
	}
	ll ans=0;
	for(int i=2;i<s2.size();i++){
		ans+=abs(cl[s2[i]-'a']-cl[s2[i-1]-'a']);
	}
	cout<<ans<<'\n';
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	int q;
	cin>>q;
	while (q--) {
		Lan();
	}
	return 0;
}

B.

周期

#include<bits/stdc++.h>
#define eps 1e-5
#define INF 1e9
using namespace std;
typedef long long ll;
const int N = 2e6 + 9;
int a[N];
void Lan(){
	ll x,n;
	cin>>x>>n;
	// t=4
	if(x&1){
		/*
		x,x+1,x-2,x-3,x+4,
		*/
		if(n%4==1){//n-1,n
			cout<<x+n<<'\n';
		}else if(n%4==2){//n-2,n-1,n
			cout<<x-1<<'\n';
		}else if(n%4==3){//n-3,n-2,n-1,n 
			cout<<x-(n+1)<<'\n';
		}else{
			cout<<x<<'\n';
		}
	}else{
		/*
		x,x-1,x+2,x+3,x-4;
		*/
		if(n%4==1){//n-1,n
			cout<<x-n<<'\n';
		}else if(n%4==2){//n-2.n-1,n
			cout<<x+1<<'\n';
		}else if(n%4==3){//n-3,n-2,n-1,n   
			cout<<x+(n+1)<<'\n';
		}else{
			cout<<x<<'\n';
		}
	}
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	int q;
	cin>>q;
	while (q--) {
		Lan();
	}
	return 0;
}

C.

线段树

单点修改,区间查询

#include<iostream>
#define INF 4e18;
using namespace std;
typedef long long ll;
const int N = 2e5+ 9;
ll a[N];
//线段树
struct node{
    ll mn;
}seg[N<<2];
inline ll tl(ll x){return x<<1;}
inline ll tr(ll x){return x<<1|1;}
void pushup(const int id){
    seg[id].mn=min(seg[tl(id)].mn,seg[tr(id)].mn);
}
void build(const int id,int l,int r){
    if(l==r){
        seg[id].mn=a[l];
        return;
    }
    int mid=(l+r)>>1;
    build(tl(id),l,mid);
    build(tr(id),mid+1,r);
    pushup(id);
}
bool inrange(int L,int R,int l,int r){return l<=L && R<=r;}
bool outofrange(int L,int R,int l,int r){return L>r || R<l;}
ll query(int id,int L,int R,int l,int r){
    if(inrange(L,R,l,r)){
        return seg[id].mn;
    }else if(!outofrange(L,R,l,r)){
        int mid=(L+R)>>1;
        return min(query(tl(id),L,mid,l,r),query(tr(id),mid+1,R,l,r));
    }else{
        return 100000000000000;//不会影响结果
    }
}
void update(int id,int l,int r,ll v){
    if(l==r){
        seg[id].mn=v;
    }else{
        int mid=(l+r)>>1;
        if(seg[tl(id)].mn>seg[tr(id)].mn){//找到最小覆盖
            update(tr(id),mid+1,r,v);
        }else{
            update(tl(id),l,mid,v);
        }
        pushup(id);
    }
}
void solve(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    build(1,1,n);
    ll ans=seg[1].mn;
    ll cur=0;
    for(int i=1;i<=n-1;i++){
        ans=max(ans,seg[1].mn-cur);//操作
        cur=seg[1].mn;
        update(1,1,n,100000000000000);//单点修改
    }
    cout<<max(ans,seg[1].mn-cur)<<'\n';
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int q;
    cin>>q;
    while(q--){
        solve();
    }
    return 0;
}

D.

贪心

#include<bits/stdc++.h>
#define INF 1e9
using namespace std;
typedef long long ll;
const int N=2e5+9;
struct node{
    int val;
    char flag;
}a[N];
inline void lan(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i].val;
    }
    for(int i=1;i<=n;i++){
        cin>>a[i].flag;
    }
    sort(a+1,a+1+n,[](const node a,const node b){
        if(a.flag==b.flag){
            return a.val<b.val;
        }
        return a.flag<b.flag;
    });
    for(int i=1;i<=n;i++){
        if(a[i].val!=i){
            if(a[i].flag=='B' && a[i].val<i){
                cout<<"NO"<<'\n';
                return;
            }else if(a[i].flag=='R' && a[i].val>i){
                cout<<"NO"<<'\n';
                return;
            }
        }
    }
    cout<<"YES"<<'\n';
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int q;
    cin>>q;
    while(q--){
        lan();
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值