随笔 - 72,  文章 - 2,  评论 - 0,  阅读 - 1258

A. Technical Support

题意:简单的栈

思路:stack

代码:

#include<bits/stdc++.h>
using namespace std;
int const N=1e4+5;
#define int long long
int fa[500005];
int d[500005];
int you[200005];
void solve(){
    string s;
    int n;
    cin>>n;
    cin>>s;
    stack<char>st;
    for (int i = 0; i <n ; ++i) {
        if(s[i]=='Q')st.push('Q');
        else{
            if(st.size()){
                st.pop();
            }
        }
    }
    if(st.size()==0){
        cout<<"Yes\n";
    }
    else{
        cout<<"No\n";
    }

}
signed main(){
    ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
    int t;
    cin>>t;
    while(t--){
        solve();
    }

}

B. Kevin and Permutation

题意:给一个n的序列,构造一个相邻两数之差的最小值最大的序列

思路:比如是8,我们可以构建成4 8 3 7 2 6 1 5,即最大为4,如果有奇数,在开头加一个n

代码:

#include<bits/stdc++.h>
using namespace std;
int const N=1e4+5;
#define int long long
int fa[500005];
int d[500005];
int you[200005];
void solve(){
    int n;
    cin>>n;
    if(n%2){
        cout<<n<<' ';
        n--;
    }
    for (int i = n/2,cnt=0; i >=1 ; --i) {
        cout<<i<<' '<<n-cnt<<' ';
        cnt++;
    }

    cout<<endl;

}
signed main(){
     ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
    int t;
    cin>>t;
    while(t--){
        solve();
    }

}

C1. Make Nonzero Sum (easy version)

题意:给一个为1和-1数组,有一种操作,可以使区间[l,r]上的奇数位置的数字变为相反数,问你把数组分为几个区间可以使他们的和为0,如果不行,输出-1

思路:当个数为奇数时不可以,偶数都可以,当相邻的两项为相反数时,我们把他们放到单位为1的区间,自身就是一个区间,如果相等,则放到长度为2的区间

代码:

#include<bits/stdc++.h>
using namespace std;
int const N=1e4+5;
#define int long long
int fa[500005];
int d[500005];
int you[200005];
void solve(){
    int n;
    cin>>n;
    vector<int>q(n+1);
    if(n&1){
        for (int i = 0; i <n ; ++i) {
            int x;
            cin>>x;
        }
        cout<<"-1\n";
    }
    else{
        vector<pair<int,int>>ans;
        for (int i = 1; i <=n ; i+=2) {
            int x,y;
            cin>>x>>y;
            if(x==y){
                ans.push_back({i,i+1});
            }
            else{
                ans.push_back({i,i});
                ans.push_back({i+1,i+1});
            }
        }
        cout<<ans.size()<<endl;
        for (auto i:ans) {
            cout<<i.first<<' '<<i.second<<endl;
        }
    }

}
signed main(){
    ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
    int t;
    cin>>t;
    while(t--){
        solve();
    }

}

C2. Make Nonzero Sum (hard version)

题意:上面题的hard版本,数组不止有1,-1,还会有0;

思路:把0去掉然后记录-1,1的下标,如果是奇数个,那就不行,如果是偶数个,我们可以延续上题的思路,只不过,如果这个区间是10001,那么我们分为100 和01,后一个区间的1前面有一个0,如果是1000,-1,那么就可以分为独立的5个区间,然后我们标记一下1相邻的1和-1之间的0,其他0分为独立区间,然后排序,输出

代码:

#include<bits/stdc++.h>
using namespace std;
int const N=1e4+5;
#define int long long
int fa[500005];
int d[500005];
int you[200005];
void solve(){
    int n;
    cin>>n;
    vector<pair<int,int>>q;
    vector<pair<int,int>>ans;
    for (int i = 1; i <=n ; ++i) {
        int x;
        cin>>x;
        if(x%2!=0){
            q.push_back({x,i});
        }
    }
//    if(q.size()==0){
//        cout<<"1\n";
//        cout<<"1 "<<n<<endl;
//        return;
//    }
    if(q.size()&1){
        cout<<"-1\n";
        return;
    }

    else{

        for (int i = 0; i <q.size() ; i+=2) {
            if(q[i].first==q[i+1].first){
                if(q[i].second+1==q[i+1].second){
                    ans.push_back({q[i].second,q[i+1].second});
                }
                else{
                    ans.push_back({q[i].second,q[i+1].second-2});
                    ans.push_back({q[i+1].second-1,q[i+1].second});
                }

            }
            else{
                ans.push_back({q[i].second,q[i].second});
                ans.push_back({q[i+1].second,q[i+1].second});
            }
        }

        vector<int>vis(n+1);
        for (auto i:ans) {
            for (int j = i.first; j <=i.second ; ++j) {
                vis[j]=1;
            }
        }
        for (int i = 1; i <=n ; ++i) {
            if(!vis[i]){
                ans.push_back({i,i});
            }
        }
        sort(ans.begin(),ans.end());
        cout<<ans.size()<<endl;
        for (auto i:ans) {
            cout<<i.first<<' '<<i.second<<endl;
        }
    }

}
signed main(){
    ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
    int t;
    cin>>t;
    while(t--){
        solve();
    }

}
posted on   IR101  阅读(4)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示