2 条题解

  • 1
    @ 2025-12-23 19:33:57
    #include<bits/stdc++.h>
    #include<bits/extc++.h>
    using namespace std;
    using namespace __gnu_pbds;
    const int N=5e5+10;
    tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update>s[N];
    map<int,int>mp;int trlen,a[N];
    int main()
    {
    	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    	int n,q;cin>>n>>q;
    	for(int i=1;i<=n;i++)
    	{
    		cin>>a[i];
    		if(!mp[a[i]])mp[a[i]]=++trlen;
    		s[mp[a[i]]].insert(i);
    	}
    	while(q--)
    	{
    		int op;cin>>op;
    		if(op==0)
    		{
    			int x,y;cin>>x>>y;x++;
    			s[mp[a[x]]].erase(x);
    			if(!mp[y])mp[y]=++trlen;
    			a[x]=y;
    			s[mp[a[x]]].insert(x);
    		}
    		else
    		{
    			int l,r,x;cin>>l>>r>>x;l++;
    			if(!mp[x]){cout<<0<<'\n';continue;}
    			x=mp[x];
    			auto it=s[x].lower_bound(l),it1=s[x].upper_bound(r);
    			if(it==s[x].end()){cout<<0<<'\n';continue;}
    			int num=*it,id=s[x].order_of_key(num);
    			if(it1==s[x].end()){cout<<s[x].size()-id<<'\n';continue;}
    			int num1=*it1,id1=s[x].order_of_key(num1);
    			cout<<id1-id<<'\n';
    		}
    	}
    	return 0;
    }
    
    
    • 0
      @ 2026-8-4 10:59:18

      cdq分治太美妙了

      #include<bits/stdc++.h>
      using namespace std;
      typedef long long ll;
      int n,q,id,p[200010],lsh[600010],ln;
      struct N{
      	int op,x,y,v,id;
      }a[600010];
      bool cmp(N a,N b){
      	return a.x<b.x;
      }
      int ans[200010],cnt[600010];
      void solve(int l,int r){
      	if(l==r)return ;
      	int mid=(l+r)>>1;
      	solve(l,mid);solve(mid+1,r);
      	sort(a+l,a+mid+1,cmp);
      	sort(a+mid+1,a+r+1,cmp);
      	int j=l;
      	for(int i=mid+1;i<=r;i++){
      		while(j<=mid&&a[j].x<=a[i].x){
      			if(a[j].op==0)cnt[a[j].v]+=a[j].y;
      			j++;
      		}
      		if(a[i].op==1)ans[a[i].id]+=cnt[a[i].v]*a[i].y;
      	}
      	for(int i=l;i<j;i++)if(a[i].op==0)cnt[a[i].v]-=a[i].y;
      }
      int main(){
      	ios::sync_with_stdio(0);
      	cin.tie(0);
      	cin>>n>>q;
      	for(int i=1;i<=n;i++){
      		cin>>p[i];
      		a[++id]={0,i,1,p[i],0};
      		lsh[++ln]=p[i];
      	}
      	int qi=0;
      	for(int i=1;i<=q;i++){
      		int op;
      		cin>>op;
      		if(op==0){
      			int k,v;
      			cin>>k>>v;k++;
      			lsh[++ln]=v;
      			a[++id]={0,k,-1,p[k],0};
      			a[++id]={0,k,1,v,0};
      			p[k]=v;
      		}
      		else{
      			int l,r,x;
      			cin>>l>>r>>x;l++;
      			lsh[++ln]=x;
      			a[++id]={1,r,1,x,++qi};
      			if(l>1)a[++id]={1,l-1,-1,x,qi};
      		}
      	}
      	sort(lsh+1,lsh+1+ln);
      	ln=unique(lsh+1,lsh+1+ln)-lsh-1;
      	for(int i=1;i<=id;i++)a[i].v=lower_bound(lsh+1,lsh+1+ln,a[i].v)-lsh;
      	solve(1,id);
      	for(int i=1;i<=qi;i++){
      		cout<<ans[i]<<'\n';
      	}
      	return 0;
      }
      
      • 1

      点修 & 区间频次查询(Point Set Range Frequency)

      信息

      ID
      8149
      时间
      1000ms
      内存
      1024MiB
      难度
      9
      标签
      递交数
      14
      已通过
      5
      上传者