以前做这个题简直是噩梦的难度

有个很神的做法就是 利用最简联通形式来统计联通块

把一个要求的区间写成一颗等价的树,,就有了统一的标准

然后考虑怎么构造这棵树,看每次加入的边,如果已经联通,则考虑把这个环上最早加的边弹出,这样可以在区间往右移时保留尽量多的边。

然后记录哪一条边被这一条边顶替

查询时对于一个区间,默认这个区间没有联通块   如果区间内弹出了区间内的边,则这一定是重复的边,和区间里的另一条边等价,就忽略这一条边

如果弹出了区间外的边,则在这个区间里这个边一定链接了两个联通块,联通块个数--

如果没有弹出边,则这一条边不与1~r的边矛盾,更不与l~r的边矛盾,所以联通块个数--

这样就可以用lct求出替代数组,用主席树求区间<l的数的个数,n-查询结果即是答案

注:

1、access不要忘了splay

2、边化为点时-n和两边link cut

3、查询和修改都在一颗主席树上时,注意区分赋值语句

4、主席树没有up

5、注意改用什么变量

码(1A(主席树+lct)的壮举):

#include<iostream>
#include<cstdio>
using namespace std;
#define N 200005
int v[N*40],op,tot,rt[N],ch2[N*40][2],ch[N<<1][2],ntr[N],q[N],z[N],a,b,c,lll,rrr,minn[N<<1],from[N<<1],val[N<<1],rev[N<<1],fu[N<<1],ans,i,j,n,m,k,type;
void gai(int last,int o,int l,int r)
{
if(op==0)   v[o]=v[last]+1;if(a<=l&&r<=b){if(op==1)
{c+=v[o]-v[last];
}return ;    }   int mid=(l+r)>>1;if(op==0)ch2[o][0]=ch2[last][0];if(op==0)ch2[o][1]=ch2[last][1];if(a<=mid){if(op==0)   ch2[o][0]=++tot;gai(ch2[last][0],ch2[o][0],l,mid);          }if(b>mid){if(op==0)   ch2[o][1]=++tot;gai(ch2[last][1],ch2[o][1],mid+1,r);}
}void up(int o)
{minn[o]=val[o];from[o]=o;if(ch[o][0]>0&&minn[ch[o][0]]<minn[o]){minn[o]=minn[ch[o][0]];from[o]=from[ch[o][0]];     }if(ch[o][1]>0&&minn[ch[o][1]]<minn[o]){minn[o]=minn[ch[o][1]];from[o]=from[ch[o][1]];     }
}
void down(int o)
{if(rev[o]){rev[o]^=1;rev[ch[o][0]]^=1;rev[ch[o][1]]^=1;   swap(ch[o][0],ch[o][1]);    }
}
void set(int o,int wh,int child)
{ch[o][wh]=child;fu[child]=o;up(o);
}int getwh(int o){return ch[fu[o]][0]==o?0:1;     }bool isrt(int o){if(fu[o]==0)return 1;if(ch[fu[o]][0]==o||ch[fu[o]][1]==o)return 0;return 1;}
void rotate(int o)
{int fa=fu[o];int ye=fu[fa];int wh=getwh(o);bool ysg=0;if(isrt(fa)==1)ysg=1;set(fa,wh,ch[o][wh^1]);set(o,wh^1,fa);fu[o]=ye;if(ysg==0)ch[ye][ch[ye][0]==fa?0:1]=o;
}
int sta[N];
void splay(int o)
{int top=0,i=o;sta[++top]=o;for(;isrt(i)==0;i=fu[i]){sta[++top]=fu[i];}for(i=top;i>=1;i--)down(sta[i]);for(;isrt(o)==0;rotate(o))if(isrt(fu[o])==0)getwh(o)==getwh(fu[o])?rotate(fu[o]):rotate(o);
}
void access(int o)
{int last=0;for(;o!=0;last=o,o=fu[o]){splay(o);ch[o][1]=last;  up(o);}
}
void huan(int o)
{access(o);splay(o);rev[o]^=1;
}
void link(int a,int b)
{huan(a);fu[a]=b;access(a);
}
void cut(int a,int b)
{huan(a);access(b);splay(b);ch[b][0]=fu[a]=0;
}
int main()
{
//注意初值!!! scanf("%d%d%d%d",&n,&m,&k,&type);for(i=1;i<=n;i++)val[i]=9999999;for(i=1;i<=m;i++){val[i+n]=i;scanf("%d%d",&a,&b);q[i]=a;z[i]=b;if(a!=b){access(a);splay(a);int l1=a,l2=b;while(ch[l1][0]!=0)l1=ch[l1][0];access(b);splay(b);while(ch[l2][0]!=0)l2=ch[l2][0];
if(l1==l2)
{huan(a);access(b);splay(b);ntr[i]=from[b]-n;int l3=from[b];cut(q[l3-n],l3);cut(l3,z[l3-n]);    link(a,i+n);    link(b,i+n);
}else
{link(a,i+n);    link(b,i+n);
}
}else ntr[i]=m;a=ntr[i]+1;b=ntr[i]+1;
rt[i]=++tot;
gai(rt[i-1],rt[i],1,m+1);
}
op=1;
for(i=1;i<=k;i++)
{scanf("%d%d",&lll,&rrr);if(type==1)lll^=ans,rrr^=ans;c=0;a=1,b=lll;gai(rt[lll-1],rt[rrr],1,m+1);ans=n-c;
printf("%d\n",ans);
}
}

