从CC抠的题 xyz大神直接用分块秒 虽然会MLE+TLE

时限被改成40s了,我觉得30s足够了吧……

考虑从左至右加入每一条边,加入某条边成环的环那么这条边对答案就没有影响。那么只要环上标号最小的边没被加入就会对答案有影响。

所以问题变成了区间询问小于某个数的数有多少个,这个主席树就行了。

至于前面那一步,用动态树求出来就行了。

  1 #include<cstdio>
  2 #include<cstdlib>
  3 #include<cstring>
  4 #include<cctype>
  5 #include<algorithm>
  6
  7 using namespace std;
  8
  9 const int BUF_SIZE = 30;
 10 char buf[BUF_SIZE], *buf_s = buf, *buf_t = buf + 1;
 11
 12 #define PTR_NEXT() \
 13     { \
 14         buf_s ++; \
 15         if (buf_s == buf_t) \
 16         { \
 17             buf_s = buf; \
 18             buf_t = buf + fread(buf, 1, BUF_SIZE, stdin); \
 19         } \
 20     }
 21
 22 #define readint(_n_) \
 23     { \
 24         while (*buf_s != '-' && !isdigit(*buf_s)) \
 25             PTR_NEXT(); \
 26         bool register _nega_ = false; \
 27         if (*buf_s == '-') \
 28         { \
 29             _nega_ = true; \
 30             PTR_NEXT(); \
 31         } \
 32         int register _x_ = 0; \
 33         while (isdigit(*buf_s)) \
 34         { \
 35             _x_ = _x_ * 10 + *buf_s - '0'; \
 36             PTR_NEXT(); \
 37         } \
 38         if (_nega_) \
 39             _x_ = -_x_; \
 40         (_n_) = (_x_); \
 41     }
 42
 43 const int maxn=200010;
 44 const int maxp=maxn*20;
 45 const int INF=0x3f3f3f3f;
 46
 47 int n,m,k,wmt,type,s[maxn],e[maxn],root[maxn];
 48
 49 struct tree_node
 50 {
 51     int l,r;
 52     int sum;
 53     void init()
 54     {
 55         l=r=sum=0;
 56     }
 57 }y[maxp];
 58
 59 int newnode()
 60 {
 61     y[++wmt].init();
 62     return wmt;
 63 }
 64
 65 int insert(int p,int l,int r,int v)
 66 {
 67     int pp=newnode();
 68     if (l==r)
 69     {
 70         y[pp].sum=y[p].sum+1;
 71         return pp;
 72     }
 73     int m=(l+r)>>1;
 74     if (v<=m)
 75     {
 76         y[pp].l=insert(y[p].l,l,m,v);
 77         y[pp].r=y[p].r;
 78     }
 79     else
 80     {
 81         y[pp].l=y[p].l;
 82         y[pp].r=insert(y[p].r,m+1,r,v);
 83     }
 84     y[pp].sum=y[y[pp].l].sum+y[y[pp].r].sum;
 85     return pp;
 86 }
 87
 88 int query(int p1,int p2,int l,int r,int nowl,int nowr)
 89 {
 90     if (nowl<=l && r<=nowr) return y[p1].sum-y[p2].sum;
 91     int m=(l+r)>>1;
 92     if (nowl<=m)
 93     {
 94         if (m<nowr) return query(y[p1].l,y[p2].l,l,m,nowl,nowr)+query(y[p1].r,y[p2].r,m+1,r,nowl,nowr);
 95         else return query(y[p1].l,y[p2].l,l,m,nowl,nowr);
 96     }
 97     else return query(y[p1].r,y[p2].r,m+1,r,nowl,nowr);
 98 }
 99
