传送门

题面



题解

不难看出每个点的大小为行列限制中较小的那一个(因为数据保证有解)

对于行的每个限制,能取到的个数是列里限制大于等于它的数的个数,同理,对于列是行里大于它的个数(这里没有等于,为了避免重复计算)

于是可以对于行列分别开权值线段树,修改的时候只要把对应的贡献改一下就好了

//minamoto
#include<bits/stdc++.h>
#define R register
#define ll long long
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
char sr[1<<21],z[20];int C=-1,Z=0;
inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
void print(R ll x){
if(C>1<<20)Ot();if(x<0)sr[++C]='-',x=-x;
while(z[++Z]=x%10+48,x/=10);
while(sr[++C]=z[Z],--Z);sr[++C]='\n';
}
const int N=1e5+5;
struct change{int op,pos,x;}c[N];
ll res;int n,m,a[N],b[N],aa[N],bb[N],op,pos,x,lim;
struct seg{
struct node{int ls,rs,cnt;ll sum;}t[N<<5];
int rt,tot;
void ins(int &p,int l,int r,int x,int ty){
if(!p)p=++tot;t[p].cnt+=ty,t[p].sum+=x*ty;
if(l==r)return;int mid=(l+r)>>1;
x<=mid?ins(t[p].ls,l,mid,x,ty):ins(t[p].rs,mid+1,r,x,ty);
}
int q_cnt(int p,int l,int r,int ql,int qr){
if(!p)return 0;if(ql<=l&&qr>=r)return t[p].cnt;
int mid=(l+r)>>1,res=0;
if(ql<=mid)res+=q_cnt(t[p].ls,l,mid,ql,qr);
if(qr>mid)res+=q_cnt(t[p].rs,mid+1,r,ql,qr);
return res;
}
ll q_sum(int p,int l,int r,int ql,int qr){
if(!p)return 0;if(ql<=l&&qr>=r)return t[p].sum;
int mid=(l+r)>>1;ll res=0;
if(ql<=mid)res+=q_sum(t[p].ls,l,mid,ql,qr);
if(qr>mid)res+=q_sum(t[p].rs,mid+1,r,ql,qr);
return res;
}
}A,B;
int main(){
freopen("graph.in","r",stdin);
freopen("graph.out","w",stdout);
n=read();
fp(i,1,n)aa[i]=a[i]=read(),cmax(lim,a[i]);
fp(i,1,n)bb[i]=b[i]=read(),cmax(lim,b[i]);
m=read();
fp(i,1,m)c[i].op=read(),c[i].pos=read(),c[i].x=read(),cmax(lim,c[i].x);
sort(aa+1,aa+1+n),sort(bb+1,bb+1+n);
for(R int i=1,j=1;i<=n;++i){
while(j<=n&&aa[i]>bb[j])++j;
res+=1ll*aa[i]*(n-j+1);
}for(R int i=1,j=1;i<=n;++i){
while(j<=n&&bb[i]>=aa[j])++j;
res+=1ll*bb[i]*(n-j+1);
}print(res);
fp(i,1,n)A.ins(A.rt,0,lim,a[i],1);
fp(i,1,n)B.ins(B.rt,0,lim,b[i],1);
fp(i,1,m){
op=c[i].op,pos=c[i].pos,x=c[i].x;
if(op==0){
res-=1ll*B.q_cnt(B.rt,0,lim,a[pos],lim)*a[pos];
if(a[pos]>0)res-=B.q_sum(B.rt,0,lim,0,a[pos]-1);
A.ins(A.rt,0,lim,a[pos],-1);
a[pos]=x;
A.ins(A.rt,0,lim,a[pos],1);
res+=1ll*B.q_cnt(B.rt,0,lim,a[pos],lim)*a[pos];
if(a[pos]>0)res+=B.q_sum(B.rt,0,lim,0,a[pos]-1);
}else{
if(b[pos]<lim)res-=1ll*A.q_cnt(A.rt,0,lim,b[pos]+1,lim)*b[pos];
res-=A.q_sum(A.rt,0,lim,0,b[pos]);
B.ins(B.rt,0,lim,b[pos],-1);
b[pos]=x;
B.ins(B.rt,0,lim,b[pos],1);
if(b[pos]<lim)res+=1ll*A.q_cnt(A.rt,0,lim,b[pos]+1,lim)*b[pos];
res+=A.q_sum(A.rt,0,lim,0,b[pos]);
}print(res);
}return Ot(),0;
}

