zoukankan      html  css  js  c++  java
  • 模板—珂朵莉树

    其实本质上是优化暴力。

    网上都说构造的数据可以卡掉珂朵莉树,是因为在修改的时候要遍历set导致很容易卡掉,所以珂朵莉树可能比较有局限性。

    但是如果用来维护区间用于求交求并,复杂度是严格的log的,常数好像稍大,但是还是非常有用的。

    放个板子:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<set>
     4 #define re register
     5 #define co const
     6 #define cor co re
     7 #define INF 0x7ffffffffffffff
     8 #define LL long long
     9 const int L=1<<20|1;
    10 char buffer[L],*S,*TT;
    11 #define getchar() ((S==TT&&(TT=(S=buffer)+fread(buffer,1,L,stdin),S==TT))?EOF:*S++)
    12 using namespace std;
    13 int T,s,k,n;
    14 LL a[500010],sum[500010];
    15 
    16 struct node
    17 {
    18     LL l,r;
    19     mutable int v;
    20     friend bool operator < (node a,node b)
    21     {return a.l<b.l;}
    22 };
    23 struct kdl_tree
    24 {    
    25     set<node> s;
    26     #define IT set<node>::iterator
    27     IT spilit(cor LL pos)
    28     {    
    29         IT it=s.lower_bound((node){pos,-1,0});
    30         if(it!=s.end()&&it->l==pos)return it;
    31         it--;
    32         LL L=it->l,R=it->r,v=it->v;
    33         s.erase(it);
    34         s.insert((node){L,pos-1,v});
    35         return s.insert((node){pos,R,v}).first;
    36     }
    37     void tp(cor LL l,cor LL r,cor int val)
    38     {    
    39         IT ir=spilit(r+1),il=spilit(l);
    40         s.erase(il,ir);
    41         s.insert((node){l,r,val});
    42     }
    43 }Tr;
    44 inline int read();
    45 signed main()
    46 {
    47 //    freopen("in.txt","r",stdin);
    48 //    freopen("1.out","w",stdout);
    49     
    50     T=read();
    51     while(T--)
    52     {
    53         Tr.s.clear();
    54         s=read(),k=read(),n=read();
    55         sum[0]=0;for(re int i=1;i<=n;i++)a[i]=read(),sum[i]=sum[i-1]+a[i];
    56         
    57         sum[n+1]=INF;
    58         Tr.s.insert((node){-INF,0,1});
    59         for(re int i=1;i<=n;i+=2)
    60         {    
    61             LL l=sum[i-1]+1,r=sum[i]+s-1;
    62             LL tk=((l-1)/k+1)*k,bs=((l-1)/k+1);
    63             if(tk<=r)Tr.tp( l-k*bs , tk-k*bs ,0),bs++;
    64             Tr.tp( l-k*bs , r-k*bs , 0);
    65         }
    66         bool ok=0;
    67         for(IT it=++Tr.s.begin();it!=Tr.s.end();it++)        
    68         if(it->l<=0&&it->r<=0)
    69             if(it->v){ok=1;}
    70         if(ok)puts("TAK");
    71         else  puts("NIE");
    72     }
    73 }
    74 inline int read()
    75 {
    76     int s=0,f=1;char a=getchar();
    77     while(a<'0'||a>'9'){if(a=='-')f=-1;a=getchar();}
    78     while(a>='0'&&a<='9'){s=s*10+a-'0';a=getchar();}
    79     return s*f;
    80 }
    View Code
  • 相关阅读:
    动态库的链接和链接选项-L,-rpath-link,-rpath
    SSL/TLS 握手过程详解
    数字证书及CA介绍
    sendto函数的坑
    如何捕捉并分析SIGSEGV的现场
    gdb进程调试,多进程调试
    linux下的守护进程daemon
    winform的水印TextBox
    Winform中的TextBox的小技巧
    WebForms UnobtrusiveValidationMode 需要“jquery”ScriptResourceMapping。请添加一个名为 jquery (区分大小写)的 ScriptRes
  • 原文地址:https://www.cnblogs.com/Al-Ca/p/11558698.html
Copyright © 2011-2022 走看看