首页 > 其他分享 >C105 整体二分+树状数组 P2617 Dynamic Rankings

C105 整体二分+树状数组 P2617 Dynamic Rankings

时间:2024-03-23 22:44:42浏览次数:32  
标签:树状 int Rankings Dynamic P2617 数组

视频链接:C105 整体二分+树状数组 P2617 Dynamic Rankings_哔哩哔哩_bilibili

 

 

C96 树状数组套权值线段树 P2617 Dynamic Rankings - 董晓 - 博客园 (cnblogs.com)

C104【模板】整体二分+树状数组 P3834 可持久化线段树2 - 董晓 - 博客园 (cnblogs.com)

Luogu P2617 Dynamic Rankings

// 整体二分+树状数组 O(nlognlogn)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N=300005;
int n,m,cnt,a[N];
int ans[N],s[N];

struct Q{
  //  数: x位置,y值,k贡献,opt=0  
  //查询: [x,y]第k小,id编号,opt=1
  int x,y,k,id,opt;
}q[N<<1],q1[N<<1],q2[N<<1];

void add(int x,int v){ //加入贡献
  while(x<=n)s[x]+=v,x+=x&(-x);
}
int sum(int x){ //前缀和
  int t=0;
  while(x)t+=s[x],x-=x&(-x);
  return t;
}
void solve(int l,int r,int L,int R){
  if(l>r) return; //[l,r]数据个数域 [L,R]值域
  if(L==R){
    for(int i=l;i<=r;i++)
      if(q[i].opt) ans[q[i].id]=L; //记录答案
    return;
  }
  int mid=(L+R)>>1,p1=0,p2=0;
  for(int i=l;i<=r;i++){
    if(!q[i].opt){          //若是数,按值分流
      if(q[i].y<=mid)   
        add(q[i].x,q[i].k), //加入贡献
        q1[++p1]=q[i];      //分流到左边
      else q2[++p2]=q[i];   //分流到右边
    }
    else{                   //若是查询,按个数分流
      int s=sum(q[i].y)-sum(q[i].x-1);
      if(s>=q[i].k) q1[++p1]=q[i];  //分流到左边
      else q[i].k-=s,q2[++p2]=q[i]; //分流到右边
    }
  }
  for(int i=1;i<=p1;i++)
    if(!q1[i].opt) add(q1[i].x,-q1[i].k);  //减去贡献
  for(int i=1;i<=p1;i++)q[i+l-1]=q1[i]; 
  for(int i=1;i<=p2;i++)q[i+l+p1-1]=q2[i]; //合并数组
  solve(l,l+p1-1,L,mid);
  solve(l+p1,r,mid+1,R); //分治
}
int main(){
  scanf("%d%d",&n,&m); char ch[2]; int x,y,k;
  for(int i=1;i<=n;i++)
    scanf("%d",&a[i]),q[++cnt]={i,a[i],1,0,0};
  for(int i=1;i<=m;i++){
    scanf("%s%d%d",ch,&x,&y);
    if(ch[0]=='C')
      q[++cnt]={x,a[x],-1,0,0},  //旧数贡献-1
      q[++cnt]={x,a[x]=y,1,0,0}; //新数贡献+1
    else scanf("%d",&k),q[++cnt]={x,y,k,i,1};
  }
  memset(ans,-1,sizeof ans);
  solve(1,cnt,0,1e9); //整体二分
  for(int i=1;i<=m;i++)if(~ans[i])printf("%d\n",ans[i]);
}

 

标签:树状,int,Rankings,Dynamic,P2617,数组
From: https://www.cnblogs.com/dx123/p/18090964

相关文章

  • flutter中Map<String, dynamic>与Map<String, String>的区别
    在Flutter中,Map<String,dynamic>和Map<String,String>都是Map类型的数据结构,但它们之间有一些重要的区别: 1.Map<String,dynamic>:这种Map的值可以是任何类型,包括基本数据类型(如int,double,String等),List,Map以及自定义对象。使用dynamic类型会导致更灵活的数据处理,但在编码时......
  • SpringBoot 多数据源 - dynamic-datasource | 快速入门
    文章目录简介第1步:引入依赖第2步:配置数据源多种配置数据源的形式数据源配置示例第3步:使用@DS注解切换数据源@DS注解详解@DS注解使用案例......
  • Dynamics CRM 2013 常用SQL查询基础数据
    获取实体SELECT*FROMEntityWHERELogicalName='EntityName'获取字段名称SELECTdistinctA.nameAS字段名,L.labelAS显示名,AT.descriptionAS类型,L.ObjectColumnNameAS形式,A.IsNullableAScodefromattributeAINNERJOINlocalizedlabelLONA.Attributei......
  • Dynamics CRM 2013 常用JS脚本
    Xrm.Page.data获取记录的主键Id的值(getId)varId=Xrm.Page.data.entity.getId();获取记录的表的逻辑名称(getEntityName)varentityName=Xrm.Page.data.entity.getEntityName();获取引用记录的查找值(getEntityReference)varerEntity=Xrm.Page.data.entity.getEnt......
  • 9_dynamic动态类型与object类型的区别
    C#中dynamic动态类型与object类型的区别1.object类型object类型是.NET中System.Object类的别名。在C#中,所有类型(预定义、用户定义、引用类型、值类型)都直接或间接继承自Object。因此,我们可以将任何类型的值用object对象来接收。2.dynamic动态类型动态......
  • EvolveGCN Evolving Graph Convolutional Networks for Dynamic Graphs
    目录概符号说明EvolveGCN代码ParejaA.,DomeniconiG.,ChenJ.,MaT.,SuzumuraT.,KanezashiH.,KalerT.,SchardlT.B.andLeisersonC.E.EvolveGCN:Evolvinggraphconvolutionalnetworksfordynamicgraphs.AAAI,2019.概GCN用在动态图上的早期探索.符号......
  • Dynamics 365开启审计日志
    1.启用审核选择设置(齿轮图标)>高级设置>系统设置>审核选项卡。或者,从 PowerApps主页,选择设置(齿轮图标)>高级设置>设置>审核>全局审核设置。在审核设置下,启用以下复选框:启动审核(StartAuditing)审核用户访问(Audituseraccess)(注意:仅捕获用户登录)启动读取审核(St......
  • 【Spring】【Mybatis】【Dynamic-Datasource】【事务】Spring + MyBaits + 事务 + 动
    1 前言我上次有一篇是讲了从一个数据库连接的角度分析了 Spring+MyBaits+事务三者的联系,这是在数据源固定的情况下。那么可能会遇到,比如按租户的分库,这种情况下我们会引入动态的数据源比如苞米豆团队的Dynamic-Datasource或者是自己公司内部封装的工具、框架等,这节我们......
  • 关于动态规划(Dynamic Programming)的若干思考 ------ [2.线性dp]
    线性dp的两个经典题目:最长上升子序列(LIS)and最长公共子序列(LCS)1.LIS核心代码#include<bits/stdc++.h>usingnamespacestd;constintmaxn=2024;intcnt=0,ans=1;intf[maxn],a[maxn],c[maxn];voidout(intx){ if(x==0)return; out(c[x]); cout<<a[x]<<......
  • 关于动态规划(Dynamic Programming)的若干思考 ------ [1.背包dp]
    背包dp;1.01背包(1)领域展开#include<bits/stdc++.h>//simpleusingnamespacestd;constintmaxm=2024;intn,m;intw[maxm],v[maxm],f[maxm][maxm];intmain(){ cin>>n>>m; for(inti=1;i<=n;i++) cin>>v[i]>>w[i]; for(i......