Codeforces Round #602 (Div. 2, based on Technocup 2020 Elimination Round 3

A,有多个线段,求一条最短的线段长度,能过覆盖到所又线段,例如(2,4)和(5,6)

那么我们需要4 5连起来,长度为1,例如(2,10)(3,11),用(3,10)

思路:我们想一下如果题目说的是最长我们肯定是取最小x和最大的y连起来就完事。

但是要求长度最小又得覆盖,那么可以这样想,我们需要把最小的x不断右移到这条线段的y,

最大的左移到x,所以就是最大x-最小y完事

#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll n,m,x,y,z,b,c=0,a=0,k;
ll arr[1000006];
int main()
{
    ios_base::sync_with_stdio(0);
    cin>>m;
    while(m--){
       cin>>n;
       ll mx = -1e9 , mn=1e9;
       for(int i=0 ; i<n;i++){
        cin>>x>>y;
        mx = max(mx , x);
        mn = min(mn , y);
       }
       cout<<max(mx -mn , (ll) 0)<<endl;
    }
    return 0;
}

B 没啥好说的,

https://codeforces.com/contest/1262/problem/B

#include <cstdio>
#include <algorithm>
#include <set>
using namespace std;
 
const int maxn = 1e5+10;
 
int n, p[maxn], a[maxn];
set<int> s;
 
void solve() {
	scanf("%d", &n);
	for (int i = 1; i <= n; ++i) {
		scanf("%d", a+i);
		s.insert(i);
	}
	for (int i = 1; i <= n; ++i) {
		if (a[i] != a[i-1]) {
			p[i] = a[i];
			s.erase(a[i]);
		} else {
			if (*s.begin() > a[i]) {
				puts("-1");
				return;
			}
			p[i] = *s.begin();
			s.erase(s.begin());
		}
	}
	for (int i = 1; i <= n; ++i)
		printf("%d%c", p[i], " \n"[i==n]);
}
 
int main() {
	int t;
	scanf("%d", &t);
	while (t--) solve();
}

 C,

给你一个括号序列,你有一个操作,选定l,r,就可以反转他们,例如 1 2 3 4变成 4 3 2 1 

最多n次操作,那就说明我们一定能构造成我们想要的序列

题目要求你把这个序列变成合法括号序列,同时!恰好有k个前缀是合法的。

很容易想到先构造k-1个()这种序列,这样()()(),然后后面把所有括号变成((()))这种

#include<bits/stdc++.h>
using namespace std;
int n,k;
string s;
void solve_swap(int x,int y){
    while(x<y){
        swap(s[x],s[y]);
        x++,y--;
    }
}
string get_str(int n,int k){
    string tmp="";
    for(int i=0;i<k-1;i++){
        tmp+="(";
        tmp+=")";
    }
    int len = n-tmp.size();
    for(int i=0;i<len/2;i++){
        tmp+="(";
    }
    for(int i=0;i<len/2;i++){
        tmp+=")";
    }
    return tmp;
}
void solve(){
    cin>>n>>k;
    cin>>s;
    vector<pair<int,int>>ans;
    string final_str = get_str(n,k);
    for(int i=0;i<s.size();i++){
        if(s[i]!=final_str[i]){
            for(int j=i+1;j<s.size();j++){
                if(s[j]==final_str[i]){
                    solve_swap(i,j);
                    ans.push_back(make_pair(i+1,j+1));
                    break;
                }
            }
        }
    }
    //cout<<s<<endl;
    cout<<ans.size()<<endl;
    for(int i=0;i<ans.size();i++){
        cout<<ans[i].first<<" "<<ans[i].second<<endl;
    }
}
int main(){
    int t;
    scanf("%d",&t);
    while(t--)solve();
}

  D1,D2

https://www.cnblogs.com/hgangang/p/11648398.html更新到了里面

 

猜你喜欢

转载自www.cnblogs.com/hgangang/p/11965301.html