poj2481(线段树单点更新)
来源:互联网 发布:崔恺 知乎 编辑:程序博客网 时间:2024/05/17 15:38
Cows
Farmer John’s cows have discovered that the clover growing along the ridge of the hill (which we can think of as a one-dimensional number line) in his field is particularly good.
Farmer John has N cows (we number the cows from 1 to N). Each of Farmer John’s N cows has a range of clover that she particularly likes (these ranges might overlap). The ranges are defined by a closed interval [S,E].
But some cows are strong and some are weak. Given two cows: cow i and cow j, their favourite clover range is [Si, Ei] and [Sj, Ej]. If Si <= Sj and Ej <= Ei and Ei - Si > Ej - Sj, we say that cow i is stronger than cow j.
For each cow, how many cows are stronger than her? Farmer John needs your help!
Input
The input contains multiple test cases.
For each test case, the first line is an integer N (1 <= N <= 10 5), which is the number of cows. Then come N lines, the i-th of which contains two integers: S and E(0 <= S < E <= 10 5) specifying the start end location respectively of a range preferred by some cow. Locations are given as distance from the start of the ridge.
The end of the input contains a single 0.
Output
For each test case, output one line containing n space-separated integers, the i-th of which specifying the number of cows that are stronger than cow i.
Sample Input
3
1 2
0 3
3 4
0
Sample Output
1 0 0
题意:给出n个区间的范围,求每一个区间是多少区间的真子集
思路:先对S从升序排序,如果S相等则对G进行降序排序,然后循环一遍查询再插入。这样只要统计当前区间的G到n范围里有多少其他区间的G,即得到答案。因为经过排序后node[i].s>=node[i-x].s;
#include <iostream>#include <fstream>#include <cstdio>#include <cstring>#include <queue>#include <stack>#include <vector>#include <map>#include <cmath>#include <algorithm>#include <functional>#define inf 0X3f3f3f3fusing namespace std;typedef long long ll;const int MAXN=1e9+10;const int MAX=100000+10;int n;struct COW{ int s,g,id;}cow[MAX];struct NODE{ int l,r,sum;}tree[MAX*4];int cmp(COW a,COW b){ if(a.s!=b.s) return a.s<b.s; else return a.g>b.g;}int ans[MAX];void init(int node,int l,int r){ tree[node].l=l; tree[node].r=r; tree[node].sum=0; if(l==r) return ; int mid=(l+r)>>1; init(node<<1,l,mid); init(node<<1|1,mid+1,r);}void updata_node(int node,int flag){ tree[node].sum++; int l=tree[node].l; int r=tree[node].r; if(l==r) return; int mid=(l+r)>>1; if(flag<=mid) updata_node(node<<1,flag); else updata_node(node<<1|1,flag);}int query(int node,int x,int y){ int temp=0; int l=tree[node].l; int r=tree[node].r; if(x<=l&&r<=y) return tree[node].sum; int mid=(l+r)>>1; if(x<=mid) temp+=query(node<<1,x,y); if(y>mid) temp+=query(node<<1|1,x,y); return temp;}int main(){ #ifdef ONLINE_JUDGE #else freopen("in.txt","r",stdin); #endif while(cin>>n){ memset(ans,0,sizeof(ans)); if(n==0) break; for(int i=1;i<=n;i++){ scanf("%d%d",&cow[i].s,&cow[i].g); cow[i].s++;cow[i].g++; cow[i].id=i; } sort(cow+1,cow+n+1,cmp); init(1,1,n); for(int i=1;i<=n;i++){ if(i!=1&&cow[i].s==cow[i-1].s&&cow[i].g==cow[i-1].g) ans[cow[i].id]=ans[cow[i-1].id]; else{ ans[cow[i].id]=query(1,cow[i].g,n); } cout<<query(1,cow[i].g,n)<<endl; updata_node(1,cow[i].g); } for(int i=1;i<=n;i++){ if(i==1) cout<<ans[i]; else cout<<" "<<ans[i]; } cout<<endl; } return 0;}
- poj2481(线段树单点更新)
- poj2481之线段树单点更新
- POJ2481:Cows(线段树单点更新)
- poj2481 cows(线段树单点更新)
- poj2481(单点更新)
- 线段树 单点更新
- 线段树单点更新
- 线段树 单点更新
- 单点更新线段树
- 线段树单点更新
- 线段树单点更新
- 线段树 单点更新
- 线段树 单点更新
- 线段树单点更新
- 线段树 单点更新
- 单点更新线段树
- 线段树单点更新
- 线段树,单点更新
- 变量的七大属性
- Python学习(五)——切片
- Java循环结构
- nyoj 791 Color the fence
- Traincascade Error: Bad argument (Can not get new positive sample. The most possible reason is insuf
- poj2481(线段树单点更新)
- 三角形的制作
- Sass
- 17.Scala中包、类、对象、成员、伴生类、伴生对象访问权限实战彻底详解
- HDU5816(状压DP,位运算的一些技巧)
- 状态模式
- 【HttpClient4.5中文教程】【第一章 :基础】1.3 HttpClient执行上下文
- CSS变量(css variable)
- react-router 路由匹配