传送门

题面



题解

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

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

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

//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. GCJ Qualification Round 2016 D题

    这题就是找规律.小数据还是挺容易想的.大数据得再深入分析一下. 题意挺绕的. 其实就是字符串转换.字符串只能有两种字母,L或G.给定K和C,就能通过规则生成目标字符串. 那么,如果知道了K和C,以及目 ...

  2. java之HashMap的遍历Iterator

    package com.ql_2;/* * 功能:HashMap 的使用 */import java.util.*; public class Test_2 { public static void ...

  3. Tomcat启动过程中卡住了

    我在部署完项目后,debug启动Tomcat会在中间卡住不继续执行,测试发现在不部署项目的时候Tomcat是可以正常启动的. 控制台信息如下: 十月 25, 2017 10:40:44 上午 org. ...

  4. linux jdk更换

    有时候会发现,安装了新的jdk,而java -version 之后发现仍旧是旧的jdk,即使自己已经更新了JAVA_HOME的环境变量,解决方法如下: 具体如下: 1. 查看相应的jdk是否在 ubu ...

  5. HZNU 2154 ldh发奖金【字符串】

    题目链接 http://acm.hznu.edu.cn/OJ/problem.php?id=2154 思路 先判断不能拆分的情况 以为需要拆分成两个正整数 所以我们可以知道 只有个位的数字 是不能够拆 ...

  6. haproxy参数解析

    HAProxy工作于隧道模式,其仅检查每一个连接的第一个请求, 1. option abortonclose #当服务器负载过高时,将自动关闭队列中处理时间较长的连接请求 2. option http ...

  7. oracle添加表注释和表字段注释

    创建Oracle数据库表时加上注释 CREATE TABLE t1( id  varchar2(32) primary key,name VARCHAR2(8) NOT NULL, age numbe ...

  8. PICT实现组合测试用例

    成功安装后,在命令行中输入命令pict: 可以看到pict命令的一些选项: /o:N   组合数,默认值为2,即pict生成的测试用例集中每条测试数据会有两个值与其他测试集是不同的: /d:C   值 ...

  9. mysql优化20条原则

    今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据 ...

  10. Microsoft Speech SDK开发包 使用

    下载开发包.我们首先从微软的官网上面下载开发包,下载地址如下: http://www.microsoft.com/en-us/download/details.aspx?id=10121我们主要下载三 ...