码迷,mamicode.com
首页 > 其他好文 > 详细

luogu CF12D Ball |樹狀數組

时间:2020-04-13 12:23:37      阅读:49      评论:0      收藏:0      [点我收藏+]

标签:getchar   大小   sort   lse   题意   其它   iostream   cout   pre   

题意翻译

有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 |樹狀數組

标签:getchar   大小   sort   lse   题意   其它   iostream   cout   pre   

原文地址:https://www.cnblogs.com/naruto-mzx/p/12690336.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!