problem

7-14 传送门
平面上有 2n 个点,它们的坐标分别是 (1,0),(2,0),⋯(n,0) 和 (1,10
​9
​​ ),(2,10
​9
​​ ),⋯,(n,10
​9
​​ )。我们称这些点中所有 y 坐标为 0 的点为“起点”,所有 y 坐标为 10
​9
​​ 的点为终点。一个机器人将从坐标为 (x,0) 的起点出发向 y 轴正方向移动。显然,该机器人最后会到达某个终点,我们设该终点的 x 坐标为 f(x)。

在上述条件下,显然有 f(x)=x。不过这样的数学模型就太无趣了,因此我们对上述数学模型做一些小小的改变。我们将会对模型进行 q 次修改,每一次修改都是以下两种操作之一:

  • x
    ​′
    ​​ x
    ​′′
    ​​ y: 在 (x
    ​′
    ​​ ,y) 与 (x
    ​′′
    ​​ ,y) 处增加一对传送门。当机器人碰到其中一个传送门时,它会立刻被传送到另一个传送门处。数据保证进行该操作时,(x
    ​′
    ​​ ,y) 与 (x
    ​′′
    ​​ ,y) 处当前不存在传送门。
  • x
    ​′
    ​​ x
    ​′′
    ​​ y: 移除 (x
    ​′
    ​​ ,y) 与 (x
    ​′′
    ​​ ,y) 处的一对传送门。数据保证这对传送门存在。
    求每次修改后
    ​x=1
    ​∑
    ​n
    ​​ xf(x) 的值。

输入格式:
第一行输入两个整数 n 与 q (2≤n≤10
​5
​​ , 1≤q≤10
​5
​​ ),代表起点和终点的数量以及修改的次数。

接下来 q 行中,第 i 行输入一个字符 op
​i
​​ 以及三个整数 x
​i
​′
​​ , x
​i
​′′
​​ and y
​i
​​ (op
​i
​​ ∈{‘+’ (ascii: 43),‘-’ (ascii: 45)}, 1≤x
​i
​′
​​ <x
​i
​′′
​​ ≤n, 1≤y
​i
​​ <10
​9
​​ ),代表第 i 次修改的内容。修改顺序与输入顺序相同。

输出格式:
输出 q 行,其中第 i 行包含一个整数代表第 i 次修改后的答案。

输入样例:
5 4

  • 1 3 1
  • 1 4 3
  • 2 5 2
  • 1 4 3
    输出样例:
    51
    48
    39
    42
    样例解释:
    修改 | f(1) | f(2) | f(3) | f(4) | f(5) | 结果 — | — + 1 3 1 | 3 | 2 | 1 | 4 | 5 | 51 + 1 4 3 | 3 | 2 | 4 | 1 | 5 | 48 + 2 5 2 | 3 | 5 | 4 | 1 | 2 | 39 - 1 4 3 | 3 | 5 | 1 | 4 | 2 | 42

solution

