【BZOJ1935/4822】[Shoi2007]Tree 园丁的烦恼/[Cqoi2017]老C的任务 树状数组

题意:两道题差不多,都是给你一堆平面上的点,每个点有权值,然后m次询问求某一矩形区域内的点权和

题解:先离散化,然后将询问拆成左右两条线段,然后将点和这些线段一起按x坐标排序,在y轴上维护树状数组。然后询问的答案就是两条线段上点权和之差

BZOJ1935:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int s[1000010];
struct QUERY
{
    int qx,ql,qr,org,k;
}q[1000010];
struct tree
{
    int px,py;
}p[500010];
int n,m,nm;
int ans[500010];
int rd()
{
    int ret=0;  char gc=getchar();
    while(gc<‘0‘||gc>‘9‘) gc=getchar();
    while(gc>=‘0‘&&gc<=‘9‘)   ret=ret*10+gc-‘0‘,gc=getchar();
    return ret;
}
bool cmp1(tree a,tree b)
{
    return a.px<b.px;
}
bool cmp2(QUERY a,QUERY b)
{
    return a.qx<b.qx;
}
void updata(int x)
{
    for(int i=x;i<=nm;i+=i&-i)   s[i]++;
}
int query(int x)
{
    int i,ret=0;
    for(i=x;i;i-=i&-i)  ret+=s[i];
    return ret;
}
int main()
{
    n=rd(),m=rd();
    int i,j;
    for(i=1;i<=n;i++)    p[i].px=rd(),p[i].py=rd()+1;
    for(i=1;i<=m;i++)
        q[i*2-1].qx=rd()-1,q[i*2-1].ql=q[i*2].ql=rd(),q[i*2].qx=rd(),q[i*2-1].qr=q[i*2].qr=rd()+1,
        q[i*2-1].org=q[i*2].org=i,q[i*2-1].k=-1,q[i*2].k=1,nm=max(nm,q[i*2].qr);
    sort(p+1,p+n+1,cmp1);
    sort(q+1,q+2*m+1,cmp2);
    for(i=j=1;i<=2*m;i++)
    {
        for(;j<=n&&p[j].px<=q[i].qx;j++)  updata(p[j].py);
        ans[q[i].org]+=q[i].k*(query(q[i].qr)-query(q[i].ql));
    }
    for(i=1;i<=m;i++)    printf("%d\n",ans[i]);
    return 0;
}

BZOJ4822

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
struct QUERY
{
    int qx,ql,qr,org,k;
}q[200010];
struct tree
{
    int px,py;
    ll pow;
}p[100010];
int n,m,nm;
ll ans[100010],s[400010];
struct node
{
    int num,org,k;
}v[500010];
int rd()
{
    int ret=0,f=1;  char gc=getchar();
    while(gc<‘0‘||gc>‘9‘){if(gc==‘-‘)f=-f;    gc=getchar();}
    while(gc>=‘0‘&&gc<=‘9‘)   ret=ret*10+gc-‘0‘,gc=getchar();
    return ret*f;
}
bool cmp(node a,node b)
{
    return a.num<b.num;
}
bool cmp1(tree a,tree b)
{
    return a.px<b.px;
}
bool cmp2(QUERY a,QUERY b)
{
    return a.qx<b.qx;
}
void updata(int x,ll val)
{
    for(int i=x;i<=nm;i+=i&-i)   s[i]+=val;
}
ll query(int x)
{
    int i;
    ll ret=0;
    for(i=x;i;i-=i&-i)  ret+=s[i];
    return ret;
}
int main()
{
    n=rd(),m=rd();
    int i,j;
    for(i=1;i<=n;i++)    p[i].px=rd(),v[i].num=rd(),p[i].pow=rd(),v[i].org=i,v[i].k=1;
    for(i=1;i<=m;i++)    q[i*2-1].qx=rd()-1,v[i*2-1+n].num=rd()-1,q[i*2].qx=rd(),v[i*2+n].num=rd(),
        q[i*2-1].org=q[i*2].org=i,q[i*2-1].k=-1,q[i*2].k=1,v[i*2-1+n].org=v[i*2+n].org=i,
        v[i*2-1+n].k=2,v[i*2+n].k=3;
    sort(v+1,v+n+2*m+1,cmp);
    for(i=1;i<=n+2*m;i++)
    {
        if(v[i].num>v[i-1].num||i==1)    nm++;
        if(v[i].k==1)   p[v[i].org].py=nm;
        if(v[i].k==2)   q[2*v[i].org-1].ql=q[2*v[i].org].ql=nm;
        if(v[i].k==3)   q[2*v[i].org-1].qr=q[2*v[i].org].qr=nm;
    }
    sort(p+1,p+n+1,cmp1);
    sort(q+1,q+2*m+1,cmp2);
    for(i=j=1;i<=2*m;i++)
    {
        for(;j<=n&&p[j].px<=q[i].qx;j++)  updata(p[j].py,p[j].pow);
        ans[q[i].org]+=(ll)q[i].k*(query(q[i].qr)-query(q[i].ql));
    }
    for(i=1;i<=m;i++)    printf("%lld\n",ans[i]);
    return 0;
}
时间: 2024-10-26 02:23:30

