zoukankan      html  css  js  c++  java
  • bzoj1935 [Shoi2007]Tree 园丁的烦恼

    Description

    很久很久以前,在遥远的大陆上有一个美丽的国家。统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草。有一天国王漫步在花园里,若有所思,他问一个园丁道: “最近我在思索一个问题,如果我们把花坛摆成六个六角形,那么……” “那么本质上它是一个深度优先搜索,陛下”,园丁深深地向国王鞠了一躬。 “嗯……我听说有一种怪物叫九头蛇,它非常贪吃苹果树……” “是的,显然这是一道经典的动态规划题,早在N元4002年我们就已经发现了其中的奥秘了,陛下”。 “该死的,你究竟是什么来头?” “陛下息怒,干我们的这行经常莫名其妙地被问到和OI有关的题目,我也是为了预防万一啊!” 王者的尊严受到了伤害,这是不可容忍的。看来一般的难题是难不倒这位园丁的,国王最后打算用车轮战来消耗他的实力: “年轻人,在我的花园里的每一棵树可以用一个整数坐标来表示,一会儿,我的骑士们会来轮番询问你某一个矩阵内有多少树,如果你不能立即答对,你就准备走人吧!”说完,国王气呼呼地先走了。 这下轮到园丁傻眼了,他没有准备过这样的问题。所幸的是,作为“全国园丁保护联盟”的会长——你,可以成为他的最后一根救命稻草。

    Input

    第一行有两个整数n,m(0≤n≤500000,1≤m≤500000)。n代表皇家花园的树木的总数,m代表骑士们询问的次数。 文件接下来的n行,每行都有两个整数xi,yi,代表第i棵树的坐标(0≤xi,yi≤10000000)。 文件的最后m行,每行都有四个整数aj,bj,cj,dj,表示第j次询问,其中所问的矩形以(aj,bj)为左下坐标,以(cj,dj)为右上坐标。

    Output

    共输出m行,每行一个整数,即回答国王以(aj,bj)和(cj,dj)为界的矩形里有多少棵树。

    Sample Input

    3 1
    0 0
    0 1
    1 0
    0 0 1 1

    Sample Output

    3
     
    有点蛋疼……原来以为是二维树状数组裸题,结果发现会爆
    把修改和询问按x坐标从小到大排序,把y坐标离散然后变成一维树状数组才能做
    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cstdlib>
    #define LL long long
    #define N 1000010
    using namespace std;
    struct que{int x,y,rnk,opr;}q[5*N];
    inline bool operator <(const que &a,const que &b){return a.x<b.x||a.x==b.x&&a.opr<b.opr;}
    int n,m,cnt,cnt2;
    int x[N],y[N],a[N],b[N],c[N],d[N];
    int dat[3*N];
    int ans[N][5];
    int C[3*N];
    inline LL read()
    {
        LL x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    inline int bsearch(int x)
    {
    	int l=1,r=cnt;
    	while (l<=r)
    	{
    		int mid=(l+r)>>1;
    		if (x==dat[mid])return mid;
    		if (x>dat[mid]){l=mid+1;}
    		else r=mid-1;
    	}
    	
    }
    inline int lowbit(int x){return x&(-x);}
    inline int add(int x,int d)
    {
    	for (int i=x;i<=cnt;i+=lowbit(i))
    	  C[i]+=d;
    }
    inline int ask(int x)
    {
    	int sum=0;
    	for (int i=x;i;i-=lowbit(i))
    	  sum+=C[i];
    	return sum;
    }
    int main()
    {
    	n=read();m=read();
    	for(int i=1;i<=n;i++)
    	  {
    	  	x[i]=read();y[i]=read();
    	  	dat[++cnt]=y[i];
    	  }
    	for (int i=1;i<=m;i++)
    	{
    		a[i]=read();b[i]=read();c[i]=read();d[i]=read();
    		dat[++cnt]=b[i];dat[++cnt]=d[i];
    	}
    	sort(dat+1,dat+cnt+1);
    	for (int i=1;i<=n;i++)
    	{
    		y[i]=bsearch(y[i]);
    		q[++cnt2].x=x[i];q[cnt2].y=y[i];
    	}
    	for (int i=1;i<=m;i++)
    	{
    		b[i]=bsearch(b[i]);d[i]=bsearch(d[i]);
    		q[++cnt2].x=c[i];q[cnt2].y=d[i];q[cnt2].rnk=i;q[cnt2].opr=1;
    		q[++cnt2].x=a[i]-1;q[cnt2].y=d[i];q[cnt2].rnk=i;q[cnt2].opr=2;
    		q[++cnt2].x=c[i];q[cnt2].y=b[i]-1;q[cnt2].rnk=i;q[cnt2].opr=3;
    		q[++cnt2].x=a[i]-1;q[cnt2].y=b[i]-1;q[cnt2].rnk=i;q[cnt2].opr=4;
    	}
    	sort(q+1,q+cnt2+1);
    	for (int i=1;i<=cnt2;i++)
    	{
    		if (q[i].opr)ans[q[i].rnk][q[i].opr]=ask(q[i].y);
    		else add(q[i].y,1);
    	}
    	for (int i=1;i<=m;i++)
    	  printf("%d
    ",ans[i][1]+ans[i][4]-ans[i][2]-ans[i][3]);
    }
    

      

    ——by zhber,转载请注明来源
  • 相关阅读:
    fzuoj Problem 2177 ytaaa
    zoj The 12th Zhejiang Provincial Collegiate Programming Contest Capture the Flag
    zoj The 12th Zhejiang Provincial Collegiate Programming Contest Team Formation
    zoj The 12th Zhejiang Provincial Collegiate Programming Contest Beauty of Array
    zoj The 12th Zhejiang Provincial Collegiate Programming Contest Lunch Time
    zoj The 12th Zhejiang Provincial Collegiate Programming Contest Convert QWERTY to Dvorak
    zoj The 12th Zhejiang Provincial Collegiate Programming Contest May Day Holiday
    zoj The 12th Zhejiang Provincial Collegiate Programming Contest Demacia of the Ancients
    zjuoj The 12th Zhejiang Provincial Collegiate Programming Contest Ace of Aces
    csuoj 1335: 高桥和低桥
  • 原文地址:https://www.cnblogs.com/zhber/p/4139089.html
Copyright © 2011-2022 走看看