摘要:
题目大意:有两个帮派,命令D a b表示a,b两人不在同一个帮派里,动态询问两个人是不是在同一个帮派。并查集。d[x]=0 or 1 表示x是否与根节点在同一帮派。碰到D a b 就合并,同时d[fa]:=(d[a]+d[b]+1) mod 2.路径压缩的时候维护一下就好了,方法如下。1 function find(x:longint):longint;2 var fa:longint;3 begin4 fa:=f[x];5 if f[x]=0 then exit(x);6 f[x]:=find(f[x]);7 d[x]:=(d[x]+d[fa])mod... 阅读全文
摘要:
先求出最终的序列,然后树状数组求出每一个询问的答案。1.求最终序列可以用sbt。插入到位置x时如果比左子树的size大就插入到右子树中,否则就插入到左子树中。1 if x<=size[l[t]] then2 insert(x,l[t])3 else insert(x-size[l[t]]-1,r[t]);2.求每一个询问的答案。 f[i]为当前到这个数的最长上升子序列。查询这个数的最终位置之前的最大的f[j]为max,f[i]=max+1; ans[i]=max(f[i],ans[i-1]);for i:=1 to n do begin f[i]:=1+search(se[... 阅读全文