【GDOI2018模拟9.23】动态图

三体究竟有多可怕?用Python建模来深度了解 全文共7726字,预计学习时长15分钟或更长图片来自flickr, 凯文·吉尔中国作家刘慈欣的科幻小说《三体》中描绘了存在于被三颗恒星环绕的“三体”星球上的一种虚构外星文... 阅读详情

Description:

这里写图片描述
1<=n<=10^6,1<=q<=200000

题解:

暴力可以用按秩合并并查集,这个数据结构支持删除。

对于正解,我们需要把l->r条边一次加进并查集,对于每一条边,它有贡献,就是加入它的时候,它会合并两个不同的集合。
反过来,它没有贡献,就是它所连着的两端本来就在一个集合里。

假设我们按1->r的顺序加入每一条边,当加入一条边时,设它是x,y,设z为x到y的路径上编号最小的边(x,y不在一个集合里是0)的编号,那么如果有询问包含这条边,且左端点小于等于z,那么当前这条边就是没有贡献的,否则它就是有贡献。

于是用lct维护一棵最大生成树,就可以求出z,再用主席树随便维护一下就行了。

Code:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define fo(i, x, y) for(int i = x; i <= y; i ++)
#define min(a, b) ((a) < (b) ? (a) : (b))
using namespace std;

const int N = 1000000, M = 200005;
int n, q, type, tt, u, v, l, r, ans, m;
int t[N + M][2], fa[N + M], pf[N + M], rev[N + M], mi[N + M], dd[N + M];
int g[N + M], tot;
struct tree{
    int l, r, s;
}d[N * 10];
struct edge {
    int u, v, x, y, z;
}e[N + M];
int last[N + M];

int lr(int x) {return t[fa[x]][1] == x;}
void chan(int x) {if(x) swap(t[x][0], t[x][1]), rev[x] ^= 1;}
void down(int x) {if(x && rev[x]) chan(t[x][0]), chan(t[x][1]), rev[x] = 0;}
void update(int x) {
    if(!x) return;
    mi[x] = min(mi[t[x][0]], mi[t[x][1]]);
    if(x > N) mi[x] = min(mi[x], x - N);
}
void xc(int x) {
    for(; x; x = fa[x]) dd[++ dd[0]] = x;
    for(; dd[0]; dd[0] --) down(dd[dd[0]]);
}
void rotate(int x) {
    int y = fa[x], k = lr(x);
    t[y][k] = t[x][!k]; if(t[x][!k]) fa[t[x][!k]] = y;
    fa[x] = fa[y]; if(fa[y]) t[fa[y]][lr(y)] = x;    
    t[x][!k] = y; fa[y] = x; pf[x] = pf[y];
    update(y); update(x);
}
void splay(int x, int y) {
    xc(x);
    while(fa[x] != y) {
        if(fa[fa[x]] != y)
            if(lr(x) == lr(fa[x])) rotate(fa[x]); else rotate(x);
        rotate(x);
    }
}
void dg(int x) {
    if(x == 0) return;
    down(x);
    printf("%d %d %d %d tree\n", x, mi[x], t[x][0], t[x][1]);
    dg(t[x][0]); dg(t[x][1]);
}
void access(int x) {
    int y = 0;
    while(x) {
        splay(x, 0); fa[t[x][1]] = 0; pf[t[x][1]] = x;
        t[x][1] = y; fa[y] = x; pf[y] = 0;
        update(x); y = x; x = pf[x];
    }    
}
void makeroot(int x) {
    access(x); splay(x, 0); chan(x);
}
void link(int x, int y) {
    makeroot(x); pf[x] = y; access(x);
}
void cut(int x, int y) {
    makeroot(x); access(y); splay(y, 0);
    t[y][0] = fa[x] = pf[x] = 0;
    update(y);
}
int find_z(int x) {
    down(x);
    return t[x][0] == 0 ? x : find_z(t[x][0]);
}

int pd(int x, int y) {
    makeroot(x); access(y); splay(y, 0);
    return find_z(y) == x;
}