【BZOJ1935/4822】[Shoi2007]Tree 园丁的烦恼/[Cqoi2017]老C的任务 树状数组的相关文章

BZOJ1935: [Shoi2007]Tree 园丁的烦恼

1935: [Shoi2007]Tree 园丁的烦恼 Description 很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草.有一天国王漫步在花园里,若有所思,他问一个园丁道: "最近我在思索一个问题,如果我们把花坛摆成六个六角形,那么--" "那么本质上它是一个深度优先搜索,陛下",园丁深深地向国王鞠了一躬. "嗯--我听说有一种怪物叫九头蛇,它非常贪吃苹果树--" &

bzoj1382 1935: [Shoi2007]Tree 园丁的烦恼

1935: [Shoi2007]Tree 园丁的烦恼 Time Limit: 15 Sec  Memory Limit: 357 MBSubmit: 1261  Solved: 578[Submit][Status][Discuss] Description 很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草.有一天国王漫步在花园里,若有所思,他问一个园丁道: "最近我在思索一个问题,如果我们把花坛摆成六个六角形,那么--&

1935: [Shoi2007]Tree 园丁的烦恼

1935: [Shoi2007]Tree 园丁的烦恼 Time Limit: 15 Sec  Memory Limit: 357 MBSubmit: 648  Solved: 273[Submit][Status][Discuss] Description 很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草.有一天国王漫步在花园里,若有所思,他问一个园丁道: “最近我在思索一个问题,如果我们把花坛摆成六个六角形,那么……”

BZOJ 1935: [Shoi2007]Tree 园丁的烦恼 [树状数组 离线 离散化]

传送门 刚才我还在郁闷网上怎么没人用$CDQ$分治做 突然发现根本没有时间序.... #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int N=3e6+5; inline int read(){ char c=getchar();int x=0,f=1; whi

BZOJ.1935.[SHOI2007]Tree园丁的烦恼(CDQ分治 三维偏序)

题目链接 矩形查询可以拆成四个点的前缀和查询(树套树显然 但是空间不够) 每个操作表示为(t,x,y),t默认有序,对x分治,y用树状数组维护 初始赋值需要靠修改操作实现. //119964kb 4380ms #include <cstdio> #include <cctype> #include <algorithm> #define gc() getchar() #define lb(x) (x)&-(x) const int N=5e5+5; int n,

HOJ1867 经理的烦恼【树状数组】

题目链接: http://acm.hit.edu.cn/hoj/problem/view?id=1867 题目大意: 有C家连锁店,编号1~C,有N条指令,每家店初始的商品数目都是M.接下来N行是命令. 命令0:0 x w,连锁店x的商品数量变化为w,w > 0商品数量增加,w < 0商品数量减少. 命令1:1 x y,询问编号区间为[x,y]的连锁店商品为素数的商店有多少家. 思路: 因为区间比较大,所以用树状数组来做.用一个数组Shop[]来存放每家店的商品数目,Tree[] 表示树状数组

区间素数个数 树状数组 HIT 1867 经理的烦恼

http://acm.hit.edu.cn/hoj/problem/view?id=1867 经理的烦恼   Source : HCPC 2005 Spring   Time limit : 2 sec   Memory limit : 32 M Submitted : 2994, Accepted : 686 Jerry是一家公司销售部门的经理.这家公司有很多连锁店,编号为1,2,3,... Jerry每天必须关注每家连锁店的商品数量及其变化,一项很乏味的工作.在连锁店比较少的时候,Jerry

HDU5293(SummerTrainingDay13-B Tree DP + 树状数组 + dfs序)

Tree chain problem Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1798    Accepted Submission(s): 585 Problem Description Coco has a tree, whose vertices are conveniently labeled by 1,2,-,n.The

POJ-3321 Apple Tree 【DFS序+树状数组】

Description There is an apple tree outside of kaka's house. Every autumn, a lot of apples will grow in the tree. Kaka likes apple very much, so he has been carefully nurturing the big apple tree. The tree has N forks which are connected by branches.