码迷,mamicode.com
首页 > 其他好文 > 详细

模板—珂朵莉树

时间:2019-09-20 19:19:21      阅读:65      评论:0      收藏:0      [点我收藏+]

标签:close   区间   read   gif   stdin   ble   end   opened   click   

其实本质上是优化暴力。

网上都说构造的数据可以卡掉珂朵莉树,是因为在修改的时候要遍历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

 

模板—珂朵莉树

标签:close   区间   read   gif   stdin   ble   end   opened   click   

原文地址:https://www.cnblogs.com/Al-Ca/p/11558698.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!