Codeforces Round 1039 (Div. 2)(A-E1)
题目链接:Dashboard - Codeforces Round 1039 (Div. 2) - Codeforces
A. Recycling Center
思路
贪心,我们要花费金币最少即使a[i]>c的个数最少,我们可以从大的开始找,如果从小的开始的话,本来有个数x<=c,结果将其*2之后>c了,所以我们应该从大往小找
代码
void solve(){int n,c;cin>>n>>c;vi a(n+1);for(int i=1;i<=n;i++){cin>>a[i];}sort(a.begin()+1,a.begin()+1+n,greater<int>());int t=1;int cnt=0;for(int i=1;i<=n;i++){if(a[i]*t<=c){t*=2;}else{cnt++;}}cout<<cnt<<"\n";
}
B. Deque Process
思路
构造,我们不妨构造成且
或者
且
代码
void solve(){int n;cin>>n;vi p(n+1);for(int i=1;i<=n;i++){cin>>p[i];}int l=1,r=n;int f=0;vector<char> ans;while(l<=r){if(l==r){ans.push_back('L');break;}if(f){if(p[l]>=p[r]){ans.push_back('L');ans.push_back('R');}else{ans.push_back('R');ans.push_back('L');}}else{if(p[l]>=p[r]){ans.push_back('R');ans.push_back('L');}else{ans.push_back('L');ans.push_back('R');}}f=(f+1)%2;l++;r--;}for(auto x:ans){cout<<x;}cout<<"\n";
}
C. Leftmost Below
思路
自己手搓几个样例就能很容易发现,就拿样例3来说,40 60 90
刚开始是0 0 0 贪心地将其变成 40 30 0 -> 40 60 0 -> 40 60 40 到现在我们下一步要将a_3加50,但是50>=40所以我们一定会加到第一个40上面去
最后我们发现,只要b[i]-前面的最小值>=前面的最小值,这样是可以的,否则不行
代码
void solve(){int n;cin>>n;vi b(n+1);vi mn(n+1,inf);for(int i=1;i<=n;i++){cin>>b[i];mn[i]=min(mn[i-1],b[i]);}for(int i=1;i<=n;i++){if(b[i]-mn[i-1]<mn[i-1]){continue;}else{cout<<"NO\n";return;}}cout<<"YES\n";
}
D. Sum of LDS
思路
如果排列是递减的,那么它的子数组的最长递减子序列的长度和为
那么现在考虑当前的排列如果出现p[i]<p[i+1]那么他对其的贡献便是-(i+1)*(n-1-i)
最后统计一下答案即可
代码
void solve(){int n;cin >> n;vector<int> p(n);for (int i = 0; i < n; ++i) {cin >> p[i];}int A = n * (n + 1) * (n + 2) / 6;int B = 0;for (int i = 0; i < n - 1; ++i) {if (p[i] < p[i + 1]) {B += (i + 1) * (n - 1 - i);}}cout << A - B << '\n';
}
E1. Submedians (Easy Version)
思路
判断一个数x是否为数组a的中值,可以将用big数组表示 if a[i]>=x big[i]=1 else big[i]=-1
同理small数组表示 if a[i]<=x small[i]=1 else small[i]=-1
x是此数组的中值要满足且
对于此题来说我们要找到中值的最大值,我们可以将small数组给忽略掉,这样我们就能够进行二分查找,对于x来说如果此区间内那么一定存在比x大的中值
- 用前缀和优化
- i从k开始保证最小长度为k
- 用mn维护前缀最小,贪心
代码
#include<bits/stdc++.h>
using namespace std;#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#define int long long
#define vi vector<int>
#define vb vector<bool>
typedef pair<int,int> pll;const int N=2e5+10;
const int inf=1e18;
const int mod=998244353;void solve(){int n,k;cin>>n>>k;vi a(n+1);for(int i=1;i<=n;i++){cin>>a[i];}int ans=-1,ansl=-1,ansr=-1;auto check=[&](int x)->bool{vector<int> pre(n+1);for(int i=1;i<=n;i++){pre[i]=pre[i-1]+(a[i]>=x?1:-1);}int mn=inf,l=-1;for(int i=k;i<=n;i++){if(mn>pre[i-k]){mn=pre[i-k];l=i-k+1;}if(pre[i]-mn>=0){ans=x;ansl=l;ansr=i;return true;}}return false;};int l=1,r=n;while(l<=r){int mid=l+r>>1;if(check(mid)){l=mid+1;}else{r=mid-1;}}cout<<ans<<" "<<ansl<<" "<<ansr<<"\n";
}
signed main() {vcoistntcout<<fixed<<setprecision(2);int _=1;cin>>_;while(_--) solve();return 0;
}