4 1 1 1 2 1 1 1 2 1 1 1 1 1 1 1 1
4 4 4 0
题目大意:
给你二组线段A,B 询问A组中每一个线段包含了多少B组线段
将A,B按左端点排序;
那么当B前面线段若不满足当前A了 ,就可以废弃不用了,即B.x<A[now].x。
所以未被删除的B线段都是满足了左端点,现在只需要求是否满足右端点即可。
用线段树来维护B的右端点。若B一条废弃不用,更新线段树即可。每次查询【0-A[now].y】有多少元素即可
nlogn的复杂度。
最后还要按序号排序回来,因为要按输入顺序输出,代码如下:
#include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <ctime> #include <algorithm> #include <iostream> #include <sstream> #include <string> #define oo 0x13131313 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 using namespace std; const int maxn=100000+5; struct node { int x,y,num,ans; }A[maxn],B[maxn]; int n; int tree[maxn<<2]; bool cmp(node a,node b) { return a.x<b.x; } bool cmp1(node a,node b) { return a.num<b.num; } void pushup(int rt) { tree[rt]=tree[rt<<1]+tree[rt<<1|1]; } int build(int l,int r,int rt) { if(l==r) {tree[rt]=0;return 0;} int m=(l+r)>>1; build(lson); build(rson); pushup(rt); } int updata(int p,int k,int l,int r,int rt)//单点更新 { int m; if(l==r) {tree[rt]+=k;return 0;} m=(l+r)>>1; if(p<=m) updata(p,k,lson); else updata(p,k,rson); pushup(rt); } int query(int L,int R,int l,int r,int rt) { int temp=0,m; if(L<=l&&r<=R) return tree[rt]; m=(l+r)>>1; if(L<=m) temp=temp+query(L,R,lson); if(R>m) temp=temp+query(L,R,rson); return temp; } void input() { for(int i=0;i<n;++i) {scanf("%d",&A[i].x);A[i].num=i;} for(int i=0;i<n;++i) scanf("%d",&A[i].y); for(int i=0;i<n;++i) scanf("%d",&B[i].x); for(int i=0;i<n;++i) scanf("%d",&B[i].y); for(int i=0;i<n;++i) if(A[i].x>A[i].y) swap(A[i].x,A[i].y); for(int i=0;i<n;++i) if(B[i].x>B[i].y) swap(B[i].x,B[i].y); sort(B,B+n,cmp); sort(A,A+n,cmp); } void solve() { int tot=0; for(int i=0;i<n;i++) { updata(B[i].y,1,1,maxn-1,1); } for(int i=0;i<n;i++) { int ans=0; while(B[tot].x<A[i].x&&tot<n) { updata(B[tot].y,-1,1,maxn-1,1); tot++; } ans=query(1,A[i].y,1,maxn-1,1); A[i].ans=ans; } sort(A,A+n,cmp1); for(int i=0;i<n;i++) printf("%d\n",A[i].ans); } void init() { freopen("a.in","r",stdin); freopen("a.out","w",stdout); } int main() { // init(); while(scanf("%d",&n)!=EOF) { input(); build(1,maxn-1,1); solve(); } }