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;
}