Codeforces Round #602 (Div. 2,题目难度顺序很怪)A区间的交并 B构造 C 构造&排序的启发 D。。待补

vp总结(表现分数:1450)

(表现分数x:即cf_rating大于x,开始下分,小于x上分)
d,e比c简单。写c写着写着,睡着了,你敢信
其实可以先开d和e的。

A. Math Problem

题意:

给你n个区间,现要求你找到一个区间,使他与所有区间都有交集。
输出
这个区间的长度

思路:

a n s l = m i n ( r 1 , r 2 , r 3 . . . ) ans_l=min(r_1,r_2,r_3...) ansl=min(r1,r2,r3...)
a n s r = m a x ( l 1 , l 2 , l 3 . . . ) ans_r=max(l_1,l_2,l_3...) ansr=max(l1,l2,l3...)
如果 a n s r − a n s l ans_r-ans_l ansransl>0,输出 a n s r − a n s l ans_r-ans_l ansransl即可。
反之输出0.说明有交集。

AC

#include <iostream>
using namespace std;
int main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int T;cin>>T;
    while(T--){//for(int i)
        int n;cin>>n;
        int ans_l=1e9+7,ans_r=0;
        int l,r;
        for(int i=1; i<=n; i++){
            cin>>l>>r;
            ans_l=min(ans_l,r);
            ans_r=max(ans_r,l);
        }
        if(ans_l>=ans_r)cout<<0<<endl;
        else cout<<ans_r-ans_l<<endl;
    }
    return 0;
}

B. Box(暴力构造)

题意:

给你一个前缀最大值,
要求你构造一个数组,满足前缀最大值。

思路:

  1. 能处理先处理
    可以知道,假如 p r e [ i ] pre[i] pre[i]没被使用过,那么 a n s [ i ] = p r e [ i ] ans[i]=pre[i] ans[i]=pre[i].
    其他位置先空着。
  2. 查漏补缺。
    假如当前位置,没有元素,那么就找一个值放进去。可以从1开始检索值。(为了减少时间复杂度,可以从cnt开始,cnt前的数肯定被使用过。如果cnt>pre[i],那么就输出-1)

AC

#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn=1e5+10;
int vis[maxn],mx[maxn];
int main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    //cout << "Hello world!" << endl;
    int T;cin>>T;
    while(T--){
        int n;cin>>n;
        vector<int>ans(n+1,-1);
        for(int i=1; i<=n; i++)vis[i]=0;
        int flag=1;
        for(int i=1; i<=n; i++){
            cin>>mx[i];
            if(vis[mx[i]])continue;
            vis[mx[i]]=1;
            ans[i]=mx[i];
        }
        int cnt=1;
        for(int i=1; i<=n&&flag; i++){
            if(ans[i]!=-1)continue;
            while(vis[cnt])cnt++;
            if(cnt<=mx[i])ans[i]=cnt++;
            else flag=0;
        }
        if(!flag)cout<<-1;
        else for(int i=1; i<=n; i++)cout<<ans[i]<<' ';//for(auto x:ans)cout<<x<<' ';
        cout<<endl;
    }
    return 0;
}

C. Messy(排序思想&&构造)

题意;

给你一个括号表达式,要求你对substirng进行reverse。使得括号表达式,满足算术表达式,且有k个前缀合法。

思路:

  1. 一开始肯定就是构造一个ans。
  2. 之后根据这个ans去reverse(reverse过程的思路和暴力排序的思想差不多),因为题目说不要求操作最小,所以可以暴力。

AC

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#define mp make_pair
using namespace std;
typedef pair<int,int>pa;
int main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int tt;cin>>tt;
    while(tt--){
        int n,k;cin>>n>>k;
        string s;cin>>s;
        string t;
        for(int i=0; i<k; i++)t+="()";//ans.push_back("()");
        while(t.size()<n)t=t.substr(0,t.size()-1)+"())";
        vector<pa>ans;
        for(int i=0; i<n; i++){
            int ok=0;
            for(int j=i; j<n&&!ok; j++){
                if(s[j]==t[i]){
                   reverse(s.begin()+i,s.begin()+j+1);
                   ans.push_back(mp(i+1,j+1));//cout<<i+1<<' '<<j+1<<endl;
                    ok=1;
                }
            }
        }
        cout<<ans.size()<<endl;
        for(auto x:ans)cout<<x.first<<' '<<x.second<<endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值