bzoj1691
排序维护一维满足,另一位用treap维护
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fod(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int N=1e6+10;
struct data {
int l,r,v,size,rnd,w;
}tr[N];
struct grass{
int a,b;
bool operator <(const grass &rhs)const {
return rhs.b<b;
}
}a[N],b[N];
int n,m,size,root,ans;
void update(int k)
{
tr[k].size=tr[tr[k].l].size+tr[tr[k].r].size+tr[k].w;
}
void rturn(int &k)
{
int t=tr[k].l;tr[k].l=tr[t].r;tr[t].r=k;
tr[t].size=tr[k].size;update(k);k=t;
}
void lturn(int &k)
{
int t=tr[k].r;tr[k].r=tr[t].l;tr[t].l=k;
tr[t].size=tr[k].size;update(k);k=t;
}
void insert(int &k,int x)
{
if(k==0) {
size++;k=size;
tr[k].size=tr[k].w=1;tr[k].v=x;tr[k].rnd=rand();
return ;
}
tr[k].size++;
if(tr[k].v==x) tr[k].w++;
else if(x>tr[k].v) {
insert(tr[k].r,x);
if(tr[tr[k].r].rnd<tr[k].rnd) lturn(k);
}else {
insert(tr[k].l,x);
if(tr[tr[k].l].rnd<tr[k].rnd) rturn(k);
}
}
void del(int &k,int x)
{
if(k==0) return ;
if(tr[k].v==x) {
if(tr[k].w>1) {
tr[k].w--;tr[k].size-- ;return ;
}
if(tr[k].l*tr[k].r==0) k=tr[k].l+tr[k].r;
else if(tr[tr[k].l].rnd<tr[tr[k].r].rnd)
rturn(k),del(k,x);
else lturn(k),del(k,x);
}
else if(x>tr[k].v)
tr[k].size--,del(tr[k].r,x);
else tr[k].size--,del(tr[k].l,x);
}
void query_sub(int k,int x)
{
if(k==0) return ;
if(tr[k].v>=x) ans=tr[k].v,query_sub(tr[k].l,x);
else query_sub(tr[k].r,x);
}
int main()
{
scanf("%d%d",&n,&m);
fo(i,1,n) scanf("%d%d",&a[i].a,&a[i].b);
fo(i,1,m) scanf("%d%d",&b[i].a,&b[i].b);
sort(a+1,a+1+n);
sort(b+1,b+1+m);
int j=1;long long tot=0;
for(int i=1;i<=n;i++) {
ans=-1;
while(b[j].b>=a[i].b&&j<=m) {insert(root,b[j].a);j++;}
query_sub(root,a[i].a);
if(ans==-1) {printf("-1\n");return 0;}
tot+=ans;del(root,ans);
}
printf("%lld\n",tot);
return 0;
}
bzoj3234
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fod(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int N=1e5+10;
struct data {
int l,r,v,size,rnd,w;
}tr[N];
int n,size,root,ans;
void update(int k)
{
tr[k].size=tr[tr[k].l].size+tr[tr[k].r].size+tr[k].w;
}
void rturn(int &k)
{
int t=tr[k].l;tr[k].l=tr[t].r;tr[t].r=k;
tr[t].size=tr[k].size;update(k);k=t;
}
void lturn(int &k)
{
int t=tr[k].r;tr[k].r=tr[t].l;tr[t].l=k;
tr[t].size=tr[k].size;update(k);k=t;
}
void insert(int &k,int x)
{
if(k==0) {
size++;k=size;
tr[k].size=tr[k].w=1;tr[k].v=x;tr[k].rnd=rand();
return ;
}
tr[k].size++;
if(tr[k].v==x) tr[k].w++;
else if(x>tr[k].v) {
insert(tr[k].r,x);
if(tr[tr[k].r].rnd<tr[k].rnd) lturn(k);
}else {
insert(tr[k].l,x);
if(tr[tr[k].l].rnd<tr[k].rnd) rturn(k);
}
}
void del(int &k,int x)
{
if(k==0) return ;
if(tr[k].v==x) {
if(tr[k].w>1) {
tr[k].w--;tr[k].size-- ;return ;
}
if(tr[k].l*tr[k].r==0) k=tr[k].l+tr[k].r;
else if(tr[tr[k].l].rnd<tr[tr[k].r].rnd)
rturn(k),del(k,x);
else lturn(k),del(k,x);
}
else if(x>tr[k].v)
tr[k].size--,del(tr[k].r,x);
else tr[k].size--,del(tr[k].l,x);
}
int query_rank(int k,int x)
{
if(k==0) return 0;
if(tr[k].v==x) return tr[tr[k].l].size+1;
else if(x>tr[k].v)
return tr[tr[k].l].size+tr[k].w+query_rank(tr[k].r,x);
else return query_rank(tr[k].l,x);
}
int query_num(int k,int x)
{
if(k==0) return 0;
if(x<=tr[tr[k].l].size)
return query_num(tr[k].l,x);
else if(x>tr[tr[k].l].size+tr[k].w)
return query_num(tr[k].r,x-tr[tr[k].l].size-tr[k].w);
else return tr[k].v;
}
void query_pro(int k,int x)
{
if(k==0) return ;
if(tr[k].v<x) ans=k,query_pro(tr[k].r,x);
else query_pro(tr[k].l,x);
}
void query_sub(int k,int x)
{
if(k==0) return ;
if(tr[k].v>x) ans=k,query_sub(tr[k].l,x);
else query_sub(tr[k].r,x);
}
int main()
{
scanf("%d",&n);
for(int op,x,i=1;i<=n;i++) {
scanf("%d%d",&op,&x);
switch(op){
case 1:insert(root,x);break;
case 2:del(root,x);break;
case 3:printf("%d\n",query_rank(root,x));break;
case 4:printf("%d\n",query_num(root,x));break;
case 5:ans=0;query_pro(root,x);printf("%d\n",tr[ans].v);break;
case 6:ans=0;query_sub(root,x);printf("%d\n",tr[ans].v);break;
}
}
}
bzoj1588
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fod(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int N=1e5+10,inf=(1<<30);
struct data {
int l,r,v,size,rnd,w;
}tr[N];
int n,size,root,ans,mn,mx;
void update(int k){tr[k].size=tr[tr[k].l].size+tr[tr[k].r].size+tr[k].w;}
void rturn(int &k)
{
int t=tr[k].l;tr[k].l=tr[t].r;tr[t].r=k;
tr[t].size=tr[k].size;update(k);k=t;
}
void lturn(int &k)
{
int t=tr[k].r;tr[k].r=tr[t].l;tr[t].l=k;
tr[t].size=tr[k].size;update(k);k=t;
}
void insert(int &k,int x)
{
if(k==0) {
size++;k=size;
tr[k].size=tr[k].w=1;tr[k].v=x;tr[k].rnd=rand();
return ;
}
tr[k].size++;
if(tr[k].v==x) tr[k].w++;
else if(x>tr[k].v) {
insert(tr[k].r,x);
if(tr[tr[k].r].rnd<tr[k].rnd) lturn(k);
}else {
insert(tr[k].l,x);
if(tr[tr[k].l].rnd<tr[k].rnd) rturn(k);
}
}
void query_pro(int k,int x)
{
if(k==0) return ;
if(tr[k].v==x) {mn=tr[k].v;return ;}
if(tr[k].v<x) mn=tr[k].v,query_pro(tr[k].r,x);
else query_pro(tr[k].l,x);
}
void query_sub(int k,int x)
{
if(k==0) return ;
if(tr[k].v==x) {mx=tr[k].v;return ;}
if(tr[k].v>x) mx=tr[k].v,query_sub(tr[k].l,x);
else query_sub(tr[k].r,x);
}
int main()
{
scanf("%d",&n);
long long ans=0;
for(int i=1,x;i<=n;i++) {
if(scanf("%d",&x)==EOF) x=0;
mx=inf;mn=-inf;
query_pro(root,x);query_sub(root,x);
if(i!=1) ans+=min(x-mn,mx-x);
else ans+=x;
insert(root,x);
}
printf("%lld\n",ans);
return 0;
}