hey_left 15 Codeforces Round 835 (Div. 4)
A.
总和-最小值-最大值即为中间数
#include <bits/stdc++.h>
using namespace std;
#define int long long
void solve(){
int a,b,c;cin>>a>>b>>c;
cout<<a+b+c-min({a,b,c})-max({a,b,c})<<'\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int hey_left=1;
cin>>hey_left;
while(hey_left--){
solve();
}
}
B.
遍历,记录最大字符
#include <bits/stdc++.h>
using namespace std;
#define int long long
void solve(){
int n;cin>>n;
string s;cin>>s;
int ans=0;
for(int i=0;i<s.size();i++){
if(s[i]-'a'>ans){
ans=s[i]-'a';
}
}
cout<<ans+1<<'\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int hey_left=1;
cin>>hey_left;
while(hey_left--){
solve();
}
}
C.
若最大值不止一个,那么每个数与最大值的差就是答案
若最大值只有一个,那么还要一个次大值,最大值的答案是最大值与次大值的差
#include <bits/stdc++.h>
using namespace std;
#define int long long
void solve(){
int n;cin>>n;
vector<int>s(n+1);
int ma=-1,cnt=0,maa=-1;
for(int i=1;i<=n;i++){
cin>>s[i];
if(s[i]>ma){
maa=ma;
ma=s[i];
cnt=1;
}else if(s[i]==ma){
cnt++;
}else if(s[i]>maa)maa=s[i];
}
for(int i=1;i<=n;i++){
if(s[i]==ma){
if(cnt>1){
cout<<0<<' ';
}else cout<<s[i]-maa<<' ';
}else cout<<s[i]-ma<<' ';
}
cout<<'\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int hey_left=1;
cin>>hey_left;
while(hey_left--){
solve();
}
}
D.
可以把边界设为无穷大
若出现一个数比前一个数小,再出现一个数比前一个数大,则山谷+1
若山谷大于1,则是NO
#include <bits/stdc++.h>
using namespace std;
#define int long long
void solve(){
int n;cin>>n;
vector<int>a(n+5);
for(int i=1;i<=n;i++)cin>>a[i];
a[n+1]=0x3f3f3f3f;
int cnt=0;
bool f=0;
for(int i=2;i<=n+1;i++){
if(a[i]>a[i-1]){
if(f==0){
cnt++;
f=1;
}
}else if(a[i]==a[i-1]){
continue;
}
else f=0;
}
if(cnt==1){
cout<<"YES"<<'\n';
}else cout<<"NO"<<'\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int hey_left=1;
cin>>hey_left;
while(hey_left--){
solve();
}
}
E.
要让反转数多,就是尽量1都在前面,0都在后面
那么我们把第一个0变成1或把最后一个1变成0,或者不变
3种情况分别讨论,取最大反转数
#include <bits/stdc++.h>
using namespace std;
#define int long long
void solve(){
int n;cin>>n;
vector<int>a(n+1),b(n+1),c(n+1);
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=a[i];
c[i]=b[i];
}
for(int i=1;i<=n;i++){
if(a[i]==0){
a[i]=1;
break;
}
}
int sum1=0,cnt_1=0;
for(int i=1;i<=n;i++){
if(a[i]==1)cnt_1++;
else sum1+=cnt_1;
}
for(int i=n;i>=1;i--){
if(b[i]==1){
b[i]=0;
break;
}
}
cnt_1=0;
int sum2=0;
for(int i=1;i<=n;i++){
if(b[i]==1)cnt_1++;
else sum2+=cnt_1;
}
int sum3=0;
cnt_1=0;
for(int i=1;i<=n;i++){
if(c[i]==1)cnt_1++;
else sum3+=cnt_1;
}
cout<<max({sum2,sum1,sum3})<<'\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int hey_left=1;
cin>>hey_left;
while(hey_left--){
solve();
}
}
F.
d天都用最大值都不够,就是不可能
min(d,n)的所有值加起来,也就是无需重复使用,那么是无穷大
其余情况二分天数
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+10;
bool cmp(int x,int y){
return x>y;
}
void solve(){
int n,c,d;cin>>n>>c>>d;
vector<int>a(n+1);
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a.begin()+1,a.end(),cmp);
if(a[1]*d<c){
cout<<"Impossible"<<'\n';
return ;
}
int sum=0;
vector<int>pre(n+1);
for(int i=1;i<=min(n,d);i++){
sum+=a[i];
pre[i]=pre[i-1]+a[i];
}
if(sum>=c){
cout<<"Infinity"<<'\n';
return ;
}
int l=0,r=N,mid;
int ma=-1;
while(l<=r){
mid=(l+r)/2;
int x=d%(mid+1);
if(pre[min(n,x)]+d/(mid+1)*pre[min(n,mid+1)]>=c){
l=mid+1;
ma=max(ma,mid);
}
else r=mid-1;
}
cout<<ma<<'\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int hey_left=1;
cin>>hey_left;
while(hey_left--){
solve();
}
}
G.
分别以a,b为起点搜一遍,记录出现的异或结果
若有的值出现了2次及以上,则可以
注意a搜到b的时候要跳过
注意特判,初始mp[0]=1
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
map<int,int>mp;
vector<pair<int,int>>g[N];
int n,a,b;
void dfs1(int u,int fa,int res){
for(int i=0;i<g[u].size();i++){
int y=g[u][i].first;
if(y==fa)continue;
if(y==b)continue;
mp[res^g[u][i].second]++;
dfs1(y,u,res^g[u][i].second);
}
}
bool f=0;
void dfs2(int u,int fa,int res){
for(int i=0;i<g[u].size();i++){
int y=g[u][i].first;
if(y==fa)continue;
if(mp[res^g[u][i].second]){
f=1;return ;
}
dfs2(y,u,res^g[u][i].second);
}
}
void solve(){
mp.clear();
mp[0]++;
cin>>n>>a>>b;
for(int i=1,u,v,w;i<n;i++){
cin>>u>>v>>w;
g[u].push_back({v,w});
g[v].push_back({u,w});
}
f=0;
dfs1(a,0,0);
dfs2(b,0,0);
if(f){
cout<<"YES"<<'\n';
}else cout<<"NO"<<'\n';
for(int i=1;i<=n;i++)g[i].clear();
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int hey_left=1;
cin>>hey_left;
while(hey_left--){
solve();
}
}