什么,扫描线需要线段树?

那我第一个不干啊(其实是不会写)

这里介绍一种裸的扫描线:

我们根据x排序,对于相等的 \(x\) ,将 \(y\) 进入和退出分类讨论,然后全部放进set里面.每次 \(x\) 不相等的时候,答案就是 (现在y覆盖的乘以(现在的x-以前的x))

具体的判断方法:

1.y的判断:

将每个长方形的上方点记做出口,下方点记做入口.用一个set记录在某区间内所有的 \(y\) 值.每次从下往上扫,如果某个y是入口就将 \(sz\) +1,否则就将 \(sz\) -1.如果 \(sz\)==0 的时候就将你整个区间的值加到re里面



如图,每次x变的时候只需要保存中间y的值,然后用移动的x乘y就好了

注:我保存y进入和退出状态的原因就是为了记录中间是否有空位.可以发现,如果中间有空位,那么证明所有进入的点已经退出了,所以那一段不需要加上去(不懂可以画一下图)

  1. long long query_up(){
  2. long long re = 0,prev = -1,sz = 0;
  3. for (multiset<pair<long long,bool> >::iterator i=se.begin();i!=se.end();++i){
  4. pair<long long,bool> now = *i;
  5. if (sz==0) {prev = now.f;sz++;}
  6. else if (now.s) sz++;
  7. else sz--;
  8. if (sz==0) re+=(now.f-prev);//如果现在所以的y都已经出去了,那么答案就是最后一个y的出口-第一个y的入口
  9. }
  10. return re;
  11. }

想到了这点以后这题的难点基本上就解决了.

因为有负数,我将每个数都加上了1e8,这样就可以完全不管负数了

不开long long见祖宗

完整代码:

  1. #include <iostream>
  2. #include <set>
  3. #include <algorithm>
  4. #include <iterator>
  5. #include <utility>
  6. using namespace std;
  7. const long long MAXN = 1e5+5;
  8. #define pp pair<long long,long long>
  9. #define f first
  10. #define s second
  11. long long n,ans = 0;
  12. multiset<pair<long long,bool> > se;
  13. struct Edge{
  14. long long x,y; bool in,in2;
  15. }edge[MAXN*4];
  16. Edge add_edge(long long a, long long b, bool bo,bool bo2){
  17. Edge tmp;
  18. tmp.x = a;
  19. tmp.y = b;
  20. tmp.in = bo;
  21. tmp.in2 = bo2;
  22. return tmp;
  23. }
  24. bool sorted(Edge a, Edge b){
  25. return a.x<b.x;
  26. }
  27. long long query_up(){
  28. long long re = 0,prev = -1,sz = 0;
  29. for (multiset<pair<long long,bool> >::iterator i=se.begin();i!=se.end();++i){
  30. pair<long long,bool> now = *i;
  31. if (sz==0) {prev = now.f;sz++;}
  32. else if (now.s) sz++;
  33. else sz--;
  34. if (sz==0) re+=(now.f-prev);
  35. }
  36. return re;
  37. }
  38. int main(){
  39. cin >> n;
  40. for (long long i=0;i<n;i++){
  41. long long a,b,c,d; cin >> a >>b >> c >> d;
  42. a+=1e8;b+=1e8;c+=1e8;d+=1e8;
  43. edge[4*i] = add_edge(a,b,1,0);
  44. edge[4*i+1] = add_edge(a,d,1,1);
  45. edge[4*i+2] = add_edge(c,b,0,0);
  46. edge[4*i+3] = add_edge(c,d,0,1);
  47. //两种状态,第一种表示x变不变,第二种表示y变不变
  48. }
  49. sort(edge,edge+4*n,sorted);
  50. long long prev = 0;
  51. for (long long i=0;i<4*n;i++){
  52. if (edge[i].x!=prev){//如果x变了
  53. if (se.size()) ans += (edge[i].x-prev)*query_up();
  54. prev = edge[i].x;
  55. }
  56. if (edge[i].in==1) se.insert(make_pair(edge[i].y,edge[i].in2));//如果这点是进入的点,就将y加入set
  57. else se.erase(se.find(make_pair(edge[i].y,edge[i].in2)));
  58. //否则将y扔出set
  59. }
  60. cout << ans;
  61. }

留一组测试数据造福后人

  1. 3
  2. 3 7 7 3
  3. 1 5 5 1
  4. 2 2 7 -2

答案45

