BZOJ3356 : [Usaco2004 Jan]禁闭围栏

首先将坐标离散化,考虑从左往右扫描线

碰到插入操作则插入

碰到删除操作的:

当前包含i的矩形数=y1在[1,y2[i]]之间的矩形数-y2在[1,y1[i]-1]之间的矩形数

用两棵树状数组维护即可,时间复杂度$O(n\log n)$。

#include<cstdio>
#include<algorithm>
#define N 500010
int n,m,i,x1,y1,x2,y2,b[N],bl[N],br[N],now,ans=-1,cnt;
struct P{int x,l,r,t;}a[N];
inline bool cmp(P a,P b){return a.x<b.x;}
inline void addl(int x,int y){for(;x<=m;x+=x&-x)bl[x]+=y;}
inline void addr(int x,int y){for(;x<=m;x+=x&-x)br[x]+=y;}
inline int askl(int x){int t=0;for(;x;x-=x&-x)t+=bl[x];return t;}
inline int askr(int x){int t=0;for(;x;x-=x&-x)t+=br[x];return t;}
inline int lower(int x){
  int l=1,r=m,mid,t;
  while(l<=r)if(b[mid=(l+r)>>1]<=x)l=(t=mid)+1;else r=mid-1;
  return t;
}
inline void read(int&a){char c;while(!(((c=getchar())>=‘0‘)&&(c<=‘9‘)));a=c-‘0‘;while(((c=getchar())>=‘0‘)&&(c<=‘9‘))(a*=10)+=c-‘0‘;}
int main(){
  read(n);
  while(n--){
    read(x1),read(y1),read(x2),read(y2);
    a[++m].x=x1,a[m].l=b[m]=y1,a[m].r=y2,a[m].t=1;
    a[++m].x=x2,a[m].l=y1,a[m].r=b[m]=y2;
  }
  for(std::sort(b+1,b+m+1),std::sort(a+1,a+m+1,cmp),i=1;i<=m;i++){
    a[i].l=lower(a[i].l),a[i].r=lower(a[i].r);
    if(a[i].t)addl(a[i].l,1),addr(a[i].r,1);else{
      now=askl(a[i].r)-askr(a[i].l-1);
      if(now>ans)ans=now,cnt=1;else if(now==ans)cnt++;
      addl(a[i].l,-1),addr(a[i].r,-1);
    }
  }
  return printf("%d %d",ans,cnt),0;
}

  

时间: 2024-08-18 08:16:44

BZOJ3356 : [Usaco2004 Jan]禁闭围栏的相关文章

3359: [Usaco2004 Jan]矩形

3359: [Usaco2004 Jan]矩形 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 8  Solved: 5[Submit][Status][Discuss] Description 给出N个矩形(1≤N≤100)和它的长和宽(不超过1000),写一个程序找出最大的K,使得 有K个矩形满足层层包含的关系,即里层的矩形被所有外层的矩形包含.一个矩形P1包含另一个 矩形P2,则P2的一边小于P1的一边,并且P9的另一边不超过P1的另一边.如

3361: [Usaco2004 Jan]培根距离

3361: [Usaco2004 Jan]培根距离 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 16  Solved: 13[Submit][Status][Discuss] Description 贝茜和其他奶牛联系是通过一连串的中间奶牛传递的,所以当第一头牛和贝茜联系,第二头牛和第一头牛联系,第三头牛和第二头牛联系,…一贝茜就能依次联系到其中的每一头奶牛. 联系长度是指传递过程中涉及的奶牛的数目(不包括贝茜).任何一头奶牛(不包括贝茜)的培

3360: [Usaco2004 Jan]算二十四

3360: [Usaco2004 Jan]算二十四 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 6  Solved: 6[Submit][Status][Discuss] Description 写一个程序,给出D(2≤D≤10)个数字,按原顺序在数字间加+,一,×算出24,且不使用括 号.优先级按正常的优先级处理,即先做乘法后做加减法.输出有多少种不同的方案数. Input 第1行:一个整数D. 第2到D+1行:D个整数,在1到50之间. O

BZOJ 3359: [Usaco2004 Jan]矩形( dp )

数据范围这么小..怎么乱搞都可以吧... 先排序一遍然后O(n²) dp ------------------------------------------------------------------ #include<bits/stdc++.h> using namespace std; const int maxn = 109; struct R { int x, y; inline void Read() { scanf("%d%d", &x, &

BZOJ3355 : [Usaco2004 Jan]有序奶牛

对于一条边x->y,若去掉之后x不能到达y,那么它是必需的. 首先拓扑排序求出拓扑序,然后按照终点拓扑序为第一关键字,起点拓扑序为第二关键字从小到大加边. 对于每个点,维护一个bitset,表示当前从哪些点可以到达自己. 时间复杂度$O(\frac{nm}{32})$. #include<cstdio> #include<bitset> #include<algorithm> using namespace std; typedef pair<int,int

BZOJ 3361 [Usaco2004 Jan]培根距离

SPFA裸题,练手练手~ #include <cstdio> #include <algorithm> #include <cstring> #include <queue> using namespace std; int const maxn = 2*10005; struct node{ int u,v,w,next; node(){} node(int _u,int _v,int _w,int _next){ u = _u; v = _v; w =

[bzoj3360] [Usaco2004 Jan]算二十四

O(3^9)枚举符号.. 成功垫底QAQ...幸好没破坏这题100%的AC率.. 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 using namespace std; 5 int l[11],r[11]; 6 int fh[11],num[11],a[11]; 7 int i,j,k,n,m,ans; 8 9 int ra;char rx; 10 inline int read(){ 11

BZOJ3355

3355: [Usaco2004 Jan]有序奶牛 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 37  Solved: 19[Submit][Status][Discuss] Description 约翰的N(1≤N≤1500)头牛排成一行挤奶时,有确定的顺序.牛被编成连续的号码1..N,他拥有L条关于奶牛顺序的信息,所有的信息都写成"A在B的前面"这样的形式,而且他知道最后一条是多余的.他觉得,有些冗余信息可以由其他信息推出,可以对

[BZOJ] 1614: [Usaco2007 Jan]Telephone Lines架设电话线

1614: [Usaco2007 Jan]Telephone Lines架设电话线 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1806  Solved: 773[Submit][Status][Discuss] Description Farmer John打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用. FJ的农场周围分布着N(1 <= N <= 1,000)根按1..N顺次编号的废