题意:对于两个区间,[si,ei] 和 [sj,ej],若 si <= sj and ei >= ej and ei - si > ej - sj 则说明区间 [si,ei] 比 [sj,ej] 强。对于每个区间,求出比它强的区间的个数。

解题思路:先将每个区间按 e 降序排列,在按 s 升序排列。则对于每个区间而言,比它强的区间的区间一定位于它的前面。 利用数状数组求每个区间[si,ei]前面 满足条件的区间[sj,ej]个数(条件:ej<=ei),再减去前面的和它相同的区间的个数。 也可以利用线段树,下面附上两种代码

代码:


数状数组 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std; int n,MAX,c[400010],r[400010],s[400010],e[400010]; int cmp(const int x,const int y){
if(e[x] > e[y])
return 1;
else if( e[x] == e[y] )
return s[x] <= s[y];
return 0;
} int lowbit(int x){
return x&(-x);
} int sum(int x){
int ret = 0;
while( x > 0){
ret += c[x];
x -= lowbit(x);
}
return ret;
} void add(int x,int d){
while(x <= MAX){
c[x] += d;
x += lowbit(x);
}
} int main(){
int i,j,ans[100010];
while(scanf("%d",&n) == 1 && n){
MAX = 0;
for(i=0;i<n;i++){
scanf("%d%d",&s[i],&e[i]);
s[i] ++;
e[i] ++;
MAX = MAX > s[i] ? MAX : s[i];
}
for(i=0;i<n;i++)
r[i] = i;
sort(r,r+n,cmp);
memset(c,0,sizeof(c));
for(i=0;i<n;i++){
int t = r[i];
ans[t] = sum(s[t]);
add(s[t],1);
for(j=i-1;j>=0;j--)
if(e[r[j]] == e[t] && s[r[j]] == s[t])
ans[t] --;
else
break;
}
for(i=0;i<n-1;i++)
printf("%d ",ans[i]);
printf("%d\n",ans[n-1]);
}
return 0;
} 线段树 #include<iostream>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std; int n,MAX,r[200010],s[200010],e[200010];
struct node{
int l,r;
int value;
}a[800010]; int cmp(const int x,const int y){
if(e[x] > e[y])
return 1;
else if(e[x] == e[y])
return s[x] <= s[y];
return 0;
} void buildtree(int i,int l,int r){
a[i].l = l;
a[i].r = r;
a[i].value = 0;
if( l== r)
return ;
int mid = (l+r) / 2 ;
buildtree(i<<1,l,mid);
buildtree((i<<1) + 1,mid+1,r);
} int query(int i,int l,int r){
//a[i].value ++;
if(a[i].l == l && a[i].r == r)
return a[i].value ;
// a[i].value ++;
int mid = (a[i].l + a[i].r) / 2;
if(r <= mid)
return query(i<<1,l,r);
else if(l > mid)
return query((i<<1) + 1,l,r);
return query(i<<1,l,mid) + query((i<<1) + 1,mid+1,r);
} void update(int i,int num){
a[i].value++ ;
if(a[i].l == a[i].r)
return ;
int mid = (a[i].l + a[i] .r) / 2;
if(num <= mid)
update(i<<1,num);
else
update((i<<1)+1,num);
} int main(){
int i,j,ans[200010];
while(scanf("%d",&n) == 1 && n){
MAX = 0;
for(i=1;i<=n;i++){
scanf("%d%d",&s[i],&e[i]);
s[i] ++ ;
e[i] ++ ;
MAX = max(MAX,e[i]);
}
for(i=1;i<=n;i++)
r[i] = i;
sort(r+1,r+n+1,cmp);
buildtree(1,1,MAX);
for(i=1;i<=n;i++){
int t = r[i];
ans[t] = query(1,1,s[t]);
update(1,s[t]);
for(j=i-1;j>0;j--)
if(s[r[j]] == s[t] && e[r[j]] == e[t])
ans[t] -- ;
else
break;
}
for(i=1;i<n;i++)
printf("%d ",ans[i]);
printf("%d\n",ans[n]);
}
return 0;
}