2017.10.17 Codechef MARCH14 GERALD07加强版 失败总结相关推荐

  1. 【BZOJ3514】Codechef MARCH14 GERALD07加强版 LCT+主席树

    [BZOJ3514]Codechef MARCH14 GERALD07加强版 Description N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. Input 第一行 ...

  2. BZOJ 3514 Codechef MARCH14 GERALD07加强版

    从CC抠的题 xyz大神直接用分块秒 虽然会MLE+TLE 时限被改成40s了,我觉得30s足够了吧-- 考虑从左至右加入每一条边,加入某条边成环的环那么这条边对答案就没有影响.那么只要环上标号最小的 ...

  3. BZOJ 3514 Codechef MARCH14 GERALD07 加强版 LCT+主席树

    题意: N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. 分析: 据说有dalao会离线做这题? 看到L和R就能想到主席树?dalao们太强了-- 如果我们给出n个点,m ...

  4. bzoj3514: Codechef MARCH14 GERALD07加强版

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3514 思路:这题思路很巧妙 首先每个连通块只要保留一棵生成树的边就可以保证连通了 把每条边的 ...

  5. 【洛谷P5385】须臾幻境/【BZOJ3514】Codechef MARCH14 GERALD07加强版【LCT】【主席树】

    题意:有nnn个点mmm条边,qqq次询问连接区间[L,R][L,R][L,R]中的边后的连通块个数.强制在线. n,m,q≤2×105n,m,q\leq 2\times10^5n,m,q≤2×105 ...

  6. 【bzoj3514】 Codechef MARCH14 GERALD07加强版

    http://www.lydsy.com/JudgeOnline/problem.php?id=3514 (题目链接) 题意 给出$n$个点$m$条边的无向图,询问保留图中编号在$[l,r]$的边的时 ...

  7. 【BZOJ3514】Codechef MARCH14 GERALD07加强版,LCT+主席树

    Time:2016.08.06 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: 今天模拟题T3 结果是看都没看?? n,m<=1000 每次直接暴力并查集,O(n)判断 复杂度 ...

  8. BZOJ3514 Codechef MARCH14 GERALD07加强版 LCT维护最大生成树 主席树

    题面 考虑没有询问,直接给你一个图问联通块怎么做. 并查集是吧. 现在想要动态地做,那么应该要用LCT. 考虑新加进来一条边,想要让它能够减少一个联通块的条件就是现在边的两个端点还没有联通. 如果联通 ...

  9. 2017.10.17 蜘蛛难题 思考记录

    强烈建议不要做此题,此题描述差到极点!毒瘤出题人 首先有想法就是从起点往后按照出水管依次满足,但多个水域需要合起来求下一个最低出水口,所以并不是很好维护 所以最好按照时间模拟 先求出当前状态下的最低水 ...

最新文章

  1. LED液晶与OLED:电视显示技术比较
  2. centos lamp 连接mysql_centOS下lamp安装
  3. [Spring cloud 一步步实现广告系统] 13. 索引服务编码实现
  4. SVM学习笔记1-问题定义
  5. 深入浅出python机器学习_6.3.1_随机森林实例——要不要和相亲对象进一步发展
  6. 【Python基础】python必会的10个知识点
  7. openSSL命令、PKI、CA、SSL证书原理
  8. 【机器视觉】 HDevelop语言基础(二)-变量和表达式
  9. 数学大家闵嗣鹤:生死哥德巴赫猜想
  10. mac下载百度网盘文件限速_百度网盘限速怎么办 (20200412 )
  11. 基于SpringBoot的在线问卷调查管理系统
  12. Java操作Oracle数据库——ARRAY TABLE类型批量数据处理区别比较
  13. 《阴阳师·3黑川主》原作:梦枕貘
  14. 获取微信小程序wx.login 生成的code
  15. lr_Analysis结果分析工具
  16. win10如何删除microsoft账户并免密登录
  17. 彬彬偷偷告诉了平行世界的其他杰哥们这个世界里的杰哥已经得到了阿伟,于是他们也来到了这个世界想要教阿伟登Dua郎,现在他们“成群杰队”地赶来了!
  18. c语言对字库的查找程序,把已经调好的GT20L16S1Y字库芯片C语言驱动代码分享给大家。...
  19. 串流直播流媒体视频发布平台功能模块和产品技术参数
  20. 在excel中执行Sql语句,实现复杂查询

热门文章

  1. Android 布局 优先显示右侧的控件
  2. 高等组合学笔记(五): 加括号问题,集合的分类问题,多项式恒等式的组合证明
  3. PHP文件操作---文件file
  4. hypertrm超级终端_win7电脑怎么添加windows超级终端
  5. 计算机技能鉴定操作试题,计算机操作员中级操作技能考核试卷职业技能鉴定国家题库...
  6. Python04 直线拟合 多项式曲线拟合 指数曲线拟合(附代码)
  7. HTML通过java信息保存,如何使用java邮件API将HTML格式的数据保存为java邮件的主体?...
  8. 1_数据分析—数据载入、导出和探索
  9. Python MetaClass深入分析
  10. python中int用法,Python中int()函数的用法浅析