/*
+ 一开始初始化成n条链,传送门对应链上的结点,将所有需要新增或者删除的传送门的y值离散化,存入链上。
+ 对于每个操作,实际上要做的是“分别查询两个结点各自所在链上的左右端点”和“将两个结点的后继结点交换”,用splay可以做到logq
*/
#include<bits/stdc++.h>
using namespace std;
typedef long  long LL;
const int maxn = 5e5+10, inf =1e9+10;int n, m;
struct node{int x1,x2,y1,y2;}qr[maxn];
vector<int>rt[maxn];#define l(u) ch[u][0]
#define r(u) ch[u][1]
int fa[maxn], ch[maxn][2], tot, X[maxn];
int sf(int u){return u== r(fa[u]);}
bool isrt(int u){return u!=l(fa[u])&&u!= r(fa[u]);}
void rot(int u){int v=fa[u],f= sf (u);if(!isrt(v))ch[fa[v]][sf(v)]= u;ch[v][f]=ch[u][f^1],fa[ch[v][f]]= v;fa[u]=fa[v],ch[u][f^1]=v,fa[v]= u;
}
int newnode(){int u=++tot; fa[u]=l(u)=r(u)= 0 ; return u;}
void splay(int u){ for(;!isrt(u); rot(u))if(!isrt(fa[u])&&sf(fa[u])==sf(u))rot(fa[u]);}
int fdl(int u){splay(u); for(;l(u); u=l(u)); splay(u); return u;}
int fdr(int u){splay(u); for(;r(u); u=r(u)); splay(u); return u;}int main(){ios::sync_with_stdio(false);cin>>n>>m;for(int i=1; i <= m; i++){char ch;  cin>>ch;cin>>qr[i].x1>>qr[i].x2>>qr[i].y1;}for(int i=1; i <= n; i++){rt[i].push_back(0);  rt[i].push_back(inf);}for(int i=1; i <= m; i++){rt[qr[i].x1].push_back(qr[i].y1);rt[qr[i].x2].push_back(qr[i].y1);}for(int i=1; i <= n; i++){sort(rt[i].begin(),rt[i].end());rt[i].resize(unique(rt[i].begin(),rt[i].end()) - rt[i].begin());}for(int i=1; i <= m; i++){int y = qr[i].y1;qr[i].y1= lower_bound(rt[qr[i].x1].begin(),rt[qr[i].x1].end(),y)- rt[qr[i].x1].begin();qr[i].y2=lower_bound(rt[qr[i].x2].begin(),rt[qr[i].x2].end(),y)- rt[qr[i].x2].begin( );}for(int i=1; i <= n; i++){for(int j=0; j<rt[i].size(); j++){rt[i][j]=newnode(); X[rt[i][j]]= i;}for(int j=0; j<rt[i].size()-1; j++){r(rt[i][j])=rt[i][j+1],fa[rt[i][j+1]]= rt[i][j];}}LL ans=(LL)n*(n+1)*(2*n+1)/6;for(int i=1; i <= m; i++){int x1=qr[i].x1,x2=qr[i].x2,y1=qr[i].y1,y2=qr[i].y2;int u=rt[x1][y1],v= rt[x2][y2];int lu=X[fdl(u)],ru=X[fdr(u)],lv=X[fdl(v)],rv= X[fdr(v)];ans-=(LL)lu*ru+(LL)lv*rv;ans+=(LL)lu*rv+(LL) lv*ru;splay(u),splay(v);int u2=r(u),v2=r(v);r(u)=v2,r(v)=u2,fa[v2]=u,fa[u2]=v;cout<<ans<<"\n";}return 0;
}

