POJ 2188线段树求逆序对
2024-08-25 10:44:57
题目给的输入是大坑,算法倒是很简单……
输入的是绳子的编号wire ID,而不是上(或下)挂钩对应下(或上)挂钩的编号。 所以要转换编号,转换成挂钩的顺序,然后再求逆序数。
知道了这个以后直接乱搞就可以0msAC
(这题可以用冒泡排序过的……) (n<=1000)
// by SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,tree[6666],ans=0;
struct Node
{
int x,y;
}point[1005],node[1005];
bool cmp(Node a,Node b)
{
return a.x<b.x;
}
int query(int l,int r,int pos,int W)
{
if(l>=W)return tree[pos];
int mid=(l+r)>>1;
if(mid<W)return query(mid+1,r,pos<<1|1,W);
else return query(l,mid,pos<<1,W)+query(mid+1,r,pos<<1|1,W);
}
void insert(int l,int r,int pos,int W)
{
if(l==r){tree[pos]++;return;}
int mid=(l+r)>>1;
if(mid>=W)insert(l,mid,pos<<1,W);
else insert(mid+1,r,pos<<1|1,W);
tree[pos]=tree[pos<<1]+tree[pos<<1|1];
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&point[i].x,&point[i].y);
}
for(int i=1;i<=n;i++)
{
node[point[i].x].x=i;
node[point[i].y].y=i;
}
sort(node+1,node+1+n,cmp);
for(int i=1;i<=n;i++)
{
ans+=query(1,n,1,node[i].y);
insert(1,n,1,node[i].y);
}
printf("%d\n",ans);
}
最新文章
- [No000078]Python3 字符串操作
- easyui datagride 两种查询方式
- Android学习笔记——ListView
- [Effective JavaScript 笔记]第33条:使构造函数与new操作符无关
- HTML5 测验记录
- Unicode转为UTF8
- oracle timestamp的转换
- UVA 10375 Choose and divide
- POJ2728 最小比率生成树/0-1分数规划/二分/迭代(迭代不会)
- CentOS 7上的性能监控工具
- SQL优化 MySQL版 -分析explain SQL执行计划与Extra
- javascript 常用方法 解析URL,补充前导字符
- SQLAlchemy 嵌套事务的解决方案
- 实现html页面自动刷新的几种方式
- 每日linux命令学习-xargs命令
- Mysql存储过程(六)——存储过程中使用临时表
- html-prepend
- Python- requests详解
- 如何修改antd中表格的表头样式和奇偶行颜色交替
- C中的空宏定义,即只有一个参数