Wannafly模拟赛2
题目描述
输入描述:
第一行一个整数n,表示队伍数; 接下来n行,每行三个整数a[i], b[i], c[i],分别表示i在第一场、第二场和第三场比赛中的名次;n 最大不超过200000
输出描述:
输出一个整数表示满足条件的(x,y)数;64bit请用lld
输入
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 = ;
static char buf[BUFSIZE] ;
static char *psta=buf, *pend=buf ;
if (psta >= pend){
psta = buf;
pend = buf + fread(buf,,BUFSIZE,stdin);
if (psta >= pend)
return -;
}
return *psta++;
}
inline void read(int &x)
{
char c;
int ans=;
for(c=getchar(); c<''||c>''; c=getchar());
while(c>=''&&c<='')
ans=(ans<<)+(ans<<)+(c-''),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,,sizeof(b));
}
void update(int x,int v)
{
while(x<=maxn)
{
b[x]+=v;
x+=lowbit(x);
}
}
int query(int x)
{
int ans=;
while(x)
{
ans+=b[x];
x-=lowbit(x);
}
return ans;
}
void clear(int x)
{
while(x<=maxn)
{
b[x]=;
x+=lowbit(x);
}
}
} bit;
void CDQ(int l,int r)
{
if(l==r)
{
p[l].ans+=p[l].cnt-;
return ;
}
int mid=(l+r)>>;
CDQ(l,mid);
CDQ(mid+,r);
sort(p+l,p+mid+,cmpy);
sort(p+mid+,p+r+,cmpy);
int j=l;
for(int i=mid+; 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+,cmpy);
}
int main()
{
read(n);
bit.init();
tot=;
for(int i=; i<=n; i++)
{
read(p[i].x);
read(p[i].y);
read(p[i].z);
p[i].ans=,p[i].id=i;
}
sort(p+,p+n+,cmpx);
for(int i=; i<=n; i++)
{
if(i!=&&p[i-].x==p[i].x&&p[i-].y==p[i].y&&p[i-].z==p[i].z)
p[tot].cnt++;
else p[++tot]=p[i],p[tot].cnt=;
id[p[i].id]=tot;
p[tot].id=tot;
}
CDQ(,tot);
sort(p+,p+tot+,cmpid);
ll ans=1ll*n*(n-)/;
for(int i=; i<=n; i++)
ans-=p[id[i]].ans;
printf("%lld",ans);
return ;
}
为什么要CDQ啊,严重拖慢了时间啊,但是扔到CF上是可以AC的,谁让CF的机器跑的快呢
附上AC代码
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int maxn=;
const int K = ;
struct Point
{
int x,y,z;
bool operator < (const Point& rhs) const {return z<rhs.z;}
}p[maxn];
int n,c[maxn/K+][maxn/K+];
inline int lowbit(int x) {return x&(-x);}
int query2D(int qx,int qy)
{
int ret=;
while(qy)
{
ret+=c[qx][qy];
qy-=lowbit(qy);
}
return ret;
}
int query1D(int qx,int qy)
{
int ret=;
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=;i<n;i++) scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].z);
for(int i=;i<=n;i++) X[i]=n+,Y[i]=n+;
sort(p,p+n);
LL ans=(LL)n*(n-)/2LL;
for(int i=;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-)/K,(p[i].y+K-)/K,);
}
printf("%lld\n",ans);
}
Wannafly模拟赛2的更多相关文章
- Wannafly模拟赛5 A Split 暴力 二分加速
你有一个大小为
- Wannafly模拟赛 A.矩阵(二分答案+hash)
矩阵 时间限制:1秒 空间限制:131072K 题目描述 给出一个n * m的矩阵.让你从中发现一个最大的正方形.使得这样子的正方形在矩阵中出现了至少两次.输出最大正方形的边长. 输入描述: 第一行两 ...
- Wannafly模拟赛
题目描述 给出一个n * m的矩阵.让你从中发现一个最大的正方形.使得这样子的正方形在矩阵中出现了至少两次.输出最大正方形的边长. 输入描述: 第一行两个整数n, m代表矩阵的长和宽: 接下来n行,每 ...
- Wannafly模拟赛3
喜欢想飞啊,毕竟这里的题目还都算挺好的中文题,不过做英文题久了还是感觉英文题更好理解一点 反蝴蝶效应 时间限制:1秒 空间限制:65536K 题目描述 一只南美洲亚马孙河流域热带雨林中的蝴蝶,偶尔扇动 ...
- 牛客网Wannafly模拟赛
A矩阵 时间限制:1秒 空间限制:131072K 题目描述 给出一个n * m的矩阵.让你从中发现一个最大的正方形.使得这样子的正方形在矩阵中出现了至少两次.输出最大正方形的边长. 输入描述: 第一行 ...
- Wannafly模拟赛2 B river(拉格朗日乘数法)
题目 https://www.nowcoder.com/acm/contest/4/B题意 有n条南北流向的河并列排着,水流速度是v,现在你需要从西岸游到东岸,总共T个时间,你的游泳速度是u,问东岸的 ...
- Wannafly模拟赛2 C alliances(dfs序+二分)
题目 https://www.nowcoder.com/acm/contest/4/C 题意 由n个点组成一个树,有m个帮派,每个帮派由一些个点组成,这些点以及它们两两路径上的所有点都属于该帮派的管辖 ...
- Wannafly交流赛1_B_硬币【数学】
Wannafly交流赛1_B_硬币[数学] 链接:https://www.nowcoder.com/acm/contest/69/B 来源:牛客网 题目描述 蜥蜴的生日快到了,就在这个月底! 今年,蜥 ...
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
随机推荐
- Centos离线安装Docker并加入到Swarm管理节点
以root用户登录 加入Swarm前需要在Swarm上生成Token,所以需要提前将Swarm集群搭建完成后,再运行以下命令将各虚机加入到swarm节点 下载docker离线安装包,并拷贝到/root ...
- hihoCoder #1165 : 益智游戏 (挑战赛11 B题)
题意:在一个序列中找到两个数a和b,使得a*b的因子个数最多,输出最多的因子个数. 思路:数据较多,处理会很慢.对序列中每个数字进行质数分解求因子个数,然后按照因子个数降序排列,对前50个因子最多的数 ...
- UWP开发:自动生成迷宫&自动寻路算法(2)
之后我们编写一个类,同时创建一个List,将List与前端的Rectangle绑定. public static List<Rect> Rects { get; set; }Rects = ...
- Harvest of Apples
问题 B: Harvest of Apples 时间限制: 1 Sec 内存限制: 128 MB提交: 18 解决: 11[提交] [状态] [讨论版] [命题人:admin] 题目描述 Ther ...
- VC-基础:vs2010快捷键
F12: 转到所调用过程或变量的定义 CTRL + SHIFT + B生成解决方案 CTRL + F7 生成编译 CTRL + O 打开文件 CTRL + SHIFT + O打开项目 CTRL + S ...
- JDK的安装以及环境变量的配置
一.JDK的安装 1.百度搜索jdk1.8 2.进入网页选择Downloads 3. 选择电脑的版本(x86 32位 x64 64位) 4.下载好后,直接双击即可,一直下一步即可完成安装 二.环境变量 ...
- 抓取oracle建表语句及获取建表ddl语句
抓取oracle建表语句及获取建表ddl语句 1.抓取代码如下: 1.1.产生表的语法资料 DECLARE-- v_notPartTable VARCHAR2(1000):= '&2'; -- ...
- 03_10_Object类的toString equals等方法
03_10_Object类的toString equals等方法 1. toString方法 Object类中定义有public String toString()方法,其返回值是String类型,描 ...
- OpenCV3.42+VS2017配置+模块计算机类型“X86”与目标计算机类型“x64”冲突”的问题解决
目录 OpenCV3.42+VS2017配置 Visual Studio 2017 第三方依赖设置,附加依赖项和附加库目录 "fatal error LNK1112: 模块计算机类型&quo ...
- [LUOGU] P3952 时间复杂度
其实,也没那么难写 这种模拟题,仔细分析一下输入格式,分析可能的情况,把思路写在纸上,逐步求精,注意代码实现 主要思路就是算一个时间复杂度,和给出的复杂度比较,这就先设计一个函数把给出的复杂度由字符串 ...