题解 P1884 【[USACO12FEB]过度种植(银)Overplanting 】的更多相关文章

  1. 线段树+扫描线【p1884】[Usaco12FEB]过度种植(银)Overplanting …

    Description 在一个笛卡尔平面坐标系里(则X轴向右是正方向,Y轴向上是正方向),有\(N(1<=N<=1000)\)个矩形,第i个矩形的左上角坐标是\((x1, y1)\),右下 ...

  2. 「洛谷1884」「USACO12FEB」过度种植【离散化扫描线】

    题目链接 [洛谷传送门] 题解 矩阵面积的并模板.(请求洛谷加为模板题) 很明显是要离散化的. 我们将矩阵与\(x\)轴平行的两个线段取出来.并且将这两个端点的\(x1\)和\(x2\)进行离散化. ...

  3. 洛谷P1884 [USACO12FEB]Overplanting S (矩形切割)

    一种矩形切割的做法: 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 const in ...

  4. [luogu] P2519 [HAOI2011]problem a (贪心)

    P2519 [HAOI2011]problem a 题目描述 一次考试共有n个人参加,第i个人说:"有ai个人分数比我高,bi个人分数比我低."问最少有几个人没有说真话(可能有相同 ...

  5. usaco 2010年3月银组题解

    usaco银组解题报告 一.石子游戏如果把‘O’当作0,‘X’当做1,则N个洞的每一种状态都可以看做是一个N位二进制数.于是,这个问题就变成了求环绕的N位格雷码.幸运的是,这个结构很容易就能够用一个简 ...

  6. 洛谷 P1821 [USACO07FEB]银牛派对Silver Cow Party 题解

    P1821 [USACO07FEB]银牛派对Silver Cow Party 题目描述 One cow from each of N farms (1 ≤ N ≤ 1000) conveniently ...

  7. 【luogu P1821 [USACO07FEB]银牛派对Silver Cow Party】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1821 反向多存一个图,暴力跑两遍 #include <cstdio> #include < ...

  8. USACO[19-20]Dec银组题解

    1,MooBuzz 这题其实是道数学题. 我们先找找符合要求的数:1,2,4,7,8,11,13,14…… 我们发现再往后找都是这8个数中的一个加15k如:16……19……29…… 找规律发现k=n/ ...

  9. 【题解】Luogu p3047 [USACO12FEB]附近的牛Nearby Cows 树型dp

    题目描述 Farmer John has noticed that his cows often move between nearby fields. Taking this into accoun ...

随机推荐

  1. 控制数据的小数位数 java / js

    //java一般控制格式都是通过 DecimalFormat 来控制的.下边是个例子. import java.text.DecimalFormat; public class ControlBit ...

  2. 08 SSM整合案例(企业权限管理系统):10.权限关联与控制

    04.AdminLTE的基本介绍 05.SSM整合案例的基本介绍 06.产品操作 07.订单操作 08.权限控制 09.用户操作 10.权限关联与控制 11.AOP日志 10.权限关联与控制 1.用户 ...

  3. POJ 2443:Set Operation 经典位运算好题

    Set Operation Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 2965   Accepted: 1196 Des ...

  4. POJ 3673:Cow Multiplication

    Cow Multiplication Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12210   Accepted: 85 ...

  5. 【LeetCode 】N皇后II

    [问题]n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法.给定一个整数 n,返回 n 皇后不同的解决方案的数量. 示例: ...

  6. python-局域网内实现web页面用户端下载文件,easy!

    好久没有发博客了,但是也没闲着,最近疫情原因一直在家远程办公,分享一下今天的干货 先说需求:某个文件压缩之后可以供用户点击下载 没想到特别好的办法,在网上搜索大多都是通过socket实现的,然后我这个 ...

  7. slf4j NoSuchMethodError 错误 ---- 版本冲突

    java.lang.NoSuchMethodError: org.slf4j.spi.LocationAwareLogger.log(Lorg/slf4j/Marker;Ljava/lang/Stri ...

  8. 吴裕雄--天生自然Django框架开发笔记:Django 安装

    Window 下安装 Django 如果你还未安装Python环境需要先下载Python安装包. 1.Python 下载地址:https://www.python.org/downloads/ 2.D ...

  9. quartz详解3:quartz数据库集群-锁机制

    http://blog.itpub.NET/11627468/viewspace-1764753/ 一.quartz数据库锁 其中,QRTZ_LOCKS就是Quartz集群实现同步机制的行锁表,其表结 ...

  10. mybatis的一对多和多对一的连接查询

    实体类: package com.entity; import java.util.List; public class Dept { private Integer deptId; private ...