标签:ch int CF12D getchar Ball maxn include define
用树状数组也能写
Idea
对于女人\(i\),想要知道她自不自杀,无非是有没有女人\(j\),使得\(B_i<B_j\&\&I_i<I_j\&\&R_i<R_j\)。这里用树状数组表示前\(i\)个女人中\(R\)值的最大值写,由于那三个值小于等于\(1e9\),所以必须离散化。相对其中某个量(这里我按\(B\)来排序)升序排序,然后编号,这样生成的树状数组,保证在查询时满足\(getmax(id+1)\)中所有的女人的\(B\)值比当前女人的要大。于是再按\(I\)值降序,这样保证在之后的遍历中,\(lady[i].i\ge lady[i-1].i\),再以\(R\)值更新树状数组
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<string>
#define ll long long
#define maxn 500050
#define inf 2147483647
#define mod 10003
#define eps 1e-6
#define pi acos(-1.0)
#define de(x) ((x)*(x))
using namespace std;
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 c[maxn],cnt,n,ans;
struct Node{
int b,i,r,id;
}a[maxn];
inline void add(int x,int d){
while(x>0){
if(c[x]<d) c[x]=d;
x-=x&(-x);
}
}
inline int getmax(int x){
int res=-1;
for(int i=x;i<=cnt;i+=i&(-i))
if(res<c[i]) res=c[i];
return res;
}
inline bool cmp(Node a,Node b){return a.b<b.b;}
inline bool cmp1(Node a,Node b){return a.i>b.i;}
signed main(){
n=read();
int i,j;
for(i=0;i<n;i++) a[i].b=read();
for(i=0;i<n;i++) a[i].i=read();
for(i=0;i<n;i++) a[i].r=read();
sort(a,a+n,cmp); cnt=1; a[0].id=1;
for(i=1;i<n;i++)
if(a[i].b==a[i-1].b) a[i].id=cnt;
else a[i].id=++cnt;//这个地方不能写成cnt++;原因您们懂得
sort(a,a+n,cmp1);
for(i=1;i<=cnt;i++) c[i]=-1;
for(i=0;i<n;){
for(j=i;j<n&&a[i].i==a[j].i;j++)
if(getmax(a[j].id+1)>a[j].r) ans++;
for(j=i;j<n&&a[i].i==a[j].i;j++)
add(a[j].id,a[j].r);
i=j;
}
printf("%d",ans);
return 0;
}
标签:ch,int,CF12D,getchar,Ball,maxn,include,define 来源: https://www.cnblogs.com/cbyyc/p/11463087.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。