Contest
时间限制:1秒 空间限制:131072K

题目描述

n支队伍一共参加了三场比赛。
一支队伍x认为自己比另一支队伍y强当且仅当x在至少一场比赛中比y的排名高。
求有多少组(x,y),使得x自己觉得比y强,y自己也觉得比x强。
(x, y), (y, x)算一组。

输入描述:

第一行一个整数n,表示队伍数; 接下来n行,每行三个整数a[i], b[i], c[i],分别表示i在第一场、第二场和第三场比赛中的名次;n 最大不超过200000

输出描述:

输出一个整数表示满足条件的(x,y)数;64bit请用lld
示例1

输入

4
1 3 1
2 2 4
4 1 2
3 4 3

输出

5

求三维偏序对,在二维的基础上可以进行,这个可以BIT+CDQ啊,但是超时妥妥的

超时代码

#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
#define maxn 200002
typedef long long ll;
int T,n,tot,id[maxn];
inline char _getchar()
{static const int BUFSIZE = 100001 ;static char  buf[BUFSIZE] ;static char  *psta=buf, *pend=buf ;if (psta >= pend){psta = buf;pend = buf + fread(buf,1,BUFSIZE,stdin);if (psta >= pend)return -1;}return *psta++;
}
inline void read(int &x)
{char c;int ans=0;for(c=getchar(); c<'0'||c>'9'; c=getchar());while(c>='0'&&c<='9')ans=(ans<<1)+(ans<<3)+(c-'0'),c=getchar();x=ans;
}
struct node
{int x,y,z,cnt,ans,id;
} p[maxn];
int cmpx(node a,node b)
{if(a.x!=b.x)return a.x<b.x;if(a.y!=b.y)return a.y<b.y;return a.z<b.z;
}
int cmpy(node a,node b)
{if(a.y!=b.y)return a.y<b.y;return a.z<b.z;
}
int cmpid(node a,node b)
{return a.id<b.id;
}
struct BIT
{
#define lowbit(x) (x&(-x))int b[maxn];void init(){memset(b,0,sizeof(b));}void update(int x,int v){while(x<=maxn){b[x]+=v;x+=lowbit(x);}}int query(int x){int ans=0;while(x){ans+=b[x];x-=lowbit(x);}return ans;}void clear(int x){while(x<=maxn){b[x]=0;x+=lowbit(x);}}
} bit;
void CDQ(int l,int r)
{if(l==r){p[l].ans+=p[l].cnt-1;return ;}int mid=(l+r)>>1;CDQ(l,mid);CDQ(mid+1,r);sort(p+l,p+mid+1,cmpy);sort(p+mid+1,p+r+1,cmpy);int j=l;for(int i=mid+1; i<=r; i++){for(; j<=mid&&p[j].y<=p[i].y; j++)bit.update(p[j].z,p[j].cnt);p[i].ans+=bit.query(p[i].z);}for(int i=l; i<j; i++)bit.update(p[i].z,-p[i].cnt);sort(p+l,p+r+1,cmpy);
}
int main()
{read(n);bit.init();tot=0;for(int i=1; i<=n; i++){read(p[i].x);read(p[i].y);read(p[i].z);p[i].ans=0,p[i].id=i;}sort(p+1,p+n+1,cmpx);for(int i=1; i<=n; i++){if(i!=1&&p[i-1].x==p[i].x&&p[i-1].y==p[i].y&&p[i-1].z==p[i].z)p[tot].cnt++;else p[++tot]=p[i],p[tot].cnt=1;id[p[i].id]=tot;p[tot].id=tot;}CDQ(1,tot);sort(p+1,p+tot+1,cmpid);ll ans=1ll*n*(n-1)/2;for(int i=1; i<=n; i++)ans-=p[id[i]].ans;printf("%lld",ans);return 0;
}

为什么要CDQ啊,严重拖慢了时间啊,但是扔到CF上是可以AC的,谁让CF的机器跑的快呢

附上AC代码

#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int maxn=200005;
const int K = 450;
struct Point
{int x,y,z;bool operator < (const Point& rhs) const {return z<rhs.z;}
}p[maxn];
int n,c[maxn/K+5][maxn/K+5];
inline int lowbit(int x) {return x&(-x);}
int query2D(int qx,int qy)
{int ret=0;while(qy){ret+=c[qx][qy];qy-=lowbit(qy);}return ret;
}
int query1D(int qx,int qy)
{int ret=0;while(qx){ret+=query2D(qx,qy);qx-=lowbit(qx);}return ret;
}
void modify2D(int px,int py,int v)
{while(py<=(n/K)){c[px][py]+=v;py+=lowbit(py);}
}
void modify1D(int px,int py,int v)
{while(px<=(n/K)){modify2D(px,py,v);px+=lowbit(px);}
}
int X[maxn],Y[maxn];
int main()
{scanf("%d",&n);for(int i=0;i<n;i++) scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].z);for(int i=0;i<=n;i++) X[i]=n+1,Y[i]=n+1;sort(p,p+n);LL ans=(LL)n*(n-1)/2LL;for(int i=0;i<n;i++){ans-=query1D(p[i].x/K,p[i].y/K);for(int j=p[i].x;j>p[i].x-(p[i].x%K);j--) if(Y[j]<p[i].y) ans--;for(int j=p[i].y;j>p[i].y-(p[i].y%K);j--) if(X[j]<=p[i].x-(p[i].x%K)) ans--;X[p[i].y]=p[i].x,Y[p[i].x]=p[i].y;modify1D((p[i].x+K-1)/K,(p[i].y+K-1)/K,1);}printf("%lld\n",ans);
}

