程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> BZOJ 3262 陌上花開 CDQ分治

BZOJ 3262 陌上花開 CDQ分治

編輯:C++入門知識

BZOJ 3262 陌上花開 CDQ分治


題目大意:給定一堆花,每個花有三個屬性,定義一朵花比另一朵花美麗當期僅當三個值都大於等於另一朵花 定義花的評級為沒有它美麗的花的數量 求評級為0~N-1的花的數量

CDQ分治的題,之前在HZWER神犇的博客裡見到過,就寫了寫,今天BZ活了想去交才發現原來是只有會員才知道的世界。。。還好學校的大神有BZ的會員,借號交了下,半天過不去,最後發現原來我CDQ分治寫腦殘了。。。。媽媽再也不用擔心我的學習了。。。

第一維排序,第二維CDQ分治,第三維樹狀數組,這題就切了

注意當兩朵花的三個屬性均相同兩朵花互相比對方美麗 這個時候需要把這兩朵花合並在一起處理 我這裡還寫掛了0.0 傷不起啊

#include
#include
#include
#include
#define M 100100
using namespace std;
struct abcd{
	int x,y,z;
	int cnt,ans;
}a[M],na[M];
bool operator < (const abcd &x,const abcd &y)
{
	if(x.x==y.x)
	{
		if(x.y==y.y)
			return x.z>1;
	if(l==r)
	{
		a[mid].ans+=a[mid].cnt-1;
		return ;
	}
	int l1=l,l2=mid+1;
	for(i=l;i<=r;i++)
	{
		if(a[i].x<=mid)
			na[l1++]=a[i];
		else
			na[l2++]=a[i];
	}
	memcpy( a+l , na+l , sizeof(a[0])*(r-l+1) );
	CDQ(l,mid);
	j=l;++T;
	for(i=mid+1;i<=r;i++)
	{
		for(;j<=mid&&a[j].y<=a[i].y;j++)
			update(a[j].z,a[j].cnt);
		a[i].ans+=getans(a[i].z);
	}
	CDQ(mid+1,r);
	l1=l;l2=mid+1;
	for(i=l;i<=r;i++)
	{
		if( ( cmp(a[l1],a[l2]) || l2>r ) && l1<=mid )
			na[i]=a[l1++];
		else
			na[i]=a[l2++];
	}
	memcpy( a+l , na+l , sizeof(a[0])*(r-l+1) );
}
int main()
{
	int i;
	cin>>n>>m;
	for(i=1;i<=n;i++)
		scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z),a[i].cnt++;
	sort(a+1,a+n+1);
	for(i=1;i<=n;i++)
	{
		if( i==1 || a[i-1]

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved