链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3262
题意:中文题。
分析:题目已经给出花的等级条件,我们只要求出有多少朵花小于它,等于的我们之后讨论,我们按照条件排好序,这时排序就已经处理了s,
我问cdq时对[1,k]进行分治,mid=(l+r)>>1,对于m<=mid的都是对m>mid的有贡献,这个贡献用树状数组求(c),然后我们将这个区间按
m<=mid,m>mid,挪动。
代码:
#include <algorithm> #include <iostream> #include <iostream> #include <cstring> #include <cstdio> #include <string> #include <vector> #include <queue> #include <cmath> #include <stack> #include <set> #include <map> #include <ctime> #define INF 0x3f3f3f3f #define Mn 200010 #define Mm 200010 #define mod 1000000007 #define CLR(a,b) memset((a),(b),sizeof((a))) #define CPY(a,b) memcpy ((a), (b), sizeof((a))) #pragma comment(linker, "/STACK:102400000,102400000") #define ul (u<<1) #define ur (u<<1)|1 using namespace std; typedef long long ll; struct node { int s,c,m,id; node(){} node(int s,int c,int m,int id):s(s),c(c),m(m),id(id){} bool operator <(const node a) const { if(s!=a.s) return s<a.s; if(c!=a.c) return c<a.c; if(m!=a.m) return m<a.m; return id<a.id; } bool check(node a) { return a.s==s&&a.c==c&&a.m==m; } }q[Mn],tmp[Mn]; int n,k; int bit[Mn]; int lowbit(int x) {return x&(-x);} void push(int x,int val) { if(!x) return ; while(x<=k) { bit[x]+=val; x+=lowbit(x); } } int sum(int x) { int re=0; while(x>0) { re+=bit[x]; x-=lowbit(x); } return re; } int ans[Mn]; void cdq(int l,int r,int s,int t) { if(s>=t) return ; if(l==r) { for(int i=s;i<=t;i++) ans[q[i].id]+=sum(q[i].c),push(q[i].c,1); for(int i=s;i<=t;i++) push(q[i].c,-1); return ; } int mid=(l+r)>>1; for(int i=s;i<=t;i++) if(q[i].m<=mid) { push(q[i].c,1); } else ans[q[i].id]+=sum(q[i].c); int now=s; for(int i=s;i<=t;i++) if(q[i].m<=mid) { push(q[i].c,-1); tmp[now++]=q[i]; } int nowt=now-1; for(int i=s;i<=t;i++) if(q[i].m>mid) tmp[now++]=q[i]; for(int i=s;i<=t;i++) q[i]=tmp[i]; //cout<<nowt<<endl; cdq(l,mid,s,nowt); cdq(mid+1,r,nowt+1,t); } int rank[Mn],b[Mn]; int main() { scanf("%d%d",&n,&k); int s,c,m; for(int i=1;i<=n;i++) { scanf("%d%d%d",&s,&c,&m); q[i]=node(s,c,m,i); } sort(q+1,q+n+1); for(int i=n;i>=1;i--) { if(q[i].check(q[i+1])) { b[i]=b[i+1]+1; ans[q[i].id]+=b[i]; } } cdq(1,k,1,n); for(int i=1;i<=n;i++) { rank[ans[i]]++; } for(int i=0;i<n;i++) { printf("%d\n",rank[i]); } return 0; }