首页 > 其他分享 >HDU5126 stars题解

HDU5126 stars题解

时间:2023-02-07 20:45:25浏览次数:69  
标签:ch return int 题解 mid HDU5126 stars include

HDU5126

Description

\(T\) 组数据,给一个空的三维空间,\(Q\) 次操作,分为插入一个点和查询某个立方体内点的个数。

\(T \le 10,Q \le 5 \times 10^4\)

Sol

题目没说强制在线那先离线下来再说。

然后可以娴熟的把询问操作用差分变成八个子问题。

然后就会发现这是个偏序问题,每一个点有四个属性(三维坐标,插入时间)。对于一个询问,对它的答案有贡献的点是三维坐标均小于它本身且比它早插入的点。

于是四维偏序套三层CDQ分治就好了。当然两层CDQ加树状数组也行但是要注意离散化。

时间复杂度 \(\mathrm{O}(n \log^3 n)\)。

调了两天,累死咯。

Hint

  • 数组开八倍。
  • 多测不清空,爆零两行泪。

Code

#include<cstdio>
#include<algorithm>
#include<cstring>
using std::sort;
const int M=5e4+5;
inline int read(){int x(0),op(0);char ch=getchar();while(ch<'0'||ch>'9')op|=(ch==45),ch=getchar();while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();return op?-x:x;}
inline int ssread(){int x;scanf("%d",&x);return x;}
#ifndef ONLINE_JUDGE
#define read ssread
#endif
struct node{
	int a,b,c,d,t;
}a[M<<3],b[M<<3],c[M<<3],tmp[M<<3];
bool cmpa(node x,node y){return x.a!=y.a?x.a<y.a:x.t<y.t;}
bool cmpb(node x,node y){return x.b!=y.b?x.b<y.b:x.t<y.t;}
bool cmpc(node x,node y){return x.c!=y.c?x.c<y.c:x.t<y.t;}
int Ans[M<<4],n,m,qt;
void solve3(int l,int r){
	if(l>=r)return;
	int mid=l+r>>1;
	solve3(l,mid);solve3(mid+1,r);
	int i=l,p=l;
	for(int j=mid+1,cnt=0;j<=r;){
		while(i<=mid&&c[i].d<=c[j].d){
			if(!c[i].t)cnt++;
			tmp[p++]=c[i++];
		}
		if(c[j].t)Ans[c[j].t]+=cnt;
		tmp[p++]=c[j++];
	}
	while(i<=mid)tmp[p++]=c[i++];
	for(i=l;i<=r;++i)c[i]=tmp[i];
}
void solve2(int l,int r){
	if(l>=r)return;
	int mid=l+r>>1,n=0;
	solve2(l,mid);solve2(mid+1,r);
	for(int i=l;i<=mid;++i)if(!b[i].t)c[++n]=b[i];
	for(int i=mid+1;i<=r;++i)if(b[i].t)c[++n]=b[i];
	sort(c+1,c+n+1,cmpc);
	solve3(1,n);
}
void solve1(int l,int r){
	if(l>=r)return;
	int mid=l+r>>1,n=0;
	solve1(l,mid);solve1(mid+1,r);
	for(int i=l;i<=mid;++i)if(!a[i].t)b[++n]=a[i];
	for(int i=mid+1;i<=r;++i)if(a[i].t)b[++n]=a[i];
	sort(b+1,b+n+1,cmpb);
	solve2(1,n);
}
void addp(int x,int y,int z,int w,int t){
	a[++n]=(node){x,y,z,w,t};
}
void work(){
	m=read();n=0;qt=0;
	memset(Ans,0,sizeof(Ans));
	for(int i=1,x[2],y[2],z[2];i<=m;++i){
        int op=read();x[1]=read(),y[1]=read(),z[1]=read();
        if(op==1)addp(x[1],y[1],z[1],i,0);
        else{
            qt++;
            x[0]=read(),y[0]=read(),z[0]=read();
            x[1]--;y[1]--;z[1]--;
            for(int k=0;k<8;++k)addp(x[bool(k&1)],y[bool(k&2)],z[bool(k&4)],i,qt+M*k);
        }
    }
	sort(a+1,a+n+1,cmpa);
	solve1(1,n);
	for(int i=1;i<=qt;++i){
        int ans=0;
        for(int j=0;j<8;++j)ans+=(__builtin_popcount(j)&1?-1:1)*Ans[j*M+i];
        printf("%d\n",ans);
    }
}
int main(){
	int T=read();
	while(T--)work();
	return 0;
}

标签:ch,return,int,题解,mid,HDU5126,stars,include
From: https://www.cnblogs.com/pokefunc/p/17099750.html

相关文章

  • CF1333F Kate and imperfection 题解 线性筛
    题目链接:http://codeforces.com/problemset/problem/1333/F题目大意:kate有一个集合S,S中的元素是1到n的整数她认为集合S的一个子集M的集合的不完美值等于\(\max_{a,b\in......
  • 树形背包 hdu1011Starship Troopers
    StarshipTroopersTimeLimit:10000/5000MS(Java/Others)    MemoryLimit:65536/32768K(Java/Others)TotalSubmission(s):23205    AcceptedSubmission(......
  • 消息队列的延时以及过期失效,消息队列消息积压及占满问题解决思路
    大量消息在mq里积压了几个小时了还没解决几千万条数据在MQ里积压了七八个小时,从下午4点多,积压到了晚上11点多。这个是我们真实遇到过的一个场景,确实是线上故障了......
  • CF1787I Treasure Hunt 题解
    题目链接题意描述:定义一个序列的权值为一段前缀与一段子段,满足要么前缀与子段不交,要么完全包含的和的最大值,给定一个序列\(a\),求\(a\)的所有子区间的权值和\(n\le1......
  • Django关于站点管理Admin Site的常见问题解决方法
    1.改变django默认语言的方法?仅需添加’django.middleware.locale.LocaleMiddlewar’到MIDDLEWARE_CLASSES设置中,并确保它在’django.contrib.sessions.middleware.Session......
  • Android 软键盘弹出时布局内指定内容上移实现及问题解决
    AndroidSDK目前提供的软键盘弹出模式接口只有两种:一是弹出时自动回冲界面,将所有元素上顶,一种则是不重绘界面,直接将控件元素遮住,没有其他模式,如果......
  • CF1137F Matches Are Not a Child's Play 题解
    以最后被删去的点为根,这样子不会存在从父亲然后删掉某个点,儿子的删除顺序一定比父亲前。记每个点子树中的最大值为\(f_x\),那么一个点的排名,首先就需要加上\(<f_x\)的所......
  • robotframe环境搭建及问题解决
     1.安装pipinstallrobotframeworkipinstallrobotframework-ride进入C:\Python37\Scripts目录下,右击ride.py,选择使用python打开。出现RIDE界面表示RIDE安装成功。......
  • ABC288 EFG 题解
    E注意到后面选对前面的答案没有影响,而且前面选的顺序对后面的影响是连续的一段(如选2个,那么对应的\(c\)就应该是\(c[i-2..i]\)(对应\(i\)是1、2、3个选时的答案))然......
  • P3215 [HNOI2011]括号修复题解
    发现题解里的维护前后缀最大最小值的做法都是感性理解,所以我就来写个证明。将(看做\(-1\),)看做\(1\),首先几个变量:\(n\)代表括号序列的长度。\(a_i\)代表前缀和......