A-自动收小麦机_2023河南萌新联赛第(二)场:河南工业大学 (nowcoder.com)(思路要清晰--NO)
#include<iostream>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=100005;
long long sum[N],dp[N];
int a[N],b[N];
int main(){
int n,q,k;
cin>>n>>q>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
sum[i]=sum[i-1]+a[i];
}
for(int i=1;i<=n;i++){
cin>>b[i];
}
int p=0,f=0;
for(int i=1;i<=n;i++){
if(p==k-1&&b[i]==b[i-1]){
dp[i]=sum[i]-sum[max(i-k,f-1)];
p=k;
}
else if(b[i]!=b[i-1]){
if(i-f>=k){
dp[i]=a[i]+sum[i-1]-sum[i-k-1];
}
else{
dp[i]=dp[i-1]+a[i];
}
f=i;
p=1;
}
else {
dp[i]=dp[i-1]+a[i];
p++;
}
}
for(int i=0;i<q;i++){
int r;
cin>>r;
cout<<dp[r]<<endl;
}
}
B-异星突击_2023河南萌新联赛第(二)场:河南工业大学 (nowcoder.com) (正确做法字典树--未学)
//C++(clang++ 11.0.1)比C++(g++ 7.5.0)快
//for(auto it:ma)比for(auto [a,b]:ma)慢
#include<iostream>
#include<string>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#include<cstdio>
#include <bits/stdc++.h>
using namespace std;
unordered_map<int, int> ma;
int main(){
int n,hp;
scanf("%d",&n);
scanf("%d",&hp);
for(int i=0;i<n;i++){
int q,x;
scanf("%d%d",&q,&x);
if(q==0){
ma[x]++;
}
else if(q==1){
if(ma[x]--==1){
ma.erase(x);
}
}
else {
int h;
scanf("%d",&h);
int sum=0;
for(auto [aa,bb]:ma){
if((aa^x)>h){
sum+=bb;
}
}
if(!sum){
hp--;
}
printf("%d\n",sum);
}
}
printf("%d\n",hp);
}
D-固执的RT_2023河南萌新联赛第(二)场:河南工业大学 (nowcoder.com)(签到)
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main(){
int n,m;
cin>>n>>m;
long long ans=0;
for(int i=0;i<n;i++){
int q;
cin>>q;
ans+=q;
}
if(ans<m){
cout<<"NO"<<endl;
}
else {
cout<<"YES"<<endl;
}
}
E-释怀的RT_2023河南萌新联赛第(二)场:河南工业大学 (nowcoder.com)(差分)
#include<iostream>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;
int a[1000006];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
int q;
cin>>q;
a[max(i-q,1)]+=1;
a[i]-=1;
a[i+1]+=1;
a[min(n,i+q)+1]-=1;
}
long long sum=0,ans=0;
for(int i=1;i<=n;i++){
sum+=a[i];
if(sum>=1){
ans++;
}
}
cout<<ans<<endl;
}
G-爬山_2023河南萌新联赛第(二)场:河南工业大学 (nowcoder.com)(二分)
#include<iostream>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;
int n,p;
int a[100006];
int check(int mid){
long long sum=0;
for(int i=0;i<n;i++){
if(mid<a[i]){
sum+=2*(a[i]-mid);
}
}
if(sum>=p)return 1;
return 0;
}
int main(){
cin>>n>>p;
int ma=0;
long long sum=0;
for(int i=0;i<n;i++){
cin>>a[i];
sum=sum+a[i]*2;
ma=max(a[i],ma);
}
if(sum<p){
cout<<"-1"<<endl;
return 0;
}
int l=0,r=ma;
while(r>l){
int mid=(l+r+1)/2;
if(check(mid)){
l=mid;
}
else {
r=mid-1;
}
}
cout<<l<<endl;
}
I-奶牛的寿命_2023河南萌新联赛第(二)场:河南工业大学 (nowcoder.com)(NO)
#include<iostream>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;
int main(){
long long n;
cin>>n;
string s;
long long k=log2(n);
long long ma=n;
while(n>0){
s+=n%2+'0';
n/=2;
}
long long sum=0;
for(int i=0,j=s.size()-2;i<j;){
if(s[j]=='0'){
j--;
continue;
}
if(s[i]=='1'){
i++;
continue;
}
if(s[j]=='1'&&s[i]=='0'){
swap(s[i],s[j]);
j--;
i++;
sum++;
if(sum==k)break;
}
}
long long ans=0;
for(int i=s.size()-1;i>=0;i--){
ans=ans*2+s[i]-'0';
}
cout<<ma-ans<<endl;
}
K-卡特兰数_2023河南萌新联赛第(二)场:河南工业大学 (nowcoder.com)(2和5的应用)
#include<iostream>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=5000006;
typedef pair<long long,long long>PII;
PII h[N];
long long sum1,sum2;
long long solve1(long long x){
long long ans=0;
while(x%5==0){
ans++;
x/=5;
}
return ans;
}
long long solve2(long long x){
long long ans=0;
while(x%2==0){
ans++;
x/=2;
}
return ans;
}
int main(){
int n;
cin>>n;
h[0].first=0;
h[0].second=0;
for(int i=1;i<=n;i++){
h[i].first=h[i-1].first+solve1(4*i-2)-solve1(i+1);
h[i].second=h[i-1].second+solve2(4*i-2)-solve2(i+1);
sum1+=h[i].first;
sum2+=h[i].second;
}
cout<<min(sum1,sum2)<<endl;
}
131. 直方图中最大的矩形 - AcWing题库(重新学习)
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
#include<stack>
using namespace std;
int a[1000005];
int n,m;
int p[100005];
int r[100005];
int l[100005];
int main(){
int w;
while(cin>>n){
if(n==0)break;
memset(l,0,sizeof(l));
memset(r,0,sizeof(r));
for(int i=1;i<=n;i++){
cin>>a[i];
}stack<int>q;
q.push(0);
a[0]=-1;
a[n+1]=-1;//注意,a[n]的前后要有判断
for(int i=1;i<=n+1;i++){
while(a[q.top()]>a[i]){//当前高度大于栈顶高度时
int temp=q.top();//取出栈顶元素备用
q.pop();//出栈
r[temp]=i-temp;//刚刚栈顶元素,右面大于a[temp]的个数,包含a[temp]
}
if(a[i]==a[q.top()]){//定于时
l[i]=l[q.top()]+i-q.top();
}
else{//小于时
l[i]=i-q.top()-1;
}
q.push(i);
}
long long ans=-1;
for(int i=1;i<=n;i++){
ans=max(ans,(long long)a[i]*(l[i]+r[i]));
}
cout<<ans<<endl;
}
}