abc 461 题解

A 题

很简单,比较a和d的大小即可。

代码如下:

复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
  int a,d; 
  scanf("%d%d",&a,&d);
  if(a<=d) puts("Yes");
  else puts("No");
  return 0;
}

B 题

也比较简单,我们能知道其实每一对关系都是对应的。

所以ab\[i]=i是对任意一个正确的序列都是恒成立的。

代码如下:

复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
  int n;scanf("%d",&n);
  vector<int>a(n),b(n);
  for(int&i:a)scanf("%d",&i);
  for(int&i:b)scanf("%d",&i);
  for(int i=0;i<n;i++){
    if(a[b[i]-1]!=i+1){
      printf("No\n");
      return 0;
    }
  }
  printf("Yes\n");
  return 0;
}

C 题

我们看到题目之后,他有限制,我们第一时间想到什么?

恰好选k个,再加上有附加条件,直接反悔贪心+大顶堆

于是乎,我们就可以得到以下代码。

复制代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct gem{
  int c,v;
  bool operator<(gem a)const{
    return this->v>a.v;
  }
}var[200010];
signed main(){
  int n,k,m,tot=0,type=0;
  scanf("%lld%lld%lld",&n,&k,&m);
  for(int i=1;i<=n;i++){
    scanf("%lld%lld",&var[i].c,&var[i].v);
  }
  sort(var+1,var+1+n);
  unordered_map<int,int>cnt;
  priority_queue<int,vector<int>,greater<int>>pq;
  for(int i=1;i<=k;i++){
    if(cnt[var[i].c]==0) type++;
    else pq.push(var[i].v);
    cnt[var[i].c]++,tot+=var[i].v;
  }
  if(type>=m) printf("%lld\n",tot);
  else{
    for(int i=k+1;i<=n;i++){
      if(cnt[var[i].c]==0&&!pq.empty()){
        int top=pq.top(); pq.pop();
        tot+=var[i].v-top, cnt[var[i].c]++,type++;
        if(type>=m) break;
      }
    }
    printf("%lld\n",tot);
  }
  return 0;
}

这里有个点,要解释一下:

为什么我们不需要在最后的else循环中的for循环里,碰到是最后一个元素,就直接删掉?

Ans:我们是不可能删掉最大的那些元素的。

原因:你把他删掉,你就要选一个另外的其他颜色或者相同颜色的物品来替代它。但是价值一定比他啊!所以,只需要删掉最低价值的那几个已经有颜色的(这样就不会出现,只有这一个有颜色,但是价格必要选的要搞得这情况)(见cntvar\[i.c]==0)。

所以,无需删除,因为你根本碰不到要删掉的情况。

D 题

本题主播还没写出来

E 题

已经写出来了,但是主播要去上课,就把代码发一下吧!

复制代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct fenwick{
  int n; vector<int> a;
  fenwick(int n):n(n),a(n+2,0){}
  int lb(int x){return x&-x;}
  void add(int x,int k){
    while(x<=n){
      a[x]+=k,x+=lb(x);
    }
  }
  int sum(int x){
    int ans=0;
    while(x>=1){
      ans+=a[x],x-=lb(x);
    }
    return ans;
  }
  int range(int l,int r){
    return sum(r)-sum(l-1);
  }
};
signed main(){
  ios::sync_with_stdio(0);
  cin.tie(nullptr);
  int n,q,ans=0;cin>>n>>q;
  fenwick trr(300010),trc(300010);
  vector<int>rt(300010,0),ct(300010,0);
  trr.add(1,n),trc.add(1,n);
  for(int t=1;t<=q;t++){
    int op,x;cin>>op>>x;
    if(op==1){
      ans+=trc.sum(t)-trc.sum(rt[x]);
      trr.add(rt[x]+1,-1);
      trr.add(t+1,1),rt[x]=t;
    }else{
      ans-=trr.sum(t+1)-trr.sum(ct[x]+1);
      trc.add(ct[x]+1,-1);
      trc.add(t+1,1),ct[x]=t;
    }
    cout<<ans<<"\n";
  }
  return 0;
}