bzoj 3262: 陌上花开

//Twenty
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<vector>
#define mid ((l+r)>>1)
const int maxn=200005;
using namespace std;
int tot,n,k,a[maxn],b[maxn],ans[maxn],sg[maxn];
struct node{
  int a,b,c,d,rk;
}F[maxn],f[maxn];
bool cmp(const node &x,const node&y) {
    return x.a==y.a?(x.b==y.b?x.c<y.c:x.b<y.b):x.a<y.a;
}
bool CMP(const node &x,const node&y) {
    return x.b==y.b?x.c<y.c:x.b<y.b;
}
void add (int x,int v) {
    for(int i=x;i<=k;i+=(i&(-i))) a[i]+=v;
}
int sum(int x) {
    int res=0;
    for(int i=x;i>=1;i-=(i&(-i))) res+=a[i];
    return res;
}
bool chk(node x,node y ) {
    return (x.a==y.a)&&(x.b==y.b)&&(x.c==y.c);
}
void cdq(int l,int r){
  if(l==r) {f[l].rk+=f[l].d-1; return;}
  cdq(l,mid);
  cdq(mid+1,r);
  sort(f+l,f+mid+1,CMP);
  sort(f+mid+1,f+r+1,CMP);
  int now=l;
  for(int i=mid+1;i<=r;f[i].rk+=sum(f[i].c),i++)
   for(int j=now;j<=mid&&f[j].b<=f[i].b;j++,now++)
     add(f[j].c,f[j].d);
  for(int i=l;i<now;i++) add(f[i].c,-f[i].d);
}
int main()
{
   scanf("%d%d",&n,&k);
   for(int i=1;i<=n;i++) {scanf("%d%d%d",&F[i].a,&F[i].b,&F[i].c); F[i].d=1;}
   sort(F+1,F+n+1,cmp);
   for(int i=1;i<=n;i++){
    if(chk(F[i],f[tot])) f[tot].d++;
    else f[++tot]=F[i];
   }
   cdq(1,tot);
   for(int i=1;i<=tot;i++) ans[f[i].rk]+=f[i].d;
   for(int i=0;i<n;i++) printf("%d\n",ans[i]);
   return 0;
}

CDQ分治

时间: 2024-08-04 21:17:17

bzoj 3262: 陌上花开的相关文章

bzoj 3262: 陌上花开 -- CDQ分治

3262: 陌上花开 Time Limit: 20 Sec  Memory Limit: 256 MB Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当且仅当Sa>=Sb,Ca>=Cb,Ma>=Mb.显然,两朵花可能有同样的属性.需要统计出评出每个等级的花的数量. Input 第一行为N,K (1 <= N <= 100,00

BZOJ 3262: 陌上花开 cdq分治 树状数组

https://www.lydsy.com/JudgeOnline/problem.php?id=3262 cdq分治板子题,一维排序,一维分治(cdq里的队列),一维数据结构(树状数组). 学dp优化前来复习--以前好像写过这道题但是没写博客啊--在校oj上写的题都没怎么写博客,追悔莫及 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #

BZOJ 3262: 陌上花开 [CDQ分治 三维偏序]

Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当且仅当Sa>=Sb,Ca>=Cb,Ma>=Mb.显然,两朵花可能有同样的属性.需要统计出评出每个等级的花的数量. Input 第一行为N,K (1 <= N <= 100,000, 1 <= K <= 200,000 ), 分别表示花的数量和最大属性值. 以下N行,每

[BZOJ 3262] 陌上花开 分治

题意 给定三个序列 $S = \left\{ s_1, s_2, ..., s_n \right\}$ , $C = \left\{ c_1, c_2, ..., c_n \right\}$ , $M = \left\{ m_1, m_2, ..., m_n \right\}$ . 对任意 $i$ , 求 $level_i = \sum_{j \ne i, 1 \le j \le n}[s_i \ge s_j][c_i \ge c_j][m_i \ge m_j]$ . 分析 宏观上, 将第一维按

P2433 - 【BZOJ 3262三维偏序】陌上花开------三维偏序

P2433 - [BZOJ 3262三维偏序]陌上花开 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量. 定义一朵花A比另一朵花B要美丽,当且仅当Sa>=Sb,Ca>=Cb,Ma>=Mb.显然,两朵花可能有同样的属性.需要统计出评出每个等级的花的数量. Input 第一行为N,K (1 <= N <= 100,000, 1 <= K <= 200,

【BZOJ 3262】 陌上花开

3262: 陌上花开 Time Limit: 20 Sec Memory Limit: 256 MB Submit: 366 Solved: 163 [Submit][Status][Discuss] Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当且仅当Sa>=Sb,Ca>=Cb,Ma>=Mb.显然,两朵花可能有同样的属性.需要统计出评

陌上花开(bzoj 3262)

Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当且仅当Sa>=Sb,Ca>=Cb,Ma>=Mb.显然,两朵花可能有同样的属性.需要统计出评出每个等级的花的数量. Input 第一行为N,K (1 <= N <= 100,000, 1 <= K <= 200,000 ), 分别表示花的数量和最大属性值. 以下N行,每

BZOJ 3262

转自:http://blog.csdn.net/lwt36/article/details/50625051 我觉得是整体二分+树状数组,存个模板. #include <algorithm> #include <cctype> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <iomanip> #includ

【刷题】BZOJ 3262 [HNOI2008]GT考试

Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字. 他的不吉利数学A1A2...Am(0<=Ai<=9)有M位,不出现是指X1X2...Xn中没有恰好一段等于A1A2...Am. A1和X1可以为0 Input 第一行输入N,M,K.接下来一行输入M位的数. N<=10^9,M<=20,K<=1000 Output 阿申想知道不出现不吉利数字的号码有多少种,输出模K取余的