jzoj5986. 【WC2019模拟2019.1.4】立体几何题 (权值线段树)的更多相关文章

  1. 2019年CCPC网络赛 HDU 6703 array【权值线段树】

    题目大意:给出一个n个元素的数组A,A中所有元素都是不重复的[1,n].有两种操作:1.将pos位置的元素+1e72.查询不属于[1,r]中的最小的>=k的值.强制在线. 题解因为数组中的值唯一 ...

  2. 2019.01.21 bzoj2441: [中山市选2011]小W的问题(树状数组+权值线段树)

    传送门 数据结构优化计数菜题. 题意简述:给nnn个点问有多少个www型. www型的定义: 由5个不同的点组成,满足x1<x2<x3<x4<x5,x3>x1>x2 ...

  3. 2019.01.14 bzoj5343: [Ctsc2018]混合果汁(整体二分+权值线段树)

    传送门 整体二分好题. 题意简述:nnn种果汁,每种有三个属性:美味度,单位体积价格,购买体积上限. 现在有mmm个询问,每次问能否混合出总体积大于某个值,总价格小于某个值的果汁,如果能,求所有方案中 ...

  4. HDU 6464 权值线段树 && HDU 6468 思维题

    免费送气球 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  5. 2019牛客多校第七场E Find the median 权值线段树+离散化

    Find the median 题目链接: https://ac.nowcoder.com/acm/contest/887/E 题目描述 Let median of some array be the ...

  6. 刷题总结——骑士的旅行(bzoj4336 树链剖分套权值线段树)

    题目: Description 在一片古老的土地上,有一个繁荣的文明. 这片大地几乎被森林覆盖,有N座城坐落其中.巧合的是,这N座城由恰好N-1条双 向道路连接起来,使得任意两座城都是连通的.也就是说 ...

  7. 区间前k小的和(权值线段树+离散化)--2019牛客多校第7场C--砍树

    题目链接:https://ac.nowcoder.com/acm/contest/887/C?&headNav=acm 题意: 给你 n 种树,有 高度,花费和数量 ,现在问你最少需要花多少钱 ...

  8. 2019杭电多校第三场hdu6606 Distribution of books(二分答案+dp+权值线段树)

    Distribution of books 题目传送门 解题思路 求最大值的最小值,可以想到用二分答案. 对于二分出的每个mid,要找到是否存在前缀可以份为小于等于mid的k份.先求出这n个数的前缀和 ...

  9. CCPC 2019 网络赛 1002 array (权值线段树)

    HDU 6703 array   题意:   给定一个数组 \(a_1,a_2, a_3,...a_n\) ,满足 \(1 \le a[i]\le n\) 且 \(a[i]\) 互不相同.   有两种 ...

随机推荐

  1. JAVA虚拟机、Dalvik虚拟机和ART虚拟机简要对照

    1.什么是JVM? JVM本质上就是一个软件,是计算机硬件的一层软件抽象,在这之上才干够运行Java程序,JAVA在编译后会生成相似于汇编语言的JVM字节码,与C语言编译后产生的汇编语言不同的是,C编 ...

  2. crazyflie2.0 RCC时钟知识

    因为眼下手里仅仅有16MHZ的2520封装的贴片晶振,8MHZ这样的封装做不到这么小,所以就先用16MHZ,这样我们就须要改动程序相关的RCC时钟: 1,stm32f4xx.h #define HSE ...

  3. EasyRTSPClient:基于live555封装的支持重连的RTSP客户端RTSPClient

    今天先简单介绍一下EasyRTSPClient,后面的文章我们再仔细介绍EasyRTSPClient内部的设计过程: EasyRTSPClient:https://github.com/EasyDar ...

  4. java之选择排序

     //选择排序(Select Sorting)也是一种简单的排序方法.它的基本思想是:第一次从R[0]-R[n-1]中选取最小值,与R[0]交换,第二次从R[1]-R[n-1]中选取最小值,与R[1] ...

  5. 电脑插入U盘后显示CD驱动器,如何还原为正常U盘?

    以前用电脑店制作U盘启动工具,结果U盘的一小部分变成了CD驱动器, 无论怎么格式化都无法将U盘还原,这几天心血来潮,看了一些恢复U盘的教程, 打算写一篇博客讲解一下还原过程(本人亲测) 1.下载Chi ...

  6. svn下载

    首先介绍的是SVN安装包的下载,分别包括服务器版和客户端版 下载地址:http://subversion.apache.org/packages.html 打开后,点击Windows 分别下载客户端( ...

  7. php date之间的相互转换

    字符串转成date $str =date("Y-m-d H:i:s",strtotime("2011-12-12 14:23:01")); echo $str; ...

  8. ssh服务配置文件---sshd_config详解

     关于 SSH Server 的整体设定,包含使用的 port 啦,以及使用的密码演算方式 Port 22 # SSH 预设使用 22 这个 port,您也可以使用多的 port !  # 亦即重复使 ...

  9. TestNG测试用例编写和执行

    编写TestNG用例测试基本上包括以下步骤: 编写业务逻辑 针对业务逻辑中涉及的方法编写测试类,在代码中插入TestNG的注解 直接执行测试类或者添加一个testng.xml文件 运行 TestNG. ...

  10. Django_model进阶

    Django-model进阶   QuerySet 可切片 使用Python 的切片语法来限制查询集记录的数目 .它等同于SQL 的LIMIT 和OFFSET 子句. >>> Ent ...