【CCCC】L3-026 传送门 (30分),splay(待复盘)相关推荐

  1. 【CCCC】L3-023 计算图 (30分),dfs搜索+偏导数计算

    problem L3-023 计算图 (30分) "计算图"(computational graph)是现代深度学习系统的基础执行引擎,提供了一种表示任意数学表达式的方法,例如用有 ...

  2. 【CCCC】L3-009 长城 (30分),计算几何+凸包,极角排序

    problem L3-009 长城 (30分) 正如我们所知,中国古代长城的建造是为了抵御外敌入侵.在长城上,建造了许多烽火台.每个烽火台都监视着一个特定的地区范围.一旦某个地区有外敌入侵,值守在对应 ...

  3. 【CCCC】L3-021 神坛 (30分)计算几何+求三角形面积(极角排序)

    problem L3-021 神坛 (30分) 在古老的迈瑞城,巍然屹立着 n 块神石.长老们商议,选取 3 块神石围成一个神坛.因为神坛的能量强度与它的面积成反比,因此神坛的面积越小越好.特殊地,如 ...

  4. 【CCCC】L3-011 直捣黄龙 (30分),Dijkstra维护点权,节点数,路径条数等+路径打印

    problem L3-011 直捣黄龙 (30分) 本题是一部战争大片 -- 你需要从己方大本营出发,一路攻城略地杀到敌方大本营.首先时间就是生命,所以你必须选择合适的路径,以最快的速度占领敌方大本营 ...

  5. 【CCCC】L3-006 迎风一刀斩 (30分),几何关系,找规律 (拼合多边形==斜边等价)

    problem 题意:给出n对多边形,判断每一对多边形是否是由一块矩形一刀切下形成的. solution 一个矩形被切,有4种情况 切到0个顶点,三角形+五边形,或四边形+四边形 切到1个顶点,三角形 ...

  6. 【CCCC】L3-025 那就别担心了 (30分),dfs搜索起点到终点的路径条数。

    problem L3-025 那就别担心了 (30分) 下图转自"英式没品笑话百科"的新浪微博 -- 所以无论有没有遇到难题,其实都不用担心. ziqia.jpg 博主将这种逻辑推 ...

  7. 【CCCC】L3-019 代码排版 (30分),大模拟

    problem L3-019 代码排版 (30分) 某编程大赛中设计有一个挑战环节,选手可以查看其他选手的代码,发现错误后,提交一组测试数据将对手挑落马下.为了减小被挑战的几率,有些选手会故意将代码写 ...

  8. 【CCCC】L3-022 地铁一日游 (30分),floyd+大模拟

    problem L3-022 地铁一日游 (30分) 森森喜欢坐地铁.这个假期,他终于来到了传说中的地铁之城--魔都,打算好好过一把坐地铁的瘾! 魔都地铁的计价规则是:起步价 2 元,出发站与到达站的 ...

  9. 【CCCC】L3-018 森森美图 (30分),计算几何+判断三点共线+bfs最短路

    problem L3-018 森森美图 (30分) 森森最近想让自己的朋友圈熠熠生辉,所以他决定自己写个美化照片的软件,并起名为森森美图.众所周知,在合照中美化自己的面部而不美化合照者的面部是让自己占 ...

最新文章

  1. ASP.NET MVC 3中ViewBag, ViewData和 TempData
  2. Python 炫技操作:海象运算符的三种用法
  3. JAVA中的异常的触发_java中的异常
  4. Loader的load方法和loadBytes方法LoaderContext参数
  5. php程序员可能不了解的编程细节
  6. Java 数组实现堆栈操作
  7. 密立根油滴实验的计算机仿真实验报告,H-D光谱实验的计算机仿真
  8. 笔记-配置博客园客户端代码高亮(2016.08.20)
  9. java读xml文件一般用什么_java读xml文件
  10. DRL实战 : 强化学习在广告点击业务中的应用
  11. mysql-plus多数据库_MyBatis-Plus实现多数据源的示例代码
  12. vm虚拟机win7安装镜像方法
  13. 360随身wifi3代linux驱动下载,360随身wifi3驱动
  14. 水下钢质管道防渗漏水泥设备用环氧玻璃鳞片面漆 固体份含量高
  15. 【VB数组小例】产生随机数并求和(附带添加图片用法)
  16. 【项目实战——emos在线办公系统】:组件之间的相互使用、请假页面、添加请假组件之间的关系梳理、model和v-model
  17. ACM求多边形重心和面积问题
  18. 内部基因决定拼购品质,苏宁拼购或将成为行业发展新标杆
  19. 昆仑万维重磅发布AIGC全系列算法与模型,领跑未来
  20. 山东省第五届ACM大学生程序设计竞赛 Colorful Cupcakes

热门文章

  1. The Python Challenge 题解
  2. 递推公式与递归退出的条件
  3. 推理集 —— 物品与动物
  4. UNIX 环境高级编程(二)—— linux共享库,/etc/ld.so.conf 及 ld.so.conf.d/libc.conf
  5. python爬虫菜鸟教程-Python 应该怎么学?
  6. python中文叫什么-python中文别名
  7. python能做什么游戏-Python有做大型游戏的潜力吗?
  8. python从入门到放弃pdf下载-《Python3从入门到放弃》视频教程
  9. 艾媒2018年度手机输入法报告出炉:百度输入法是语音识别最准的输入法
  10. bootstrap的依赖_这五款超好用的Bootstrap扩展,让你的Web开发事半功倍