好题
从右往左扫 我们在线段树上维护 fyf_y
ff的含义

  • 如果下方是栅栏 那么fyf_y就是(x,y)(x,y)的答案

    • 否则 fyf_y 是 (x,y)(x,y) 比 (x,y+1)(x,y+1)多出来的答案
    • 本质是一个查分 查询一头牛的答案就是往下累加 ff 直到碰到栅栏

      那么碰到牛就查询 碰到花就加一 关键是碰到栅栏(xl,xr,yl,yr)(x_l,x_r,y_l,y_r)
      在xrx_r处 [yl,yr][y_l,y_r]清空 yl−1y_l-1处要加上yly_l的答案 同时记录下yr+1y_r+1的答案
      在xl−1x_l-1处 [yl,yr][y_l,y_r]清空 同时yl−1y_l-1要减去在xrx_r时记录的yr+1y_r+1的答案 防止没有了栅栏的阻挡重复计算

      #include<cstdio>
      #include<cstdlib>
      #include<algorithm>
      #include<set>
      using namespace std;inline char nc(){static char buf[100000],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
      }
      inline void read(int &x){char c=nc(),b=1;for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;
      }const int M=1000005;int m=1000000;
      int T[M<<2],F[M<<2];inline void modify(int x,int l,int r,int ql,int qr){if (ql<=l && r<=qr){T[x]=0; F[x]=1;return;}if (F[x]) T[x<<1]=T[x<<1|1]=0,F[x<<1]=F[x<<1|1]=1,F[x]=0;int mid=(l+r)>>1;if (ql<=mid) modify(x<<1,l,mid,ql,qr);if (qr>mid) modify(x<<1|1,mid+1,r,ql,qr);T[x]=T[x<<1]+T[x<<1|1];
      }
      inline void add(int x,int l,int r,int t,int a){if (l==r)return void(T[x]+=a);if (F[x]) T[x<<1]=T[x<<1|1]=0,F[x<<1]=F[x<<1|1]=1,F[x]=0;int mid=(l+r)>>1;if (t<=mid) add(x<<1,l,mid,t,a);else add(x<<1|1,mid+1,r,t,a);T[x]=T[x<<1]+T[x<<1|1];
      }
      inline int query(int x,int l,int r,int ql,int qr){if (ql<=l && r<=qr)return T[x];if (F[x]) T[x<<1]=T[x<<1|1]=0,F[x<<1]=F[x<<1|1]=1,F[x]=0;int ret=0,mid=(l+r)>>1;if (ql<=mid) ret+=query(x<<1,l,mid,ql,qr);if (qr>mid) ret+=query(x<<1|1,mid+1,r,ql,qr);return ret;
      }const int N=200005;struct event{int f,x,y,y2,idx; // f : 1 left 2 right 3 flower 4 cowevent(int f=0,int x=0,int y=0,int y2=0,int idx=0):f(f),x(x),y(y),y2(y2),idx(idx) { }bool operator < (const event &B) const{return x==B.x?(!(f<=2 && B.f<=2)?f<B.f:y<B.y):x>B.x;}
      }ev[N<<2];
      int tot;set<int> fen;
      int tmp[N];
      int ans[N];inline int Ans(int y){int y2=*fen.lower_bound(y);return query(1,1,m,y,min(y2,m));
      }int main(){int n,x,y,x2,y2;freopen("t.in","r",stdin);freopen("t.out","w",stdout);read(n);for (int i=1;i<=n;i++){read(x); read(y); read(x2); read(y2); swap(x,y); swap(x2,y2);ev[++tot]=event(1,x-1,y,y2,i);ev[++tot]=event(2,x2,y,y2,i);}read(n);for (int i=1;i<=n;i++){read(x); read(y); swap(x,y);ev[++tot]=event(3,x,y,0,i);}read(n);for (int i=1;i<=n;i++){read(x); read(y); swap(x,y);ev[++tot]=event(4,x,y,0,i);}sort(ev+1,ev+tot+1); fen.insert(m+1);for (int i=1;i<=tot;i++)if (ev[i].f==1){modify(1,1,m,ev[i].y,ev[i].y2);if (ev[i].y-1) add(1,1,m,ev[i].y-1,-tmp[ev[i].idx]);if (ev[i].y-1) fen.erase(ev[i].y-1);fen.erase(ev[i].y2);}else if (ev[i].f==2){int ret=Ans(ev[i].y);tmp[ev[i].idx]=Ans(ev[i].y2+1);modify(1,1,m,ev[i].y,ev[i].y2);if (ev[i].y-1) add(1,1,m,ev[i].y-1,ret);if (ev[i].y-1) fen.insert(ev[i].y-1);fen.insert(ev[i].y2);}else if (ev[i].f==3)add(1,1,m,ev[i].y,1);elseans[ev[i].idx]=Ans(ev[i].y);for (int i=1;i<=n;i++)printf("%d\n",ans[i]);return 0;
      }
      

