一个挺有意思的题目。
先把每一条边用编号当作边权,从第一条边开始扫描,用LCT维护当前的最大生成树。再用主席树记录删除的边即可。
我在add函数写错了,调了好久。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
template<typename T>inline void qr(T &x){x=0;int f=0;char s=getchar();while(s<'0'||'9'<s)f|=s=='-',s=getchar();while('0'<=s&&s<='9')x=x*10+s-48,s=getchar();x=f?-x:x;
}
const int mxn=3e5+10;
int n,m,q,T;
struct LCT{int sta[mxn];bool rv[mxn];int d[mxn],fa[mxn],ch[mxn][2],c[mxn];#define lc ch[x][0]#define rc ch[x][1]#define ls(x) ch[x][0]#define rs(x) ch[x][1]bool nrt(int x){return ls(fa[x])==x||rs(fa[x])==x;}void crv(int x){if(!x)return;swap(lc,rc);rv[x]^=1;}void pushdown(int x){if(rv[x])crv(lc),crv(rc),rv[x]=0;}void update(int x){c[x]=min(min(c[lc],c[rc]),d[x]);}void rotate(int x){int y=fa[x],z=fa[y],w=rs(y)==x;if(nrt(y))ch[z][rs(z)==y]=x;fa[x]=z;fa[ch[y][w]=ch[x][1-w]]=y;ch[x][1-w]=y;fa[y]=x;update(y);}void splay(int p){int x=p,tp=0;sta[++tp]=x;while(nrt(x))sta[++tp]=x=fa[x];while(tp)pushdown(sta[tp--]);x=p;while(nrt(x)){int y=fa[x],z=fa[y];if(nrt(y))(rs(z)==y)^(rs(y)==x)?rotate(x):rotate(y);rotate(x);}update(x);}void access(int x){for(int y=0;x;x=fa[y=x])splay(x),rc=y,update(x);}void makeroot(int x){access(x);splay(x);crv(x);}int findroot(int x){access(x);splay(x);while(lc)pushdown(x),x=lc;return x;}void split(int x,int y){makeroot(x);access(y);splay(y);}void link(int x,int y){makeroot(x);if(findroot(y)!=x)fa[x]=y;}bool check(int x,int y){makeroot(x);return findroot(y)!=x;}int add(int x,int y,int z){d[z+n]=c[z+n]=z;if(check(x,y)){link(x,z+n),link(z+n,y);return -1;}else{split(x,y);int now=c[y]+n;splay(now),fa[ls(now)]=fa[rs(now)]=0;link(x,z+n),link(z+n,y);return now-n;}}
}t1;
struct SegmentTree{#define mid (l+r)/2int lson[mxn*24],rson[mxn*24],c[mxn*24],cnt;void build(int &p,int l,int r,int k,int val){if(!p)p=++cnt;c[p]+=val;if(l==r)return;if(k<=mid)build(lson[p],l,mid,k,val);else build(rson[p],mid+1,r,k,val);}void merge(int &u1,int u2){if(!u1){u1=u2;return;}if(!u2)return;c[u1]+=c[u2];merge(lson[u1],lson[u2]);merge(rson[u1],rson[u2]);}int calc(int p,int l,int r,int x,int y){if(x<=l&&r<=y)return c[p];int dat=0;if(x<=mid)dat+=calc(lson[p],l,mid,x,y);if(mid<y)dat+=calc(rson[p],mid+1,r,x,y);return dat;}
}t2;int rt[mxn];
void get(int &l,int &r,int la){if(T>0){l=(l+T*la)%m+1;r=(r+T*la)%m+1;}if(l>r)swap(l,r);
}
int main(){qr(n),qr(m),qr(q),qr(T);for(int i=0;i<=n;i++)t1.c[i]=t1.d[i]=1e8;for(int i=1;i<=m;i++){int x,y,del;qr(x),qr(y);if(x!=y){del=t1.add(x,y,i);t2.build(rt[i],1,m,i,1);if(del!=-1)t2.build(rt[i],1,m,del,-1);}t2.merge(rt[i],rt[i-1]);}int la=0;while(q--){int x,y;qr(x),qr(y);get(x,y,la);la=n-t2.calc(rt[y],1,m,x,y);printf("%d\n",la);}return 0;
}