void change(int i, int x, int y, int l, int r) {
    if(x == y) {
        d[i].s += r;
        return;
    }
    int m = (x + y) >> 1;
    d[++ tot] = d[d[i].l], d[i].l = tot;
    d[++ tot] = d[d[i].r], d[i].r = tot;
    if(l <= m) change(d[i].l, x, m, l, r); else change(d[i].r, m + 1, y, l, r);
    d[i].s = d[d[i].l].s + d[d[i].r].s;
}

int find(int i, int x, int y, int l, int r) {
    if(i == 0) return 0;
    if(x == l && y == r) return d[i].s;
    int m = (x + y) >> 1;
    if(r <= m) return find(d[i].l, x, m, l, r); else
    if(l > m) return find(d[i].r, m + 1, y, l, r); else
    return find(d[i].l, x, m, l, m) + find(d[i].r, m + 1, y, m + 1, r);
}

const int Mm = 200000;

void xiu(int m, int last) {
    g[m] = ++ tot; d[g[m]] = d[g[m - 1]];
    change(g[m], 0, Mm, last, 1);
}

int qiu(int l, int r) {
    return find(g[r], 0, Mm, 0, l - 1) - find(g[l - 1], 0, Mm, 0, l - 1);
}

int main() {
    freopen("graph.in", "r", stdin);
    freopen("graph.out", "w", stdout);
    scanf("%d %d %d", &n, &q, &type);
    fo(i, 0, N) mi[i] = 1e9;
    g[0] = tot = 1;
    fo(Q, 1, q) {
        scanf("%d", &tt);
        if(tt == 1) {
            scanf("%d %d", &u, &v);
            if(type) u = (u ^ ans) % n + 1; 
            if(type) v = (v ^ ans) % n + 1;
            e[++ m].u = u, e[m].v = v;
            if(u == v) {
                last[m] = m; xiu(m, m);
                continue;
            }
            if(pd(u, v)) {
                makeroot(u); access(v); splay(v, 0);
                int z = mi[v];
                e[m].x = e[z].u; e[m].y = e[z].v; e[m].z = z;
                cut(e[m].x, e[m].z + N); cut(e[m].y, e[m].z + N);
                link(u, m + N); link(v, m + N);
                last[m] = z; xiu(m, z);
            } else {
                link(u, m + N); link(v, m + N);
                last[m] = 0; xiu(m, 0);
            }
        } else
        if(tt == 2) {
            if(e[m].u == e[m].v) {
                m --; continue;
            }
            if(last[m]) {
                cut(e[m].u, m + N); cut(e[m].v, m + N);
                link(e[m].x, e[m].z + N); link(e[m].y, e[m].z + N);
            } else {
                cut(e[m].u, m + N); cut(e[m].v, m + N);
            }
            m --;
        } else {
            scanf("%d %d", &l, &r);
            if(type) l = (l ^ ans) % m + 1;
            if(type) r = (r ^ ans) % m + 1;
            if(l > r) swap(l, r);
            ans = n - qiu(l, r);
            printf("%d\n", ans);
        }
    }
}
3D版三体运动模拟器 3D版三体运动模拟器。可以设定模式和初始参数完成三体运动模型。 立即下载

相关推荐

三体运动模拟演示动画

FLASH计算演示. 演示了存在两个太阳时,行星只受万有引力作用时的运行轨迹.最多可模拟4颗行星.

HTML技巧100例

HTML技巧100例fade_sea 发表于 2005-12-4 0:30:021. 链接控制 返回前页:使用OnClick="history.go(-1)",如 返回主页:使用OnClick=top.location.href="../chinamail.html",如 2. 链接提示 在链接语句中增加OnMouseOver="window.status=这里是 ...; return

Qi_jianzhou的资料室 1808

VC++6.0和OpenGL做的模拟自由落体动态图

本资源是VC++6.0和OpenGL做的模拟自由落体动态图

三体问题的flash模拟

呼呼,flash也有希望跻身科学计算领域了。

猪宝斋 1031

三体模拟系统

三体模拟系统,可以玩玩!

实际项目演示GIF动图

是本人参加过的实际项目演示GIF动图,这里挑三个个人认为比较好的上传

JZOJ 5387【GDOI2018模拟9.23】动态图

