array-and-queries


#include <bits/stdc++.h>
using namespace std;
long int mod=1000000007 ; 
int main(){
    int n;cin>>n;
    multiset<int> set1;
    int arr[n];
    for(int i=0;i<n;i++){
        cin>>arr[i];
        set1.insert(arr[i]);
    }
    multiset<int> set2=set1;//拷贝一个集合
    int count=0;
    while(set2.size()){//统计现有数量,尽可能找出最长的连续子数组
        count++;
        int cur=*(set2.begin());
        set2.erase(set2.find(cur));
        while((set2.find(cur+1))!=set2.end()){
            cur++;
            set2.erase(set2.find(cur));//每次找到cur+1都删去该数
        }
    }
   long long int q;
    cin>>q;
    long long int ans=0;
    for(long long int i=0;i<q;i++){
        int id,val;
        cin>>id>>val;
        id--;
        
        int curr=set1.count(arr[id]);
        int prev=set1.count(arr[id]-1);
        int next=set1.count(arr[id]+1);
        
        if(curr>max(prev,next))//大于旁边两者 数量减一
            count--;
        else if(curr<=min(prev,next))//小于等于旁边两者 数量加一
            count++;
        
        set1.erase(set1.find(arr[id]));//删去该数
        arr[id]=val;
        
        curr=set1.count(arr[id]);//添加一个数,同理
        prev=set1.count(arr[id]-1);
        next=set1.count(arr[id]+1);
        
        if((curr+1)>max(prev,next))
            count++;
        else if((curr+1)<=min(prev,next))
            count--;
        
        set1.insert(val);
        ans=(ans+((i+1)*(count))%mod)%mod;
    }
    cout<<ans;
    return 0;
}
全部评论

相关推荐

01-03 10:04
已编辑
北京大学 算法工程师
北科勒布朗詹姆斯:无脑腾,现在户口有鸟用,你又不高考,研究所都是嘴上一套背后一套的,招人的时候说是37w955,真去了可由不得你
点赞 评论 收藏
分享
脑袋锈住了:你这算啥,哥们中科院中强所硕士,本科211,叫我去干分拣,时薪20
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务