• Codeforces Beta Round #35 (Div. 2) E. Parade(扫描线)


    题目链接

    只要会做,周长并,这题肯定有思路。

    有个小地方敲错了,细心啊,扫描线,有一段时间没写过了,还有注意排序的问题,很重要。

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstring>
      4 #include <vector>
      5 #include <cmath>
      6 #include <algorithm>
      7 using namespace std;
      8 #define LL __int64
      9 #define lson l,m,rt<<1
     10 #define rson m+1,r,rt<<1|1
     11 int que[300000];
     12 int sum[4*300000];
     13 int cnt[4*300000];
     14 int ax[1000101],ay[1000101];
     15 struct node
     16 {
     17     int h,x,c;
     18     node(){}
     19     node(int a,int b,int c):h(a),x(b),c(c){}
     20     bool operator < (const node &S)const
     21     {
     22         if(x == S.x)
     23         {
     24             if(c != S.c)
     25             return c > S.c;
     26             else if(c == 1)
     27             return h > S.h;
     28             else if(c == -1)
     29             return h < S.h;
     30         }
     31         return x < S.x;
     32     }
     33 }mat[200101];
     34 void pushup(int rt,int l,int r)
     35 {
     36     if(cnt[rt])
     37     sum[rt] = que[r+1] - que[l];
     38     else if(l == r)
     39     sum[rt] = 0;
     40     else
     41     sum[rt] = sum[rt<<1] + sum[rt<<1|1];
     42 }
     43 void update(int L,int R,int c,int l,int r,int rt)
     44 {
     45     int m;
     46     if(L <= l&&r <= R)
     47     {
     48         cnt[rt] += c;
     49         pushup(rt,l,r);
     50         return ;
     51     }
     52     m = (l + r)>>1;
     53     if(L <= m)
     54     update(L,R,c,lson);
     55     if(R > m)
     56     update(L,R,c,rson);
     57     pushup(rt,l,r);
     58     return ;
     59 }
     60 int bin(int x,int y)
     61 {
     62     int str,end,mid;
     63     str = 0;
     64     end = y;
     65     while(str <= end)
     66     {
     67         mid = (str+end)/2;
     68         if(que[mid] == x)
     69         return mid;
     70         else if(que[mid] > x)
     71         end = mid - 1;
     72         else
     73         str = mid + 1;
     74     }
     75     return mid;
     76 }
     77 int main()
     78 {
     79     int n,i,h,l,r,num;
     80     freopen("input.txt","r",stdin);
     81     freopen("output.txt","w",stdout);
     82     scanf("%d",&n);
     83     num = 0;
     84     for(i = 0;i < n;i ++)
     85     {
     86         scanf("%d%d%d",&h,&l,&r);
     87         que[i] = h;
     88         mat[num++] = node(h,l,1);
     89         mat[num++] = node(h,r,-1);
     90     }
     91     que[n] = 0;
     92     sort(que,que+n+1);
     93     sort(mat,mat+num);
     94     int k = 1;
     95     for(i = 1;i <= n;i ++)
     96     {
     97         if(que[i] != que[i-1])
     98         que[k++] = que[i];
     99     }
    100     int tn = 0,pre = 0;
    101     for(i = 0;i < num;i ++)
    102     {
    103         l = 0;
    104         r = bin(mat[i].h,k-1) - 1;
    105         if(l <= r)
    106         {
    107             update(l,r,mat[i].c,0,k-1,1);
    108         }
    109         if(pre != sum[1])
    110         {
    111             ax[tn] = mat[i].x;
    112             ay[tn++] = pre;
    113             ax[tn] = mat[i].x;
    114             ay[tn++] = sum[1];
    115             pre = sum[1];
    116         }
    117     }
    118     printf("%d
    ",tn);
    119     for(i = 0;i < tn;i ++)
    120     {
    121         printf("%d %d
    ",ax[i],ay[i]);
    122     }
    123     return 0;
    124 }
  • 相关阅读:
    append()、appendChild() 和 innerHTML 的区别
    JS实现动态添加和删除div
    linux下的find文件查找命令与grep文件内容查找命令
    Java 并发基础常见面试题总结
    深入理解HashMap
    JAVA 或与非运算符 与(&)、或(|)、异或(^)
    centos7.x下环境搭建(三)—nodejs安装
    centos7.x下环境搭建(二)—nginx安装
    centos7.x下环境搭建(一)--yum方式安装mysql5.7
    基于vuecli3构建一个快速开发h5 APP的模板
  • 原文地址:https://www.cnblogs.com/naix-x/p/3358788.html
Copyright © 2020-2023  润新知