poj 2481 Cows(数状数组 或 线段树)的更多相关文章

  1. hdu2492 数状数组或者线段树

    题意:      给你一些人,每个人有自己的攻击力,输入的顺序就是每个人的顺序,他们之间互相比赛,两个人比赛的条件是必须在他们两个位置之间找到一个人当裁判,这个裁判的攻击力必须在他们两个人之间,问你最 ...

  2. POJ 1195 Mobile phones (二维树状数组或线段树)

    偶然发现这题还没A掉............速速解决了............. 树状数组和线段树比较下,线段树是在是太冗余了,以后能用树状数组还是尽量用......... #include < ...

  3. st表、树状数组与线段树 笔记与思路整理

    已更新(2/3):st表.树状数组 st表.树状数组与线段树是三种比较高级的数据结构,大多数操作时间复杂度为O(log n),用来处理一些RMQ问题或类似的数列区间处理问题. 一.ST表(Sparse ...

  4. bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1384  Solved: 629[Submit][Stat ...

  5. HDU 5877 2016大连网络赛 Weak Pair(树状数组,线段树,动态开点,启发式合并,可持久化线段树)

    Weak Pair Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Tota ...

  6. bzoj3196 二逼平衡树 树状数组套线段树

    题目传送门 思路:树状数组套线段树模板题. 什么是树状数组套线段树,普通的树状数组每个点都是一个权值,而这里的树状数组每个点都是一颗权值线段树,我们用前缀差分的方法求得每个区间的各种信息, 其实关键就 ...

  7. Codeforces 777E(离散化+dp+树状数组或线段树维护最大值)

    E. Hanoi Factory time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  8. 2019南昌网络赛  I. Yukino With Subinterval 树状数组套线段树

    I. Yukino With Subinterval 题目链接: Problem Descripe Yukino has an array \(a_1, a_2 \cdots a_n\). As a ...

  9. HYSBZ - 3813 奇数国 欧拉函数+树状数组(线段树)

    HYSBZ - 3813奇数国 中文题,巨苟题,巨无敌苟!!首先是关于不相冲数,也就是互质数的处理,欧拉函数是可以求出互质数,但是这里的product非常大,最小都2100000,这是不可能实现的.所 ...

随机推荐

  1. 移动web开发研究

    1.jQuery Mobile jQuery Mobile框架能够帮助你快速开发出支持多种移动设备的Mobile应用用户界面.jQuery Mobile最新版本是1.4.0,默认主题采用扁平化设计风格 ...

  2. JAVA中运用数组的四种排序方法

    JAVA中在运用数组进行排序功能时,一般有四种方法:快速排序法.冒泡法.选择排序法.插入排序法. 快速排序法主要是运用了Arrays中的一个方法Arrays.sort()实现. 冒泡法是运用遍历数组进 ...

  3. Laravel Eloquent ORM

    Eloquent ORM 简介 基本用法 集体赋值 插入.更新.删除 软删除 时间戳 查询范围 关系 查询关系 预先加载 插入相关模型 触发父模型时间戳 与数据透视表工作 集合 访问器和调整器 日期调 ...

  4. Oracle数据库的创建与验证

    创建数据库,输入命令dbca创建数据库 会弹出创建数据库相应的对话框 单击下一步 选择创建一个数据库,并单击下一步 数据库模板选择一般目的的转换过程即可.单击下一步 全局数据库名称和SID名称,要和上 ...

  5. XMLHTTP请求的当前状态

    readyState,此属性只读,状态用长度为4的整型表示.定义如下: 0 (未初始化) 对象已建立,但是尚未初始化(尚未调用open方法) 1 (初始化) 对象已建立,尚未调用send方法 2 (发 ...

  6. HTML基础知识笔记(三)

    HTML下拉列表框 讲解: 1.value: <option value="House Blend">House Blend</option> 2.sele ...

  7. AngularJs练习Demo5

    @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport&quo ...

  8. IP地址基础和子网规划之其一

    IP地址的介绍:在TCP/IP环境中,各种各样的终端.工作站能同服务器.其他工作站无缝连接,是因为每一网络节点都使用了全网范围内能够唯一标识节点的IP地址.每个网络有一个全网唯一的网络号,在该网络中各 ...

  9. 点击推送消息跳转处理(iOS)

    当用户点击收到的推送消息时候,我希望打开APP,并且跳转到对应的界面,这就需要在AppDelegate里面对代理方法进行处理. 当用户点击推送消息打开APP的时候会调用 - (BOOL)applica ...

  10. SpringMVC中用@ParamVariable传递的参数包含斜杠(/)时,匹配不了报404错误的解决方案

    今天做网站[标签]筛选功能时,出现了这么个奇葩的问题. 我是直接通过<a>标签中href来跳转的,url中包含汉字 <a href="/tags/标签A"> ...