A - K-th Largest Value
题意:
一个数组,里面只有0,或1。
q组操作:1or2,
1取1-ai,2查询第k个最大值
题解:
写一个sum记录1的数目即可
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=2e5+3;
ll a[maxn];
bool cmp(int a,int b){
return a>b;
}
int main(){
int n,q;cin>>n>>q;
int sum=0;
for(int i=1;i<=n;i++){scanf("%d",&a[i]);sum+=a[i];}
while(q--){
int t;cin>>t;
int x;cin>>x;
if(t==1){
a[x]=1-a[x];
if(a[x]==1)sum++;
else sum--;
}
else if(t==2){
// cout<<"**"<<sum<<endl;
if(x<=sum)printf("1\n");
else printf("0\n");
}
}
return 0;
}
B - Minimal Cost
题意:
要求从(1,0)->(n,1e6+1),每行一个障碍物。
移动障碍物,上下花费u,左右花费v。
求最小花费。
题解:
三种情况:
1》竖着一道墙:min(v+v,u+v)
2》斜着一道墙:min(u,v)
3》剩下所有,不动即可实现
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e6+3;
ll a[maxn];
int main(){
int t; scanf("%d",&t);
while(t--){
ll n,u,v;
ll sum=0;
ll mmax=0;
scanf("%lld%lld%lld",&n,&u,&v);
int f=1;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
if(i!=1&&a[i]!=a[i-1])f=0;
if(i!=1)mmax=max(abs(a[i]-a[i-1]),mmax);//斜着
}
if(f) sum=min(u+v,v+v);
else if(mmax==1) sum=min(u,v);
printf("%lld\n",sum);
}
return 0;
}
一些反思:
一直害怕出现这种情况:
可惜题目范围表示根本不会。。多看看题目!
C - Pekora and Trampoline
题意:
每次从任意点开始跳,且在此次跳跃过程中可进行连续跳跃:i+si,想要知道什么时候可以跳到全为1
题解:
每次都从第一个位置跳就会跳的最长,故而最优。
暴力必定会超时啦,看看如何简化。
用一个数组【f】记录该点被跳到过几次。
然后从头开始遍历。
1》若ai-1>fi,若想让它变为1,则它会影响【i+2】到【min(n,ai+i)】的值,全部进行+1。ans=ans+ai-1-fi。
2》fi>ai-1,【i+2】到【min(n,ai+i)】的值,全部进行+1,且fi-ai-1即ai变成1后又跳了多少次,使f i+1再加上fi-ai-1。