zoukankan      html  css  js  c++  java
  • BZOJ3165 [Heoi2013]Segment

    恩。。线段树维护凸壳。。。什么鬼

    介绍什么的略。为甚我的程序略长。。。

      1 /**************************************************************
      2     Problem: 3165
      3     User: rausen
      4     Language: C++
      5     Result: Accepted
      6     Time:1820 ms
      7     Memory:5180 kb
      8 ****************************************************************/
      9  
     10 #include <cstdio>
     11 #include <algorithm>
     12  
     13 using namespace std;
     14 typedef double lf;
     15  
     16 const int n = 40005;
     17 const int mod1 = 39989;
     18 const int mod2 = 1e9;
     19 const int Cnt_seg = n << 2;
     20 const lf inf = 1e60;
     21  
     22 struct line {
     23     lf k, b;
     24     int id;
     25 };
     26  
     27 struct data {
     28     lf v;
     29     int id;
     30     data() {}
     31     data(lf _v, int _i) : v(_v), id(_i) {}
     32      
     33     friend inline bool operator < (const data &x, const data &y) {
     34         if (x.id == 0) return 1;
     35         if (y.id == 0) return 0;
     36         return x.v == y.v ? x.id > y.id : x.v < y.v;
     37     }
     38 };
     39  
     40 struct seg_node {
     41     seg_node *ls, *rs;
     42     line li;
     43 } *seg_root, mempool[Cnt_seg], *cnt_seg = mempool;
     44  
     45 int ans, cnt_id;
     46  
     47 inline void calc(int &x, int y) {
     48     ((x += ans - 1) %= y) += 1;
     49 }
     50  
     51 #define K l.k
     52 #define B l.b
     53 #define ID l.id
     54 inline line make_line(int x0, int y0, int x1, int y1) {
     55     line l;
     56     ID = ++cnt_id;
     57     if (x0 == x1) K = 0, B = max(y0, y1);
     58     else K = (lf) (y0 - y1) / (x0 - x1), B = y0 - K * x0;
     59     return l;
     60 }
     61  
     62 inline lf get_point(line l, int x) {
     63     return ID == 0 ? -inf : K * (lf) x + B;
     64 }
     65 #undef K
     66 #undef B
     67 #undef ID
     68  
     69 #define mid (l + r >> 1)
     70 #define Li p -> li
     71 #define Ls p -> ls
     72 #define Rs p -> rs
     73 void seg_build(seg_node *&p, int l, int r) {
     74     p = ++cnt_seg;
     75     Li.id = 0;
     76   if (l == r) return;
     77     seg_build(Ls, l, mid), seg_build(Rs, mid + 1, r);
     78 }
     79  
     80 void seg_update(seg_node *p, int l, int r, line li) {
     81     if (Li.id == 0) Li = li;
     82     if (get_point(Li, l) < get_point(li, l)) swap(Li, li);
     83     if (l == r || Li.k == li.k) return;
     84     lf w = (Li.b - li.b) / (li.k - Li.k);
     85     if (w < l || w > r) return;
     86     if (w <= mid) seg_update(Ls, l, mid, Li), Li = li;
     87     else seg_update(Rs, mid + 1, r, li);
     88 }
     89  
     90 void seg_insert(seg_node *p, int l, int r, int L, int R, line li) {
     91     if (L <= l && r <= R) {
     92         seg_update(p, l, r, li);
     93         return;
     94     }
     95     if (L <= mid) seg_insert(Ls, l, mid, L, R, li);
     96     if (mid < R) seg_insert(Rs, mid + 1, r, L, R, li);
     97 }
     98  
     99 #define Data data(get_point(Li, w), Li.id)
    100 data seg_query(seg_node *p, int l, int r, int w) {
    101     if (l == r) return Data;
    102     if (w <= mid) return max(Data, seg_query(Ls, l, mid, w));
    103     else return max(Data, seg_query(Rs, mid + 1, r, w));
    104 }
    105 #undef mid
    106 #undef Ls
    107 #undef Rs
    108 #undef L
    109  
    110 int main() {
    111     seg_build(seg_root, 1, n);
    112     int Q, oper, x, y, x0, y0, x1, y1;
    113     scanf("%d", &Q);
    114     while (Q--) {
    115         scanf("%d", &oper);
    116         if (oper == 0) {
    117             scanf("%d", &x);
    118             calc(x, mod1);
    119             printf("%d
    ", ans = seg_query(seg_root, 1, n, x).id);
    120         } else {
    121             scanf("%d%d%d%d", &x0, &y0, &x1, &y1);
    122             calc(x0, mod1), calc(x1, mod1), calc(y0, mod2), calc(y1, mod2);
    123             if (x0 > x1)
    124                 swap(x0, x1), swap(y0, y1);
    125             seg_insert(seg_root, 1, n, x0, x1, make_line(x0, y0, x1, y1));
    126         }
    127     }
    128     return 0;
    129 }
    View Code
    By Xs酱~ 转载请说明 博客地址:http://www.cnblogs.com/rausen
  • 相关阅读:
    PowerDesigner使用教程 —— 概念数据模型 (转)
    面板Panel:1.认识Ext.Panel(转)
    批量替换一个数据库中所有表中所有记录
    Ext.data库中几个常用类的原理及其使用 (转)
    也谈C#.NET防止SQL注入式攻击
    jQuery1.3新特性深度分析(Event)
    Sql实现Split
    SQL Server 清除数据库日志脚本(转)
    ExtJS之面向对象编程基本知识
    实战 SQL Server 2005 镜像配置
  • 原文地址:https://www.cnblogs.com/rausen/p/4296125.html
Copyright © 2011-2022 走看看