jzoj5986. 【WC2019模拟2019.1.4】立体几何题 (权值线段树)
题面


题解
不难看出每个点的大小为行列限制中较小的那一个(因为数据保证有解)
对于行的每个限制,能取到的个数是列里限制大于等于它的数的个数,同理,对于列是行里大于它的个数(这里没有等于,为了避免重复计算)
于是可以对于行列分别开权值线段树,修改的时候只要把对应的贡献改一下就好了
//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】立体几何题 (权值线段树)的更多相关文章
- 2019年CCPC网络赛 HDU 6703 array【权值线段树】
题目大意:给出一个n个元素的数组A,A中所有元素都是不重复的[1,n].有两种操作:1.将pos位置的元素+1e72.查询不属于[1,r]中的最小的>=k的值.强制在线. 题解因为数组中的值唯一 ...
- 2019.01.21 bzoj2441: [中山市选2011]小W的问题(树状数组+权值线段树)
传送门 数据结构优化计数菜题. 题意简述:给nnn个点问有多少个www型. www型的定义: 由5个不同的点组成,满足x1<x2<x3<x4<x5,x3>x1>x2 ...
- 2019.01.14 bzoj5343: [Ctsc2018]混合果汁(整体二分+权值线段树)
传送门 整体二分好题. 题意简述:nnn种果汁,每种有三个属性:美味度,单位体积价格,购买体积上限. 现在有mmm个询问,每次问能否混合出总体积大于某个值,总价格小于某个值的果汁,如果能,求所有方案中 ...
- HDU 6464 权值线段树 && HDU 6468 思维题
免费送气球 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- 2019牛客多校第七场E Find the median 权值线段树+离散化
Find the median 题目链接: https://ac.nowcoder.com/acm/contest/887/E 题目描述 Let median of some array be the ...
- 刷题总结——骑士的旅行(bzoj4336 树链剖分套权值线段树)
题目: Description 在一片古老的土地上,有一个繁荣的文明. 这片大地几乎被森林覆盖,有N座城坐落其中.巧合的是,这N座城由恰好N-1条双 向道路连接起来,使得任意两座城都是连通的.也就是说 ...
- 区间前k小的和(权值线段树+离散化)--2019牛客多校第7场C--砍树
题目链接:https://ac.nowcoder.com/acm/contest/887/C?&headNav=acm 题意: 给你 n 种树,有 高度,花费和数量 ,现在问你最少需要花多少钱 ...
- 2019杭电多校第三场hdu6606 Distribution of books(二分答案+dp+权值线段树)
Distribution of books 题目传送门 解题思路 求最大值的最小值,可以想到用二分答案. 对于二分出的每个mid,要找到是否存在前缀可以份为小于等于mid的k份.先求出这n个数的前缀和 ...
- CCPC 2019 网络赛 1002 array (权值线段树)
HDU 6703 array 题意: 给定一个数组 \(a_1,a_2, a_3,...a_n\) ,满足 \(1 \le a[i]\le n\) 且 \(a[i]\) 互不相同. 有两种 ...
随机推荐
- switch多分枝语句
package lianxi; //switch多分枝语句 import java.util.Scanner; public class GetSwitch { public static void ...
- linux socket send和recv、write和read
1 recv和read ssize_t recv(int sockfd, void *buf, size_t len, int flags); ssize_t read(int fd, void *b ...
- 阿里云Redis开发规范(转)
一.键值设计 1. key名设计 (1)[建议]: 可读性和可管理性 以业务名(或数据库名)为前缀(防止key冲突),用冒号分隔,比如业务名:表名:id ugc:video: (2)[建议]:简洁性 ...
- 【Effective C++】构造/析构/赋值运算
条款05:了解C++默默编写并调用哪些函数 默认构造函数.拷贝构造函数.拷贝赋值函数.析构函数构成了一个类的脊梁,只有良好的处理这些函数的定义才能保证类的设计良好性. 当我们没有人为的定义上面的几个函 ...
- Codeforces Round #417 (Div. 2) B. Sagheer, the Hausmeister —— DP
题目链接:http://codeforces.com/problemset/problem/812/B B. Sagheer, the Hausmeister time limit per test ...
- 学习c编程的第二天
函数又叫方法,是实现某项功能或完成某项任务的代码块 #include<stdio.h>void show(){ printf("I like c language"); ...
- ffmpeg xcode 中的使用
最近比较闲,苦于ios设备上没有直接播放torrent 文件的软件,开始折腾了.找了不少资料有了思路.但是其中用到了ffmpeg 这个东西. ffmpeg 是通用的一个视频解决框架,用C语言编写,通用 ...
- Java版本更新历史(ing)
历史版本特性 JDK Version 1.0 开发代号为Oak(橡树),于1996-01-23发行. JDK Version 1.1 于1997-02-19发行. 引入的新特性包括: 引入JDBC(J ...
- druid.io 海量实时OLAP数据仓库 (翻译+总结) (1)——分析框架如hive或者redshift(MPPDB)、ES等
介绍 我是NDPmedia公司的大数据OLAP的资深高级工程师, 专注于OLAP领域, 现将一个成熟的可靠的高性能的海量实时OLAP数据仓库介绍给大家: druid.io NDPmedia在2014年 ...
- JSR 303 - Bean Validation 是什么?
关于 Bean Validation JSR 303 - Bean Validation 是jree6 中的一项子规范,JSR 303 - Bean Validation着重解决以下实际问题: 在任何 ...