100 struct node
101 {
102     int l,r,f,v,minv;
103     bool rev,rt;
104     void init()
105     {
106         l=r=f=0;
107         rev=false;
108         rt=true;
109         minv=INF;
110     }
111 }z[maxn<<1];
112
113 void update(int x)
114 {
115     z[x].minv=z[x].v;
116     if (z[x].l) z[x].minv=min(z[x].minv,z[z[x].l].minv);
117     if (z[x].r) z[x].minv=min(z[x].minv,z[z[x].r].minv);
118 }
119
120 void rot_l(int x)
121 {
122     int y=z[x].r;
123     z[x].r=z[y].l;
124     z[y].l=x;
125     if (z[x].rt) z[x].rt^=1,z[y].rt^=1;
126     else
127     {
128         if (z[z[x].f].l==x) z[z[x].f].l=y;
129         else z[z[x].f].r=y;
130     }
131     z[y].f=z[x].f;
132     z[x].f=y;
133     z[z[x].r].f=x;
134 }
135
136 void rot_r(int x)
137 {
138     int y=z[x].l;
139     z[x].l=z[y].r;
140     z[y].r=x;
141     if (z[x].rt) z[x].rt^=1,z[y].rt^=1;
142     else
143     {
144         if (z[z[x].f].l==x) z[z[x].f].l=y;
145         else z[z[x].f].r=y;
146     }
147     z[y].f=z[x].f;
148     z[x].f=y;
149     z[z[x].l].f=x;
150 }
151
152 void push(int x)
153 {
154     if (z[x].rev)
155     {
156         z[z[x].l].rev^=1;
157         swap(z[z[x].l].l,z[z[x].l].r);
158         z[z[x].r].rev^=1;
159         swap(z[z[x].r].l,z[z[x].r].r);
160         z[x].rev^=1;
161     }
162 }
163
164 void splay(int x)
165 {
166     while (!z[x].rt)
167     {
168         int f=z[x].f;
169         int ff=z[f].f;
170         push(ff);
171         push(f);
172         push(x);
173         if (z[f].rt)
174         {
175             if (z[f].l==x) rot_r(f);
176             else rot_l(f);
177         }
178         else
179         {
180             if (z[ff].l==f && z[f].l==x)
181             {
182                 rot_r(ff);
183                 rot_r(f);
184             }
185             if (z[ff].l==f && z[f].r==x)
186             {
187                 rot_l(f);
188                 rot_r(ff);
189             }
190             if (z[ff].r==f && z[f].l==x)
191             {
192                 rot_r(f);
193                 rot_l(ff);
194             }
195             if (z[ff].r==f && z[f].r==x)
196             {
197                 rot_l(ff);
198                 rot_l(f);
199             }
200         }
201         update(ff);
202         update(f);
203     }
204     update(x);
205     push(x);
206 }
207
208 void access(int x)
209 {
210     int p1=x,p2=0;
211     do
212     {
213         splay(p1);
214         z[z[p1].r].rt=true;
215         z[p2].rt=false;
216         z[p1].r=p2;
217         z[p2].f=p1;
218         update(p1);
219         p2=p1;
220         p1=z[p1].f;
221     }while(p1);
222 }
223
224 void join(int p1,int p2)
225 {
226     access(p1);
227     splay(p1);
228     z[p1].rev^=1;
229     swap(z[p1].l,z[p1].r);
230     z[p1].f=p2;
231 }
232
233 void cut(int p1,int p2)
234 {
235     access(p1);
236     splay(p2);
237     if (z[p2].f==p1) z[p2].f=0;
238     else
239     {
240         access(p2);
241         splay(p1);
242         z[p1].f=0;
243     }
244 }
245
246 bool connect(int p1,int p2)
247 {
248     access(p2);
249     for (;p1;p1=z[p1].f)
250     {
251         splay(p1);
252         if (!z[p1].f) break;
253     }
254     for (;z[p1].r;p1=z[p1].r);
255     return p1==p2;
256 }
257
258 int query(int x,int y)
259 {
260     access(y);
261     int ans=INF;
262     for (y=0;x;x=z[x].f)
263     {
264         splay(x);
265         if (!z[x].f)
266         {
267             ans=z[x].v;
268             if (y) ans=min(ans,z[y].minv);
269             if (z[x].r) ans=min(ans,z[z[x].r].minv);
270             break;
271         }
272         z[z[x].r].rt=true;
273         z[y].rt=false;
274         z[x].r=y;
275         y=x;
276         update(y);
277     }
278     return ans;
279 }
280
281
282 int main()
283 {
284
285     readint(n);
286     readint(m);
287     readint(k);
288     readint(type);
289     for (int a=1;a<=m;a++)
290     {
291         readint(s[a]);
292         readint(e[a]);
293     }
294     for (int a=1;a<=n+m;a++)
295     {
296         z[a].init();
297         if (a<=n) z[a].v=z[a].minv=INF;
298         else z[a].v=z[a].minv=a-n;
299     }
300     wmt=0;
301     for (int a=1;a<=m;a++)
302     {
303         int p1=s[a],p2=e[a];
304         if (p1==p2)
305         {
306             root[a]=insert(root[a-1],0,m,a);
307             continue;
308         }
309         if (connect(p1,p2))
310         {
311             int value=query(p1,p2);
312             cut(value+n,s[value]);
313             cut(value+n,e[value]);
314             root[a]=insert(root[a-1],0,m,value);
315             join(a+n,p1);
316             join(a+n,p2);
317         }
318         else
319         {
320             root[a]=insert(root[a-1],0,m,0);
321             join(a+n,p1);
322             join(a+n,p2);
323         }
324     }
325     int l,r;
326     for (int a=1,lastans=0;a<=k;a++)
327     {
328         readint(l);
329         readint(r);
330         if (type==1) l^=lastans,r^=lastans;
331         printf("%d\n",(lastans=n-query(root[r],root[l-1],0,m,0,l-1)));
332     }
333
334     return 0;
335 }