[扫描线 线段树] BZOJ 4422 [Cerc2015]Cow Confinement相关推荐

  1. Bzoj 4422: [Cerc2015]Cow Confinement(线段树+扫描线)

    以下内容来自ShallWe's Blog 题目 题目链接 4422: [Cerc2015]Cow Confinement Description 一个10^6行10^6列的网格图,上面有一些牛.花和一 ...

  2. 【HDU5091】Beam Cannon,扫描线+线段树

    传送门 思路: 扫描线的经典问题 然而并不是很会做-- 对x坐标差分一下(例如(x,y)类型为1,(x+w,y)的类型就是-1,以便于之后扫描可以去除该点),然后对y坐标转化为正数(便于操作为线段树上 ...

  3. 【BZOJ3958】[WF2011]Mummy Madness 二分+扫描线+线段树

    [BZOJ3958][WF2011]Mummy Madness Description 在2011年ACM-ICPC World Finals上的一次游览中,你碰到了一个埃及古墓. 不幸的是,你打开了 ...

  4. 扫描线+线段树简介 AcWing 248窗内的星星题解

    ----出自南昌理工学院ACM集训队 这周学习了线段树和扫描线的解题方法,下面由小菜鸡简介一下: 一般扫描线的题目最简单的便是扫描线裸模板(一般来说的话:数据范围小),其次的话便是进行拓展成线段树+扫 ...

  5. BZOJ4422[Cerc2015]Cow Confinement(扫描线+线段树)

    很容易发现一个O(n2)DP,f[i][j]=f[i][j+1]+f[i+1][j]-f[i+1][j+1].然后由于有栅栏,一些位置没办法走,然后就可以用类似差分的方法,f[i]表示当前行f[i+1 ...

  6. [BZOJ4422][Cerc2015]Cow Confinement(扫描线+线段树)

    === === 这里放传送门 === === 题解 记得这题很久以前学长出过胡策..然后当时没做出来..然后照着题解打了一发然后怎么调怎么WA然后就弃了..当时的题解好像是用差分什么的?基本思路是对每 ...

  7. POJ 1177 Picture [离散化+扫描线+线段树]

    http://poj.org/problem?id=1177 给若干矩形,求被覆盖的区域的周长. 将 y 坐标离散化后,按 x 坐标进行扫描.用线段树维护两个东西,当前竖线的叠加长度 len 和 条数 ...

  8. hdu 4419 Colourful Rectangle (离散化扫描线线段树)

    Problem - 4419 题意不难,红绿蓝三种颜色覆盖在平面上,不同颜色的区域相交会产生新的颜色,求每一种颜色的面积大小. 比较明显,这题要从矩形面积并的方向出发.如果做过矩形面积并的题,用线段树 ...

  9. [矩形并-扫描线-线段树]Picture

    最近在补数学和几何,没啥好写的,因为已经决定每天至少写一篇了,今天随便拿个题水水. 题目大意:给你N个边平行于坐标轴的矩形,求它们并的周长.(N<=5000) 思路:这个数据范围瞎暴力就过了,但 ...

最新文章

  1. 阿里云MaxCompute(大数据)公开数据集---带你玩转人工智能
  2. 在Ubuntu服务器上使用python3+selenium模块
  3. 04_Java面向对象特征之继承与多态
  4. php的异常详解,php5异常处理详解_php
  5. 刷新器-Java EE 7后端十大功能
  6. 第一百五十三期: 云迁移可能失败的5种方式以及成功的5种方式
  7. 1:1 人脸比对 开源_打破5个神话:在高等教育中使用开源
  8. 用unity制作能量护盾(1)
  9. ORACLE10g中 ora-12638:身份证明检索失败(
  10. 小D课堂 - 新版本微服务springcloud+Docker教程_1_02技术选型
  11. 不得不看的黑客工具集
  12. 吉他入门教程之吉他音阶训练——运用方法
  13. 【树形DP+DFS】Gym 100962J - Jimi Hendrix
  14. 三阶魔方7步还原法-一共只需记6个公式
  15. java创建短信平台_Java通过SMS短信平台实现发短信功能
  16. 大数据就业前景分析-好程序员
  17. Codeforces Round #657 (Div. 2) B. Dubious Cyrpto(思维,数学)
  18. 安装ROS2 humble 和 cartographer
  19. 361度与国棉联盟达成战略合作;开利宣布收购空调企业广东积微集团;大陆集团与地平线成立智能驾驶合资公司 | 美通企业周刊...
  20. Windows平台七牛批量上传工具使用教程

热门文章

  1. Qunar 是如何解决 IDC 网络故障自愈问题的
  2. 智能快速电子体温计方案设计
  3. 保险业务与系统——LOMA 290 保险公司运营——第十二讲——理赔管理
  4. 广角镜头的标定、畸变校正和基于ROS的实时视频输出
  5. canon selphy cp900网络连接参数修改,实现无线路由转接
  6. 虚拟机booting from hard disk_类虚拟机软件是什么?它的优势在哪里?
  7. 工业建模和游戏建模有什么区别?哪个发展前景更好?
  8. JavaScript页面刷新的方法
  9. 第四届立创电子设计大赛开幕!
  10. hutool 获取某月最后一天_huTool--工具类常用方法