www.lydsy.com/JudgeOnline/upload/task.pdf

第一题题意可以转为选一个长度k的序列,每一项二进制的1的位置被下一项包含,且总和为1,考虑每个二进制位的出现位置,可以转化为一个多重背包求方案数的问题。

第二题构成一些环,可以每个环直接计算,然后合并答案。

第三题区间包含相当于单向边,区间相交不包含就是双向边,将区间相交不包含的情况缩点,剩余的单向边构成一棵树(几个被缩起来的区间可以用它们的并集表示),用lct维护树形态,查询即为询问两点是否是祖先关系,对于修改,由于区间长度递增,只有至多两种缩点情况:1.新加入的区间与某棵树的根缩点(另用平衡树维护所有根对应的区间,实际上需要再分几类);2.新加入的区间与树上非根的点缩点(另用线段树维护所有非根节点对应的区间)。

前两题代码实现比较简单,所以这里只给出第三题的代码。

#include<bits/stdc++.h>
int _(){
int x=,f=,c=getchar();
while(c<)c=='-'?f=-:,c=getchar();
while(c>)x=x*+c-,c=getchar();
return x*f;
}
#define lc ch][0
#define rc ch][1
#define fa ch][2
const int N=2e5+,inf=0x3f3f3f3f;
struct itv{
int l,r,id;
bool operator<(const itv&w)const{return l<w.l;}
};
struct cmpl{bool operator()(const itv&a,const itv&b){return a.l>b.l;}};
struct cmpr{bool operator()(const itv&a,const itv&b){return a.r<b.r;}};
std::set<itv>st;
int n,f[N],ch[N][],idp=;
int qs[N][],xs[N],xp=,mx=,tl[],tr[];
std::priority_queue<itv,std::vector<itv>,cmpl>ls[N];
std::priority_queue<itv,std::vector<itv>,cmpr>rs[N];
int gf(int x){
while(x!=x[f])x=x[f]=x[f][f];
return x;
}
bool nrt(int x){return x==x[fa][lc]||x==x[fa][rc];}
int wc(int x){return x==x[fa][rc];}
void rot(int x){
int f=x[fa],g=f[fa],d=wc(x);
if(nrt(f))g[ch][wc(f)]=x;
x[fa]=g;
(f[ch][d]=x[ch][d^])[fa]=f;
(x[ch][d^]=f)[fa]=x;
}
void sp(int x){
while(nrt(x)){
int f=x[fa];
if(nrt(f))rot(wc(x)==wc(f)?f:x);
rot(x);
}
}
int acs(int x){int y=;for(;x;sp(x),x[rc]=y,y=x,x=x[fa]);return y;}
void lk(int a,int b){acs(a)[fa]=b;}
void ctlk(int a,int b){acs(a),sp(a);a[lc][fa]=,a[lc]=,a[fa]=b;}
int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a<b?a:b;}
void tl_up(int x){
tl[x+mx]=ls[x].size()?ls[x].top().l:inf;
for(x=x+mx>>;x;x>>=)tl[x]=min(tl[x<<],tl[(x<<)+]);
}
void tr_up(int x){
tr[x+mx]=rs[x].size()?rs[x].top().r:-inf;
for(x=x+mx>>;x;x>>=)tr[x]=max(tr[x<<],tr[(x<<)+]);
}
int $(int x){
return std::lower_bound(xs+,xs+xp+,x)-xs;
}
void tr_ins(itv w){
int _l=$(w.l),_r=$(w.r);
ls[_r].push(w),tl_up(_r);
rs[_l].push(w),tr_up(_l);
}
void chk(itv w,int z){
int p,u;
while(tl[z]<w.l){
for(p=z;p<mx;p<<=,p+=tl[p]>=w.l);
p-=mx;
u=ls[p].top().id;
if(u==f[u])ctlk(u,f[u]=w.id);
ls[p].pop();
tl_up(p);
}
while(tr[z]>w.r){
for(p=z;p<mx;p<<=,p+=tr[p]<=w.r);
p-=mx;
u=rs[p].top().id;
if(u==f[u])ctlk(u,f[u]=w.id);
rs[p].pop();
tr_up(p);
}
}
void tr_del(itv w){
for(int l=$(w.l)+mx,r=$(w.r)+mx;r-l>;l>>=,r>>=){
if(~l&)chk(w,l+);
if(r&)chk(w,r-);
}
}
void ins(itv w){
tr_del(w);
std::set<itv>::iterator it=st.lower_bound(w);
if(it!=st.end()&&it->l==w.l&&it->r>w.r)return lk(w.id,f[w.id]=it->id);
if(it!=st.begin()&&(--it)->r>w.l){
int u=it->id;
if(it->r>=w.r)return lk(w.id,f[w.id]=u);
w.l=it->l,f[u]=w.id;
lk(u,w.id);
st.erase(it);
}
while((it=st.lower_bound(w))!=st.end()&&it->l<w.r){
int u=it->id;
if(it->r>w.r)w.r=it->r,f[u]=w.id;
else tr_ins(*it);
lk(u,w.id);
st.erase(it);
}
st.insert(w);
}
bool query(int x,int y){
x=gf(x),y=gf(y);
if(x==y)return ;
x=acs(x);
int y0=y;
for(;nrt(y);y=y[fa]);
sp(y0);
return x==y;
}
int main(){
n=_();
for(int i=;i<=n;++i){
qs[i][]=_();
qs[i][]=_();
qs[i][]=_();
if(qs[i][]==)xs[++xp]=qs[i][],xs[++xp]=qs[i][];
}
std::sort(xs+,xs+xp+);
for(;mx<=xp+;mx<<=);
for(int i=mx*-;i;--i)tl[i]=inf,tr[i]=-inf;
for(int i=;i<=n;++i){
f[i]=i;
int o=qs[i][],x=qs[i][],y=qs[i][];
if(o==)ins((itv){x,y,++idp});
else puts(query(x,y)?"YES":"NO");
}
return ;
}

