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更新到了里面
标签:线段,based,602,int,ll,序列,using,include,Round 来源: https://www.cnblogs.com/hgangang/p/11965301.html