题目Time Limits: 1000 ms Memory Limits: 262144 KB Description InputOutput Sample Input5 3 0 1 4 5 1 2 4 3 1 2Sample Output3Data Constraint 题解鸟(雀)题一道。。。做法:函数式线段树+lct在每一次加入一条边i的时候,我们记录一个last[i] 如

Marcus 1356

三体问题:用动画模拟三体问题-matlab开发

使用 ode45 解决三体引力问题。

【JZOJ5679】【GDOI2018Day2模拟4.21】山景城(博弈+树形DP+二分)

Problem   给定一棵n个节点的树,基德一开始在点s,Kris想让基德进入点t。   每一秒钟: Kris 在这一秒的开始,可以进行决策:1) 不操作;2) 炸毁一条还存在的走廊,操作过后这条走廊将不复存在;3) 清除一条走廊上被怪盗基德留下标记。 怪盗基德在这一秒的末尾,有可能会移动:假设基德此刻正处于 p 号展厅,若从 p 号展厅出发通往相邻展厅的每条走廊都被画上了标记,那么基德...

qq_36551189的博客 309

OpenGL三维动态图

OPENGL三维动态图绘制

ESP-01S获取网络时间踩坑全记录:AT指令调试、JSON解析乱码、时区处理,一个都不能少

本文详细记录了使用ESP-01S WIFI模块获取网络时间的完整过程,包括AT指令调试、JSON解析乱码处理以及时区转换等关键步骤。通过实战案例和代码示例,帮助开发者避开常见陷阱,实现稳定的网络时间同步功能。

weixin_30460489的博客 295

python模拟“三体运动”轨迹

python讨论qq群:996113038导语:相信有很多朋友看过《三体》这部科幻小说。里面谈到过三体问题,这是一个不可预测的混沌系统。三体文明就是在这种逆境中发展,也就是因为三体问题无...

qq_42680814的博客 6690

保姆级教程:用Python 3.10和Ollama在Windows上搞定LightRAG本地部署(附环境配置避坑指南)

本文提供了一份详细的Windows系统下LightRAG本地部署指南,涵盖Python 3.10环境配置、Ollama模型服务安装到LightRAG核心组件部署的全流程。特别针对Windows平台常见问题提供解决方案,帮助开发者快速搭建高效的检索增强生成(RAG)系统,实现专业领域知识的智能检索与整合。

weixin_28725407的博客 483

利用matlab实现三体问题(双星、3星、多星运动)

利用matlab实现3体问题(双星、3星、多星运动) 1地月系统模拟 2双星问题模型 3多星问题模拟2维平面3维空间

hyhhyh21的博客 1万+

ChatGPT设置密钥后Codex免手机验证:配置顺序与身份凭证复用机制

API Key 是一种用于身份识别的凭证,其核心原理是通过预配置的密钥替代交互式登录流程。在开发工具中,密钥认证优先级通常高于会话认证,当本地存在有效密钥时,工具会直接复用该凭证,从而减少重复验证环节。这种机制的技术价值在于提升开发效率与配置一致性,尤其适用于多设备切换、CI/CD 流水线及编程辅助工具等场景。以 Codex 为例,在 ChatGPT 界面提前配置 API 密钥后,Codex 启动时可读取持久化存储的密钥,避免触发手机号验证,实现身份凭证的跨入口复用。

weixin_33940469的博客 474

LSF调度实战:如何用bsub命令实现多队列资源抢占与公平调度

本文深入探讨了LSF作业调度系统的高级实战技巧,重点解析如何通过配置`lsb.queues`文件与灵活运用`bsub -R`命令,构建一套兼顾效率与公平的多队列资源抢占与调度体系。文章详细介绍了队列优先级设计、公平共享机制、资源感知调度以及抢占策略的实施,帮助集群管理员解决高优先级任务等待、资源分配不均等常见问题,实现计算资源的精细化管理和高效利用。

vvv99的博客 218

《三体》:三体问题的三百年

