luogu CF12D Ball |樹狀數組

Posted naruto-mzx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luogu CF12D Ball |樹狀數組相关的知识,希望对你有一定的参考价值。

题意翻译

有N个女士去参加舞会。每个女士有三个值a[i],b[i],c[i]。如果一位女士发现有其它女士的这三个值都比自己高的话就会去跳楼.求有多少跳楼的女士。

读入:第一行为(N),第二行为每个人的(B_i)?值,第三行为每个人的(I_i)?值,第四行为每个人的(R_i)?值。 输出:一个整数,代表问题的答案

数据范围: 1?≤?N?≤?500000 0<=a[i],b[i],c[i]<=10^9


其實不用三位偏尋

把其中一個當下標,再用其中一個排序

就可以一口氣查兩個量的大小關系

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int mod=998244353,N=5e5+10;
#define int long long
inline int read(){
    int x=0,f=1; char ch=getchar();
    while(!isdigit(ch)) {if(ch==‘-‘)f=-1;ch=getchar();}
    while(isdigit(ch)) {x=x*10+ch-48;ch=getchar();}
    return x*f;
}
int n;
struct node{
	int w,a,b,c;
}e[N];
inline bool cmp1(node t1,node t2){
	return t1.w<t2.w;
}
inline bool cmp2(node t1,node t2){
	return t1.b>t2.b;
}
int c[N];

inline void add(int x,int y){
	for(;x;x-=x&(-x))c[x]=max(y,c[x]);
}

inline int getmax(int x){
	int res=0;
	for(;x<=n;x+=x&(-x))res=max(res,c[x]);
	return res;
}

signed main(){
	n=read();
	for(int i=1;i<=n;i++)e[i].w=read();
	for(int i=1;i<=n;i++)e[i].b=read();
	for(int i=1;i<=n;i++)e[i].c=read();
	sort(e+1,e+1+n,cmp1);
	int cnt=0;
	for(int i=1;i<=n;i++)
	if(e[i].w==e[i-1].w)e[i].a=cnt;
	else e[i].a=++cnt;
	
	sort(e+1,e+1+n,cmp2);
	int ans=0,j;
	for(int i=1;i<=n;){
		for(j=i;j<=n&&e[i].b==e[j].b;j++)
		if(getmax(e[j].a+1)>e[j].c)ans++;
		for(j=i;j<=n&&e[i].b==e[j].b;j++)
		add(e[j].a,e[j].c);
		i=j;
	}
	cout<<ans<<endl;
}

以上是关于luogu CF12D Ball |樹狀數組的主要内容,如果未能解决你的问题,请参考以下文章

codeforces 12D Ball

Ball CodeForces - 12D

[2019CSP-S赛前训练][CF894E] Ralph and Mushrooms

js 添加二維數組

JS數組

[Luogu] CF888E Maximum Subsequence