A,有多个线段,求一条最短的线段长度,能过覆盖到所又线段,例如(2,4)和(5,6)
那么我们需要4 5连起来,长度为1,例如(2,10)(3,11),用(3,10)
思路:我们想一下如果题目说的是最长我们肯定是取最小x和最大的y连起来就完事。
但是要求长度最小又得覆盖,那么可以这样想,我们需要把最小的x不断右移到这条线段的y,
最大的左移到x,所以就是最大x-最小y完事
#includeusing 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 >x>>y; mx = max(mx , x); mn = min(mn , y); } cout<
B 没啥好说的,
https://codeforces.com/contest/1262/problem/B
#include#include #include using namespace std; const int maxn = 1e5+10; int n, p[maxn], a[maxn]; set 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个()这种序列,这样()()(),然后后面把所有括号变成((()))这种
#includeusing namespace std; int n,k; string s; void solve_swap(int x,int y){ while(x >n>>k; cin>>s; vector >ans; string final_str = get_str(n,k); for(int i=0;i
D1,D2
https://www.cnblogs.com/hgangang/p/11648398.html更新到了里面