最近读刘老师的科幻大作《三体》入了迷,顺便在网上找了一些关于三体问题的文章来看,贴在这里以作收藏:) N体问题的三百年 作者: dsds  发布日期: 2004-12-07    查看数: 3488   出自: http://support.iap.ac.cn/portal/viewarticle.php?id=290天体运行的数学原理------N体问题的三百年 1。N体问题的起源和早期

菩提葡萄 4278

在win10-wsl2(ubuntu)中安装jlink

在 官方下载linux版本的deb包拷贝到ubuntu的/home目录下(其他目录也可以),进行安装然后提示很多依赖缺失的错误,此时执行自动安装需要的依赖包再次重新安装就可以啦查看是否安装成功,输入JLink 再按下两次Table键,是否如下所示这样表示安装成功了。

yaq_30401的博客 3138

【创意编程】《无限》:宇宙、三体、星云和轨迹

【创意编程】《无限》:宇宙、三体、星云和蚕丝 ———————————————————————————————— ———————————————————————————————— 一颗恒星。不知道有多少不起眼的小行星日日夜夜绕着它,有些却飞向无限的远点。宇宙有限吗?它们还会回来吗? 一个没有调好的三体模型 不知道什么给我的灵感,也不知道从哪来的想法,想着既然要做一个力,不如做大点,做个大的,甚至...

qq_41713179的博客 1059

SAP BTP ABAP RAP 开发对象命名规范与落地实践

摘要:SAP BTP ABAP开发中的命名规范实践 在企业级ABAP开发中,命名规范是提升交付效率的工程化手段。SAP推荐采用[/<namespace>/][<prefix>]_<object_name>_[<suffix>]的结构化命名框架,解决多对象、多团队的协同问题。关键实践包括:使用组织专属命名空间避免冲突;通过prefix区分同类型对象的不同语义(如UI_/API_);object_name体现业务语义而非技术细节;suffix表达次级差异。在具体对

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1434

汽车零部件产线实战:C#上位机+YOLO实现螺栓装配到位视觉检测

本项目基于C#上位机+YOLOv8实现汽车零部件产线螺栓装配到位视觉检测,全程贴合产线实际场景,从硬件选型、安装调试,到模型训练、上位机开发,再到项目联调、优化扩展,均提供手把手实操指导,代码可直接复制使用,规避了工业视觉产线检测的高频踩坑点。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1330

MATLAB | 经典力学框架下的三体运动数值模拟软件

本文基于MATLAB及其GUI界面设计了一个基于经典力学的三体运动数值模拟软件,旨在建立经典力学框架内的空间三质点运动模型,又名为三体运动模型。软件根据当前的质点初始运动参数,运用数值模拟,迭代计算出后续每一时刻各个质点的运动参数,并将计算结果实时显示出来。本软件可用于质点力学与基础天体物理学的自主学习、教学演示和相关领域的科学研究。本文的主要内容包括背景说明、实验目的、基本原理及思路、实验成果展示和实验结论。

Chen_Tianyang的博客 1万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

NOIP2017 Day2_T3 列队

题目大意:众人皆知。题解:考场时打SBT打傻了,被卡爆了。这就是个傻逼线段树能过的东西,不要问我问为什么能跑这么快?每一行用线段树维护前m-1个。最后一列独立开来。查询用线段树二分。可以直接预开6e5。完。Code:#include<cstdio> #include<cstring> #include<algorithm> #define ll long long #define fo(i, x,

Cold_Chair的博客 1425

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

小喵喵的新家

JZOJ3441 小喵喵的新家Description小喵喵和小聪聪从小就是好朋友 ,他们经常在一起玩耍 。如今小喵已经厌倦了自己居住的环境,想请小聪聪为她建一个新家。小喵喵天生多才多艺,对多种乐器颇有研究。对于生活中常见的图形,她对圆形很感兴趣,因此小聪聪决定为她建一个圆形的新家。我们设新家在一个平面直角坐标系上,其中新家的圆心为平面直角坐标系的原点。小聪聪有一把神奇的剪刀,他定义了一个值m,以等分

Cold_Chair的博客 1353
上一篇: 51nod 1419 最小公倍数挑战
下一篇: 【GDOI2018模拟9.23】博弈
Cold_Chair
博客等级 码龄11年 158粉丝 410原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值