zoukankan      html  css  js  c++  java
  • zoj 3888 线段树 ***

    卡n^2,用线段树降到nlogn

    记录每个点上所覆盖线段的次小值,保证能有两条路径能走

      1 #include<cstdio>
      2 #include<iostream>
      3 #include<algorithm>
      4 #include<cstring>
      5 #include<cmath>
      6 #include<queue>
      7 #include<map>
      8 using namespace std;
      9 #define MOD 1000000007
     10 const int INF=0x3f3f3f3f;
     11 const double eps=1e-5;
     12 #define lson l,mid,rt<<1
     13 #define rson mid+1,r,rt<<1|1
     14 #define root 1,n,1
     15 #define mid ((l+r)>>1)
     16 typedef long long ll;
     17 #define cl(a) memset(a,0,sizeof(a))
     18 #define ts printf("*****
    ");
     19 const int N=51005;
     20 int n,m,tt;
     21 int a[N<<4],b[N<<4];
     22 void pushdown(int rt)
     23 {
     24     //printf("pd:%d %d %d
    ",a[rt],b[rt],rt);
     25     if(b[rt]!=9999999)
     26     {
     27         if(b[rt]>=a[rt<<1]&&b[rt]<b[rt<<1])
     28         {
     29             b[rt<<1]=b[rt];
     30         }
     31         if(b[rt]<a[rt<<1])
     32         {
     33             a[rt<<1]=b[rt<<1];
     34             a[rt<<1]=b[rt];
     35         }
     36         if(b[rt]>=a[rt<<1|1]&&b[rt]<b[rt<<1|1])
     37         {
     38             b[rt<<1|1]=b[rt];
     39         }
     40         if(b[rt]<a[rt<<1|1])
     41         {
     42             b[rt<<1|1]=a[rt<<1|1];
     43             a[rt<<1|1]=b[rt];
     44         }
     45         b[rt]=9999999;
     46     }
     47     /*if(rt==4)
     48     {
     49         printf("%d %d
    ",a[rt<<1],b[rt<<1]);
     50     }*/
     51     if(a[rt]!=9999999)
     52     {
     53         if(a[rt]>=a[rt<<1]&&a[rt]<b[rt<<1])
     54         {
     55             b[rt<<1]=a[rt];
     56         }
     57         if(a[rt]<a[rt<<1])
     58         {
     59             b[rt<<1]=a[rt<<1];
     60             a[rt<<1]=a[rt];
     61         }
     62         if(a[rt]>=a[rt<<1|1]&&a[rt]<b[rt<<1|1])
     63         {
     64             b[rt<<1|1]=a[rt];
     65         }
     66         if(a[rt]<a[rt<<1|1])
     67         {
     68             b[rt<<1|1]=a[rt<<1|1];
     69             a[rt<<1|1]=a[rt];
     70         }
     71         a[rt]=9999999;
     72     }
     73     //printf("%d %d ++%d++
    ",a[rt<<1],b[rt<<1],rt<<1);
     74 }
     75 void build(int l,int r,int rt)
     76 {
     77     a[rt]=b[rt]=9999999;
     78     if(l==r)
     79     {
     80         a[rt]=b[rt]=l;
     81         return;
     82     }
     83     build(lson);
     84     build(rson);
     85 }
     86 void update(int L,int R,int val,int l,int r,int rt)
     87 {
     88     if(l>=L&&r<=R)
     89     {
     90         int x=val;
     91         if(b[rt]>x&&x>a[rt])
     92         {
     93             b[rt]=x;
     94         }
     95         if(x<b[rt])
     96         {
     97             b[rt]=a[rt];
     98             a[rt]=x;
     99         }
    100         return;
    101     }
    102     pushdown(rt);
    103     if(L<=mid)  update(L,R,val,lson);
    104     if(R>mid)  update(L,R,val,rson);
    105 }
    106 int query(int pos,int l,int r,int rt)
    107 {
    108     //printf("%d %d %d %d %d
    ",a[rt],b[rt],l,r,rt);
    109     if(l==r)
    110     {
    111         return b[rt];
    112     }
    113     pushdown(rt);
    114     if(pos<=mid)  return query(pos,lson);
    115     else return query(pos,rson);
    116 }
    117 int main()
    118 {
    119     int i,j,k,ca=1,q;
    120     #ifndef ONLINE_JUDGE
    121     freopen("1.in","r",stdin);
    122     #endif
    123     while(scanf("%d%d%d",&n,&m,&q)!=EOF)
    124     {
    125         int x,y;
    126         build(root);
    127         for(i=0;i<m;i++)
    128         {
    129             scanf("%d%d",&y,&x);
    130             update(x,y,x,root);    //记录次小x
    131         }
    132         while(q--)
    133         {
    134             scanf("%d",&x);
    135             printf("%d
    ",x-query(x,root));
    136         }
    137     }
    138 }
  • 相关阅读:
    idea vue.js插件安装
    vue.js 开发环境配置
    Stream grouping-storm的流分组策略
    Kafka web console安装
    call 方法 (Function) (JavaScript)
    bind 方法 (Function) (JavaScript)
    CSS选择器、优先级和常用的选择器
    CSS3.0盒子模型:display:-webkit-box
    有了自己的博客了
    Javascript进阶篇——(DOM—节点---获取浏览器窗口可视区域大小+获取网页尺寸)—笔记整理
  • 原文地址:https://www.cnblogs.com/cnblogs321114287/p/4737365.html
Copyright © 2011-2022 走看看