poj 2481 Cows(数状数组 或 线段树)
题意:对于两个区间,[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(数状数组 或 线段树)的更多相关文章
- hdu2492 数状数组或者线段树
题意: 给你一些人,每个人有自己的攻击力,输入的顺序就是每个人的顺序,他们之间互相比赛,两个人比赛的条件是必须在他们两个位置之间找到一个人当裁判,这个裁判的攻击力必须在他们两个人之间,问你最 ...
- POJ 1195 Mobile phones (二维树状数组或线段树)
偶然发现这题还没A掉............速速解决了............. 树状数组和线段树比较下,线段树是在是太冗余了,以后能用树状数组还是尽量用......... #include < ...
- st表、树状数组与线段树 笔记与思路整理
已更新(2/3):st表.树状数组 st表.树状数组与线段树是三种比较高级的数据结构,大多数操作时间复杂度为O(log n),用来处理一些RMQ问题或类似的数列区间处理问题. 一.ST表(Sparse ...
- bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1384 Solved: 629[Submit][Stat ...
- HDU 5877 2016大连网络赛 Weak Pair(树状数组,线段树,动态开点,启发式合并,可持久化线段树)
Weak Pair Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Tota ...
- bzoj3196 二逼平衡树 树状数组套线段树
题目传送门 思路:树状数组套线段树模板题. 什么是树状数组套线段树,普通的树状数组每个点都是一个权值,而这里的树状数组每个点都是一颗权值线段树,我们用前缀差分的方法求得每个区间的各种信息, 其实关键就 ...
- Codeforces 777E(离散化+dp+树状数组或线段树维护最大值)
E. Hanoi Factory time limit per test 1 second memory limit per test 256 megabytes input standard inp ...
- 2019南昌网络赛 I. Yukino With Subinterval 树状数组套线段树
I. Yukino With Subinterval 题目链接: Problem Descripe Yukino has an array \(a_1, a_2 \cdots a_n\). As a ...
- HYSBZ - 3813 奇数国 欧拉函数+树状数组(线段树)
HYSBZ - 3813奇数国 中文题,巨苟题,巨无敌苟!!首先是关于不相冲数,也就是互质数的处理,欧拉函数是可以求出互质数,但是这里的product非常大,最小都2100000,这是不可能实现的.所 ...
随机推荐
- 简单拨号器(Android)
感受: 1.了解了intent中的action和Uri. 2.了解了向下一个活动传递数据. 3.了解了内容提供器. 4.了解自定义适配器. 4.其实T9拨号器和简单计算器原理一样.
- 什么是 docker?
关于 Docker 是什么,有个著名的隐喻:集装箱.但是它却起了个“码头工人”( docker 的英文翻译)的名字.这无疑给使用者很多暗示:“快来用吧!用了 Docker ,就像世界出现了集装箱,这样 ...
- linux文件系统学习
linux系统支持很多种文件系统. 1. 如何确认当前系统挂载了哪些文件系统? 使用mount命令可以查看当前系统上已经挂载了哪些文件系统, sh-# mount rootfs on / type r ...
- javascript笔记2之数据类型
/* var box; alert(typeof box); //box是Undefined类型,值是undefined,类型返回的字符串是undefined var box = true; aler ...
- 关于ionic传值
今天,也是偶然发现有的初学者对ionic的传值还不太清除,这里我说明一下 例如你想在这个页面传递参数a.b过去,传递到"tab.wait"页面 $state.go("ta ...
- 总结下java经常犯的错误
编写代码是一种艺术,认识错误是我们代码改进的重要途径之一.以下情况并非大家都能碰到过,但希望提高代码质量的人都引以为戒.以下各种情况,都是初学者经常犯的错误. 1.1 字符串没有判断是否为 ...
- HDU 4588 Count The Carries 计算二进制进位总数
点击打开链接 Count The Carries Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65535/32768 K (Java ...
- iOS 8 Auto Layout界面自动布局系列5-自身内容尺寸约束、修改约束、布局动画
首先感谢众多网友的支持,最近我实在是事情太多,所以没有写太多.不过看到大家的反馈和评价,我还是要坚持挤出时间给大家分享我的经验.如果你对我写的东西有任何建议.意见或者疑问,请到我的CSDN博客留言: ...
- Filter过滤器实现登录检查
主要利用filter过滤掉未经登录而直接跳转到非登录访问页面.代码而言的话并不难,只是有几点问题需要注意一下. 1.使用filter需要配置web.xml,如果是/*那么在拦截后的页面会连带jsp页面 ...
- Qt 图形特效(Graphics Effect)介绍
原文链接:Qt 图形特效(Graphics Effect)介绍 QGraphicsEffect也是Qt-4.6引入的一个新功能.它让给图形元素QGraphicsItem增加更佳视觉效果的编程变得非常简 ...