SPOJ 3273
这是一道treap的模板题,不要问我为什么一直在写模板题
依旧只放代码
Treap 版
//SPOJ 3273 //by Cydiater //2016.8.31 #include <iostream> #include <cstring> #include <ctime> #include <cmath> #include <cstdlib> #include <string> #include <algorithm> #include <queue> #include <map> #include <iomanip> #include <cstdio> using namespace std; #define ll long long #define up(i,j,n) for(int i=j;i<=n;i++) #define down(i,j,n) for(int i=j;i>=n;i--) ; const int oo=0x3f3f3f3f; inline int read(){ ,f=; ;ch=getchar();} +ch-';ch=getchar();} return x*f; } ,tol=; char op; map<int,int>m; struct node{ int rnd,v,cnt,siz,leftt,rightt; }t[MAXN]; namespace solution{ void updata(int k){ t[k].siz=t[t[k].leftt].siz+t[t[k].rightt].siz+t[k].cnt; } void lefturn(int &k){ int tt=t[k].rightt;t[k].rightt=t[tt].leftt;t[tt].leftt=k; t[tt].siz=t[k].siz;updata(k);k=tt; } void righturn(int &k){ int tt=t[k].leftt;t[k].leftt=t[tt].rightt;t[tt].rightt=k; t[tt].siz=t[k].siz;updata(k);k=tt; } void insert(int &k,int x){ ){ k=++tol;t[k].leftt=t[k].rightt=; t[k].cnt=;t[k].siz=;t[k].v=x; t[k].rnd=rand(); return; } t[k].siz++; if(t[k].v==x)t[k].cnt++; else if(x>t[k].v){ insert(t[k].rightt,x); if(t[t[k].rightt].rnd<t[k].rnd)lefturn(k); }else if(x<t[k].v){ insert(t[k].leftt,x); if(t[t[k].leftt].rnd<t[k].rnd)righturn(k); } } void del(int &k,int x){ ) return; if(x==t[k].v){ ){t[k].siz--;t[k].cnt--;return;} ) k=t[k].leftt+t[k].rightt; else if(t[t[k].leftt].rnd<t[t[k].rightt].rnd){ righturn(k); del(k,x); } else if(t[t[k].leftt].rnd>t[t[k].rightt].rnd){ lefturn(k); del(k,x); } }else if(x>t[k].v){ t[k].siz--; del(t[k].rightt,x); }else if(x<t[k].v){ t[k].siz--; del(t[k].leftt,x); } } int query_num(int k,int x){ ) return oo; if(x<=t[t[k].leftt].siz) return query_num(t[k].leftt,x); else if(x>t[t[k].leftt].siz+t[k].cnt) return query_num(t[k].rightt,x-(t[t[k].leftt].siz+t[k].cnt)); else return t[k].v; } int query_siz(int k,int x){ ) ; if(x<=t[k].v) return query_siz(t[k].leftt,x); else if(x>t[k].v) return t[t[k].leftt].siz+t[k].cnt+query_siz(t[k].rightt,x); } void slove(){ N=read(); while(N--){ scanf("%c",&op);num=read(); ){insert(root,num);m[num]=;} ){del(root,num);m[num]=;} if(op=='K'){ if(num>t[root].siz)puts("invalid"); else{ int ans=query_num(root,num); if(ans>=oo){ puts("invalid"); continue; } printf("%d\n",ans); } } if(op=='C')printf("%d\n",query_siz(root,num)); } } } int main(){ //freopen("input.in","r",stdin); using namespace solution; slove(); ; }
Splay 版:
splay会被卡掉..0.3s貌似扛不住了,不过过了前几组,先粘上来吧
//SPOJ 3273 //by Cydiater //2016.9.4 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <string> #include <iomanip> #include <ctime> #include <cmath> #include <iomanip> #include <queue> #include <map> using namespace std; #define ll long long #define up(i,j,n) for(int i=j;i<=n;i++) #define down(i,j,n) for(int i=j;i>=n;i--) ; const int oo=0x3f3f3f3f; ; ; inline int read(){ ,f=; ;ch=getchar();} +ch-';ch=getchar();} return x*f; } char op; ,root=,num,N; struct SpalyTree{ ],siz,cnt,v,fa; }t[MAXN]; struct Hash{ int Num[MAXN]; Hash(){up(i,,MAXN-)Num[i]=-oo;} void insert(int x){ int tmp=x%mod; ||Num[tmp]!=-oo){tmp+=step;tmp%=mod;} Num[tmp]=x; } bool Get(int x){ ){hashvalue+=step;hashvalue%=mod;} while(Num[hashvalue]!=x&&Num[hashvalue]!=-oo){hashvalue+=step;hashvalue%=mod;} ; ; } void del(int x){ int tmp=x%mod; ||Num[tmp]!=x){tmp+=step;tmp%=mod;} Num[tmp]=; } }lable; namespace solution{ void updata(int x){ if(x){ t[x].siz=t[x].cnt; ])t[x].siz+=t[t[x].son[]].siz; ])t[x].siz+=t[t[x].son[]].siz; } } ]==x;} ]=t[x].son[]=t[x].fa=t[x].siz=t[x].cnt=t[x].v=;} void rotate(int x){ int old=t[x].fa,oldf=t[old].fa,which=get(x); t[old].son[which]=t[x].son[which^];t[t[old].son[which]].fa=old; t[old].fa=x;t[x].son[which^]=old; t[x].fa=oldf; ]==old]=x; updata(old);updata(x); } void splay(int x){ for(int fa;(fa=t[x].fa);rotate(x))if(t[fa].fa) rotate((get(x)==get(fa)?fa:x));root=x; } void insert(int x){ ){ root=++tol; t[root].son[]=t[root].son[]=t[root].fa=; t[root].v=x;t[root].cnt=t[root].siz=; return; } ; ){ if(t[now].v==x){ t[now].cnt++; updata(now);updata(fa); splay(now);break; } fa=now;now=t[now].son[x>t[now].v]; ){ now=++tol; t[now].son[]=t[now].son[]=;t[now].v=x; t[now].siz=t[now].cnt=;t[now].fa=fa; t[fa].son[x>t[fa].v]=tol; updata(fa);splay(now);break; } } } int find(int v){ ,now=root; ){ ]; else{ ans+=(t[now].son[]?t[t[now].son[]].siz:); if(v==t[now].v){ splay(now); ; } ans+=t[now].cnt; now=t[now].son[]; } } } int pre(){ ]; ])now=t[now].son[]; return now; } int match_rank(int x){ int now=root; ){ ]&&x<=t[t[now].son[]].siz)now=t[now].son[]; else{ ]?t[t[now].son[]].siz:)+t[now].cnt; if(x<=tmp) return t[now].v; x-=tmp;now=t[now].son[]; } } } void del(int x){ int whatever=find(x); ){ t[root].cnt--; t[root].siz--; return; } ]+t[root].son[]==){ clear(root);root=; return; } ]){ ];t[root].fa=; clear(oldroot);return; }]){ ];t[root].fa=; clear(oldroot);return; } int leftbig=pre(),oldroot=root; splay(leftbig); t[t[oldroot].son[]].fa=root; t[root].son[]=t[oldroot].son[]; clear(oldroot); updata(root); } int get_siz(int num){ int now=root; ){ ]].siz+t[now].cnt; ]; } } } int main(){ //freopen("input.in","r",stdin); using namespace solution; N=read(); while(N--){ scanf("%c",&op);num=read(); ){insert(num);lable.insert(num);} ){del(num);lable.del(num);} if(op=='K'){ if(num>t[root].siz)puts("invalid"); else printf("%d\n",match_rank(num)); } if(op=='C')printf("%d\n",get_siz(num)); } ; }
SPOJ 3273的更多相关文章
- SPOJ 3273 - Order statistic set , Treap
点击打开链接 题意: 集合S支持一下四种操作: INSERT(S,x) : 假设S中没有x,则插入x DELETE(S,x): 假设S中有x,则删除x K-TH(S): ...
- BZOJ 2588: Spoj 10628. Count on a tree [树上主席树]
2588: Spoj 10628. Count on a tree Time Limit: 12 Sec Memory Limit: 128 MBSubmit: 5217 Solved: 1233 ...
- SPOJ DQUERY D-query(主席树)
题目 Source http://www.spoj.com/problems/DQUERY/en/ Description Given a sequence of n numbers a1, a2, ...
- SPOJ GSS3 Can you answer these queries III[线段树]
SPOJ - GSS3 Can you answer these queries III Description You are given a sequence A of N (N <= 50 ...
- 【填坑向】spoj COT/bzoj2588 Count on a tree
这题是学主席树的时候就想写的,,, 但是当时没写(懒) 现在来填坑 = =日常调半天lca(考虑以后背板) 主席树还是蛮好写的,但是代码出现重复,不太好,导致调试的时候心里没底(虽然事实证明主席树部分 ...
- SPOJ bsubstr
题目大意:给你一个长度为n的字符串,求出所有不同长度的字符串出现的最大次数. n<=250000 如:abaaa 输出: 4 2 1 1 1 spoj上的时限卡的太严,必须使用O(N)的算法那才 ...
- 【SPOJ 7258】Lexicographical Substring Search
http://www.spoj.com/problems/SUBLEX/ 好难啊. 建出后缀自动机,然后在后缀自动机的每个状态上记录通过这个状态能走到的不同子串的数量.该状态能走到的所有状态的f值的和 ...
- 【SPOJ 1812】Longest Common Substring II
http://www.spoj.com/problems/LCS2/ 这道题想了好久. 做法是对第一个串建后缀自动机,然后用后面的串去匹配它,并在走过的状态上记录走到这个状态时的最长距离.每匹配完一个 ...
- 【SPOJ 8222】Substrings
http://www.spoj.com/problems/NSUBSTR/ clj课件里的例题 用结构体+指针写完模板后发现要访问所有的节点,改成数组会更方便些..于是改成了数组... 这道题重点是求 ...
随机推荐
- ADO.NET 学习笔记 入门教程
本文转载自:http://www.youarebug.com/forum.php?mod=viewthread&tid=57&page=1&extra=#pid63 这是本人在 ...
- 必须要会的技能(一) 如何实现设计时Binding
今天我们来分享一个主题:DesignTime Binding设计时绑定. 这一项技术可以使用在所有包括WPF及其衍生出来的技术上,比如Sliverlight,当然也包括UWP 先来说明一下设计时Bin ...
- 解决问题:由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。
WindowServer2012服务器,添加角色安装完.netframework和iis之后,运行aspx页面就报如下错误: HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法 ...
- nios II--实验3——led 100M软件部分
软件开发 参照实验二(led),该实验与实验二(led)的不同之处在于系统的时钟由50M提成为100M.运行结果,在调试窗口输出Hello from Nios II!,并且板上的四个LED灯流动显示, ...
- 【BZOJ1003】【ZJOI2006】物流运输
1003: [ZJOI2006]物流运输trans Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2556 Solved: 1008[Submit] ...
- SharePoint 读取 Site Columns 的数据并绑定到DropdownList
public void GetSiteColumns(DropDownList ddl, String siteColumn) { var fields = new SPSite(ProjectCon ...
- ActiveMQ(七)_伪集群和主从高可用使用
一.本文目的 介绍如何在同一台虚拟机上搭建高可用的Activemq服务,集群数量包含3个Activemq,当Activemq可用数>=2时,整个集群可用. 本 ...
- 网络流 POJ2112
题意:K个产奶机,C头奶牛,每个产奶机最多可供M头奶牛使用:并告诉了产奶机.奶牛之间的两两距离Dij(0<=i,j<K+C). 问题:如何安排使得在任何一头奶牛都有自己产奶机的条件下,奶牛 ...
- Arraylist Vector Linkedlist区别和用法 (转)
ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操作,所以索引数据快插入数据慢 ...
- Leetcode 376. Wiggle Subsequence
本题要求在O(n)时间内求解.用delta储存相邻两个数的差,如果相邻的两个delta不同负号,那么说明子序列摇摆了一次.参看下图的nums的plot.这个例子的答案是7.平的线段部分我们支取最左边的 ...