bzoj5003: 与链 5004: 开锁魔法II 5005:乒乓游戏的更多相关文章

  1. BZOJ 5004: 开锁魔法II 期望 + 组合

    Description 题面:www.lydsy.com/JudgeOnline/upload/task.pdf Input Output 一般概率题有两种套路: 满足条件的方案/总方案. 直接求概率 ...

  2. BZOJ 5004: 开锁魔法II

    比较显然 #include<cstdio> #include<algorithm> #include<cstring> using namespace std; i ...

  3. 【bzoj5004】开锁魔法II 组合数学+概率dp

    题目描述 有 $n$ 个箱子,每个箱子里有且仅有一把钥匙,每个箱子有且仅有一把钥匙可以将其打开.现在随机打开 $m$ 个箱子,求能够将所有箱子打开的概率. 题解 组合数学+概率dp 题目约定了每个点的 ...

  4. hrb——开锁魔法I——————【规律】

    解题思路:从1到n的倒数之和. #include<stdio.h> #include<string.h> #include<algorithm> using nam ...

  5. hihocoder1075【开锁魔法】

    hihocoder1075[开锁魔法] 题意是给你一个 \(1-n\) 的置换,求选 \(k\) 个可以遍历所有点的概率. 题目可以换个模型:有 \(n\) 个球,有 \(cnt\) 种不同的颜色,求 ...

  6. hihocoder 1075 : 开锁魔法III

    描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它.初始时,崔克茜将会随机地选择 k 个盒子用魔法将它 ...

  7. #1075 : 开锁魔法III

    描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它.初始时,崔克茜将会随机地选择 k 个盒子用魔法将它 ...

  8. Hiho #1075: 开锁魔法III

    Problem Statement 描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它.初始时,崔克茜 ...

  9. HihoCoder 1075 开锁魔法III(概率DP+组合)

    描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它.初始时,崔克茜将会随机地选择 k 个盒子用魔法将它 ...

随机推荐

  1. CF453(Div1 简单题解)

    A .Little Pony and Expected Maximum pro:给定M,N,表示一个M面的骰子,甩N次,问出现的最大的数的期望. sol:容斥,f(i)表示最大数<=i的期望,那 ...

  2. 【转】visualSFM生成的bundle.rd.out文件的格式

    1.bundle.out 文件包含了一些经过估算得到的场景和相机几何信息.文件的格式如下: //---------------------------------------------------- ...

  3. xdoj 1067组合数学+动态规划 (一个题断断续续想了半年 233)

    题目分析 : (8 4) 可以由(7 4),(6,4),( 4,4) 基础上转化 意味着一个新加入的元素可以按照它加入的方式分类,从而实现动态规划 核心:加入方式 新加入的元素构成转换环的元素个数(n ...

  4. HPU第四次积分赛-L:A Winged Steed(完全背包)

    A Winged Steed 描述 有n种千里马,每一种都有若干匹,第i种马的颜值ai​,价格di​.现有m个牧马人要去挑选千里马,每一位牧马人对马的颜值都有要求:{所选马的颜值总和} ⩾Ai​.现在 ...

  5. 简单矩阵快速幂(HDU Tr A 1575)

    题目中所给的方阵就是一个矩阵,而就是只要将题目所给矩阵不断进行相乘即可,本题中我采用的是直接重载运算符*,使矩阵每一个都进行运算,可以简化为只对对角线上的元素进行运算.最后所得结果就只需将最终的矩阵上 ...

  6. 《DSP using MATLAB》Problem 6.4

    结论: 正常直接II型流图和转换直接I型非常相似:正常直接I型流图和转换直接II型非常相似.

  7. Spring通知方法错误

    错误提示,主要最后一句话    ,花了2个小时 org.springframework.beans.factory.BeanCreationException: Error creating bean ...

  8. 每天进步一点点-实例为导学-一个java对象序列化的例子

    序列化和反序列化例子 如果我们想要序列化一个对象, (对象 转 序列)首先要创建某些OutputStream(如FileOutputStream.ByteArrayOutputStream等),然后将 ...

  9. Python——psutil的使用(获取系统性能信息)

    >>> import psutil #导入psutil >>> a=psutil.virtual_memory() >>> a.total #总虚 ...

  10. immutable-styles 基本试用

    此文档来自官方文档,从官方demo 学起比较快 安装 官方推荐的是通过webpack 的构建方式,通过babel loader clone 代码 git clone https://github.co ...