#include<bits/stdc++.h>using i64 =longlong;using PII = std::pair<int,int>;#defineinti64#defineyesstd::cout <<"YES\n";#definenostd::cout <<"NO\n";voidsolve(){int n;
std::cin >> n;
std::vector<int>a(n);for(int i =0; i < n; i ++){
std::cin >> a[i];}if(is_sorted(a.begin(), a.end())and a[0]%2==0){
std::cout <<"-1\n";return;}if(a[0]&1){
std::cout <<"0\n";return;}for(int i =1; i < n; i ++){if(a[i]&1and a[0]> a[i]){
std::cout <<"1\n";return;}}
std::cout <<"-1\n";}signedmain(){
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);int T;
std::cin >> T;while(T --){solve();}return0;}
B再交换
A < B,A中比B大的那一位交换
A > B,B中最小的交换与A中最大的
具体看代码
#include<bits/stdc++.h>using i64 =longlong;using PII = std::pair<int,int>;#defineinti64#defineyesstd::cout <<"YES\n";#definenostd::cout <<"NO\n";voidsolve(){int n;
std::cin >> n;
std::string a, b;
std::cin >> a >> b;if(a < b){int idx =max_element(a.begin(), a.end())- a.begin();char s =*max_element(a.begin(), a.end());if(s > a[0]){
std::cout << idx +1<<" "<<1<<"\n";}else{for(int i =0; i < n; i ++){if(a[i]>= b[i]or(a[i]< b[i]and i)){
std::cout << i +1<<" "<< i +1<<"\n";break;}}}}else{int idx =min_element(b.begin(), b.end())- b.begin();char s =*min_element(b.begin(), b.end());for(int i =0; i < n; i ++){if((a[i]> b[i])or(a[i]== b[i]and b[i]> s)or(a[i]> b[i]and i == idx +1)){
std::cout << i +1<<" "<< idx +1<<"\n";return;}}}}signedmain(){
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);int T;
std::cin >> T;while(T --){solve();}return0;}
C 空洞骑士
答案在
0 1
0 1e9
1e9 - 1 1e9
中取
逐步判断即可
#include<bits/stdc++.h>using i64 =longlong;using PII = std::pair<int,int>;#defineinti64#defineyesstd::cout <<"YES\n";#definenostd::cout <<"NO\n";signedmain(){
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);int n;
std::cin >> n;
std::set<int> s;int x =2e9+10,y =-1;for(int i =0; i < n; i ++){int k;
std::cin >> k;
x = std::min(x,k);
y = std::max(y,k);}if(x == y){
std::cout <<0<<" "<<1000000000<<"\n";}else{int w = y *2-1;int a =0,b =1;if((1000000000- x)*2-1> w){
w =(1000000000- x)*2-1;
a =999999999;
b =1000000000;}if(w <1000000000){
a =0;
b =1000000000;}
std::cout << a <<" "<< b <<"\n";}return0;}
D 障碍
#include<bits/stdc++.h>using i64 =longlong;using PII = std::pair<int,int>;#defineinti64#defineyesstd::cout <<"YES\n";#definenostd::cout <<"NO\n";signedmain(){
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);int n, m;
std::cin >> n >> m;int C =sqrt(n)+1;
std::vector<int>a(m +1);for(int i =1; i <= m; i ++){
std::cin >> a[i];}
m ++;
a.push_back(n);
std::sort(a.begin()+1, a.end());
std::vector<int>sum(C +1);int ans =0;for(int i =0; i <= C; i ++){for(int j = i +1; j <= m; j ++){
sum[i]= std::max(sum[i], a[j]- a[j - i -1]);}
ans = std::max(ans, sum[i]- i * i);}
std::cout << ans <<"\n";return0;}
E 生成树与路径
一种简单的构造,1 -> n 以链式连接,然后依次添加其他边
#include<bits/stdc++.h>using i64 =longlong;using PII = std::pair<int,int>;#defineinti64#defineyesstd::cout <<"YES\n";#definenostd::cout <<"NO\n";voidsolve(){int n, m;
std::cin >> n >> m;int v =0;
std::vector<std::tuple<int,int,int>> res;for(int i =1; i < n; i ++){
res.push_back({i,i +1,++v});}for(int len =2; len <= n; len ++){if(v == m)break;for(int i =1; i <= n; i ++){int j = i + len;if(j > n)break;
res.push_back({i,j,++v});if(v == m)break;}}for(auto[u,v,w]: res)
std::cout<< u <<' '<< v <<' '<< w <<"\n";}signedmain(){
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);int t;
std::cin >> t;while(t --){solve();}return0;}
F 球球大作战
二分
#include<bits/stdc++.h>using i64 =longlong;using PII = std::pair<int,int>;#defineinti64#defineyesstd::cout <<"YES\n";#definenostd::cout <<"NO\n";signedmain(){
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);int n;
std::cin >> n;
std::vector<std::pair<int,int>>a(n +1);for(int i =1; i <= n; i ++){int x;
std::cin >> x;
a[i]={x,i};}
std::sort(a.begin()+1, a.end());int l =1,r = n,s = n;auto check =[&](int x){int o = a[n].first;for(int i = n -1; i > x; i --){
o =(o + a[i].first)/2;}for(int i = x -1; i >0; i --){
o =(o + a[i].first)/2;}if(o <= a[x].first)returntrue;returnfalse;};while(l < r){int mid = l + r >>1;if(check(mid)) r = mid;else l = mid +1;}
std::vector<int>ans(n +10);for(int i = r; i <=n; i ++) ans[a[i].second]=1;for(int i =1; i <= n; i ++){
std::cout << ans[i];}
std::cout <<"\n";return0;}