洛谷P5385 [Cnoi2019]须臾幻境相关推荐

  1. 【洛谷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 ...

  2. [Cnoi2019]须臾幻境(LCT维护最大生成树+主席树/分块)

    文章目录 title solution code title solution 一棵nnn个点的树有n−1n-1n−1条边. 一般的,对于森林而言则有点数-边数=树的个数 那么我们将无向图随便生成一个 ...

  3. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  4. 洛谷 P1142 轰炸

    洛谷 P1142 轰炸 题目描述 "我该怎么办?"飞行员klux向你求助. 事实上,klux面对的是一个很简单的问题,但是他实在太菜了. klux要想轰炸某个区域内的一些地方,它们 ...

  5. 洛谷 P1387 最大正方形

    P1387 最大正方形 题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=10 ...

  6. 洛谷P2763 试题库问题

    题目:https://www.luogu.org/problemnew/show/P2763 题目描述 «问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性. ...

  7. 动态规划——洛谷_P1057传球游戏

    题目: 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏.游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球, ...

  8. 洛谷P1417 烹调方案

    洛谷P1417 烹调方案 如果是一般的01背包的话 选的先后是没关系的 但是这题选的先后是有关系的,因为他的价值是随着时间而变化的, 而你的01背包是做不到先选2再选1的 那么我们就跟国王游戏一样 用 ...

  9. 记忆优化搜索(简单题)(洛谷P3183 [HAOI2016]食物链 )( P5635 【CSGRound1】天下第一 )

    昨天做了蓝桥杯的时候,发现自己对于记忆优化搜索甚是不熟悉,所以今天随便找了几个基础题做做,顺便写下两片题解,顺便用了一下devc++敲的代码,发现没有代码补全真的可以说是灰常难受了... 洛谷P318 ...

  10. 洛谷 - 试炼场(全部题目备份)

    整理的算法模板合集: ACM模板 目录 1.新手村 1 - 1 洛谷的第一个任务 1 - 2 顺序与分支 1 - 3 循环!循环!循环! 1 - 4 数组 1 - 5 简单字符串 1 - 6 过程函数 ...

最新文章

  1. 那些在家啃书自学的人,最后都找到工作了吗?
  2. java 常用类 练习_Java常用类之String类练习
  3. 云效 > 产品简介 > 产品概述
  4. eclipse经常高占用_高可用系统的设计指南
  5. Struts2学习笔记(十) OGNL
  6. JAVA获取各种日期时间
  7. matlab uicontrol 居中,matlab的uicontrol
  8. EditPlus 快捷键大全
  9. scienceWord总结
  10. 已分区的硬盘如何重新合并, 分出去的盘怎么重新合并
  11. 笔记本电脑计算机怎么放在桌面,苹果电脑怎么把文件放在桌面
  12. -fpie -pie_Google的Pie Noon,TI-83上的Super Smash Bros等
  13. Android HIDL 简介
  14. 租用游艇问题——动态规划
  15. 北京大学可视化发展前沿研究生暑期学校Day2
  16. 【C语言】用1,2,3,4四个数字组成不相同并且没有相同数字的三位数
  17. 《计算机科学与探索》期刊 从投稿到以为录用,再到拒稿过程
  18. python破解qq密码_央·python编程之QQ数据清洗
  19. 基础算法(二):高精度/前缀和与差分
  20. pytorch 给tensor增加一维(unsqueeze)或删除一维(squeeze)

热门文章

  1. Cannot find module ‘vite-plugin-compression‘ or its corresponding type declarations
  2. sklearn的roc_curve()函数分析
  3. STM32通过esp8266获取心知天气数据(hal库)
  4. Amazon,我们完全不能接受 — 因此我们必须变更 Elastic 许可协议
  5. excel文件打不开怎么办_移动硬盘打不开提示格式化怎么办?
  6. 干掉hao123恶意植入浏览器
  7. ceph 代码分析 读_Ceph代码分析
  8. Unity | 部分区域自由截图
  9. 适合点播应用的P2P加速系统
  10. C# 之 带你玩转命令行版《2048》 -- 附源码分享