传送门

题面



题解

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

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

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

//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. unity3d从零開始(五):了解摄像机

    1.简单介绍         Unity的摄像机是用来将游戏世界呈现给玩家的,游戏场景中至少有一台摄像机.也能够有多台. 2.类型         Unity中支持两种类型的摄像机,各自是Perspe ...

  2. #include &lt;sys/socket.h&gt;找不到头文件

    ubuntu下socket编程涉及到头文件sys/socket.h 和sys/types.h.我是用的codeblocks编辑器,当我想查看socket,h头文件时编辑器提示找不到头文件. 我就想可能 ...

  3. SAM4E单片机之旅——8、UART初步

    通信还是比让LED灯闪烁实用得多的. 这次试试使用UART,实现开发版和PC间的通信.功能比较简单,就是把PC发向开发版的内容发送回去.这次主要介绍一下UART的配置,至于通信,则使用较为简单的不断查 ...

  4. ArcGIS10和ArcGIS10.1关于AO Licence初始化的问题

    两个版本主要是esriLicenseProductCode.esriLicenseProductCodeArcInfo和esriLicenseProductCode.esriLicenseProduc ...

  5. 【LeetCode】Maximum Depth of Binary Tree

    http://oj.leetcode.com/problems/maximum-depth-of-binary-tree/ public class Solution { public int max ...

  6. guava cache与spring集成

    缓存的背景 缓存,在我们日常开发中是必不可少的一种解决性能问题的方法.简单的说,cache 就是为了提升系统性能而开辟的一块内存空间.在cpu进行计算的时候, 首先是读取寄存器,然后内存,再是硬盘.由 ...

  7. apache配置文件详解及虚拟主机的搭建

    1.404跳转: <IfModule dir_module>    DirectoryIndex index.php index.html /error.php</IfModule& ...

  8. html5 3D圣诞树源码

    1. [代码][HTML]代码   <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http ...

  9. struts2 学习日记1

    struts2 简介 struts2的前身可以说是framework.strut1作为当时很流行的框架,但是有很多的不足之处,framework出生后,它带来了很好的框架,但是很多人已经习惯了stru ...

  10. 页面渲染——页面合成(composition)的优化

    合成(composition)意味着将网页中已经绘画好的部分结合在一起,且展示在屏幕上. 坚持使用transform和opacity属性来操作你的动画animation 在有动画的元素上使用 will ...