View Code

转载于:https://www.cnblogs.com/zhonghaoxi/p/3651591.html

BZOJ 3514 Codechef MARCH14 GERALD07加强版相关推荐

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

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

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

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

  3. 【bzoj3514】 Codechef MARCH14 GERALD07加强版

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

  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加强版,LCT+主席树

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

  7. 2017.10.17 Codechef MARCH14 GERALD07加强版 失败总结

    以前做这个题简直是噩梦的难度 有个很神的做法就是 利用最简联通形式来统计联通块 把一个要求的区间写成一颗等价的树,,就有了统一的标准 然后考虑怎么构造这棵树,看每次加入的边,如果已经联通,则考虑把这个 ...

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

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

  9. BZOJ 3221: [Codechef FEB13] Obserbing the tree树上询问( 可持久化线段树 + 树链剖分 )

    树链剖分+可持久化线段树....这个一眼可以看出来, 因为可持久化所以写了标记永久化(否则就是区间修改的线段树的持久化..不会), 结果就写挂了, T得飞起...和管理员拿数据调后才发现= = 做法: ...

最新文章

  1. Java项目:网上电商项目(前后端分离+java+vue+Springboot+ssm+mysql+maven+redis)
  2. matlab与python通信_python和matlab之间数据传输方法
  3. live2d模型_使用二次元模型动画人物让自己网站“骚起来”
  4. nginx压力测试和并发预估
  5. Linux 第60,61天 ansible的playbook
  6. Python学习笔记__4.1章 高阶函数
  7. Android 内存详细分析
  8. django基础1--django安装与helloworld测试
  9. mybatis简单案例源码详细【注释全面】——Dao层接口(UserMapper.java)
  10. java.io.file.sync_Java(25)IO流和File类
  11. 列表(list)和集合(set)
  12. java jdom追加节点_java-使用xpath和jdom选择一个节点
  13. 【黑马JS比较】用JavaScripts的DOM对象实现动态表格
  14. python内存分配失败_关于python:如何避免[Errno 12]无法分配使用子进程模块导致的内存错误...
  15. myeclipse服务器未能创建视图:抛出意外异常。
  16. 游戏开发学什么?四步修炼骨灰级高手
  17. CDISC STANDARD
  18. phython入门基础
  19. 嵌入式蓝桥杯G431RBT6 串口配置及使用方法cube MX
  20. Python基础与拾遗1:Python中的数字

热门文章

  1. Hadoop MapReduce手机上网流量统计代码示例及运行结果演示
  2. Linux uptime指令
  3. JVM 调优实战--常用JVM命令:jps/jinfo/jstat/jmap/jstack/jhat
  4. “优秀IT工程师”是什么样的?
  5. php过滤第一个逗号和最后一个逗号,PHP字符过滤函数去除字符串最后一个逗号(rtrim)...
  6. Linux 之八 完整嵌入式 Linux 环境、(交叉)编译工具链、CPU 体系架构、嵌入式系统构建工具
  7. 面向对象2(构造方法、抽象类、接口)
  8. 宝典9.2——海量数据的基本处理方法
  9. 模型摆完pose怎么对称_糖分过浓警告!108个情侣写真pose,太好拍了!
  10. 插件压敏电阻,有哪些?