转载于:https://www.cnblogs.com/BobHuang/p/7528788.html

Wannafly模拟赛2相关推荐

  1. 牛客网Wannafly模拟赛

    A矩阵 时间限制:1秒 空间限制:131072K 题目描述 给出一个n * m的矩阵.让你从中发现一个最大的正方形.使得这样子的正方形在矩阵中出现了至少两次.输出最大正方形的边长. 输入描述: 第一行 ...

  2. Wannafly模拟赛2: A. Contest(Cdq分治)

    题目描述 n支队伍一共参加了三场比赛. 一支队伍x认为自己比另一支队伍y强当且仅当x在至少一场比赛中比y的排名高. 求有多少组(x,y),使得x自己觉得比y强,y自己也觉得比x强. (x, y), ( ...

  3. Wannafly模拟赛3-B 贝伦卡斯泰露(DFS)

    题目链接:https://www.nowcoder.com/acm/contest/13/B 题解:枚举两个序列的起点,直接爆搜即可. #include<set> #include< ...

  4. Wannafly交流赛1_B_硬币【数学】

    Wannafly交流赛1_B_硬币[数学] 链接:https://www.nowcoder.com/acm/contest/69/B 来源:牛客网 题目描述 蜥蜴的生日快到了,就在这个月底! 今年,蜥 ...

  5. NOI.AC NOIP模拟赛 第六场 游记

    NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...

  6. 2017.6.11 校内模拟赛

    题面及数据及std(有本人的也有原来的) :2017.6.11 校内模拟赛 T1 自己在纸上模拟一下后就会发现 可以用栈来搞一搞事情 受了上次zsq 讲的双栈排序的启发.. 具体就是将原盘子大小cop ...

  7. 2020年蓝桥杯模拟赛2020.3.25直播笔记

    2020年蓝桥杯模拟赛解题报告(CPP版本) 第八题 长草的bfs写法[我想暴力模拟O kmn] 深搜会爆 bfs像投到水里的涟漪 问题: const int dx[] = {1, 0, -1, 0} ...

  8. 2021年 第12届 蓝桥杯 第4次模拟赛真题详解及小结【Java版】

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...

  9. 2021年 第12届 蓝桥杯 第3次模拟赛真题详解及小结【Java版】

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...

最新文章

  1. 还是自己写的东西比较放心
  2. c语言常用术语,保证让你大开眼界
  3. redis-rdb-tools来解析分析reids dump文件及内存使用量
  4. Gartner的预言:通向混合IT之旅
  5. 【转】Linux设备驱动之I/O端口与I/O内存
  6. 【Python】Tanimoto相似度算法实现
  7. 用java编写数组最小公倍数_[求助]Java编的求最小公倍数的程序,老是不对。。。调试了无数次了,请达人指教。。...
  8. 编写一个班级管理程序java_java课程设计(班级管理系统)
  9. 如何安装pygame模块
  10. 思维导图软件哪个好?不要错过这份思维导图软件合集
  11. DSPE;CAS:1069-79-0 ;二硬脂酰基磷脂酰乙醇胺;功能化磷脂
  12. 扫码挪车小程序源码专业版上线了
  13. 服务器主机性能,服务器主机性能分析
  14. python3 file_Python3-file
  15. 我在国企做软件开发这4年。。
  16. 课后自主练习(排序)1027. 极坐标排序 easy《编程思维与实践》个人学习笔记
  17. 虚拟机(VMware Workstation或Hyper-V)装ghost版系统提示“ntldr is missing Press Ctrl+Alt+del to Resta
  18. i9 12900hk参数 i9 12900HK功耗
  19. 【ROS】将odom里程计数据转换为path路径消息
  20. nodejs爬虫爬取 喜马拉雅FM 指定主播歌单并下载

热门文章

  1. 养鸡农场小程序游戏京东拼多多优惠券附近商家流量主购物源码-修复登录接口
  2. 超多趣味测评测试微信小程序源码 可插入流量主广告位 无后台
  3. WordPress病毒杂志主题King V6.5 英文Nulled版
  4. 数据库知识 | 关系型数据库与非关系型数据库小记录
  5. jquery:字符串转json对象,json对象转字符串
  6. swagger 扫描java文档_推荐一款在运行时通过javadoc生成Swagger API文档的库
  7. PHP手机壳DIY定制平台源码 Thinkphp内核开发
  8. 精细篇Java8强大的stream API接口大全(代码优雅之道)
  9. 品牌不可不知的YouTube的影片行销策略
  10. LZW算法PHP实现方法 lzw_decompress php