CC COT5 [线段树][Treap]

ChatIE:基于ChatGPT的零样本信息抽取实战指南 信息抽取是自然语言处理中的核心任务,旨在从非结构化文本中自动识别并结构化关键信息,如实体、关系及事件。传统方法依赖大量标注数据训练专用模型,流程复杂且成本高昂。随着大语言模型的发展,通过提示工程引导模型理解任务,实现了无需训练数据的零样本抽取能力,极大降低了技术门槛与应用成本。这种范式将信息抽取重构为多轮对话问题,通过分阶段提问引导模型逐步输出结构化结果,在快速原型验证、领域适配及小规模数据探索中展现出显著技术价值。本文以ChatIE项目为例,深入解析如何利用ChatGPT API,通过精心设计的提示词与两 阅读详情

Description

维护一个Treap,支持三种操作

  • 0 k w:插入一个关键字为k,权值为w的点。
  • 1 k:删除一个关键字为k的点。
  • 2 ku kv:返回关键字分别为ku和kv两个结点的距离。

Solution

这道题寒假就做到了。。一直不会QAQ
考虑Treap是怎么建的。
对所有键值排序后,以权值最大的结点为根,再左右递归建立子树。
所以两个结点的LCA就是两个结点之间权值最大的点。
如何维护一个点到根的距离呢。
一个点向左向右第一个比他大的结点一定是他的祖先,这就成了一个类似于上升序列的东西。
画下图可以发现左右是独立的,分别维护一下就好了。
时间复杂度是O(nlog2n)的。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

const int N = 201010;
typedef unsigned int ui;

inline char get(void) {
    static char buf[100000], *S = buf, *T = buf;
    if (S == T) {
        T = (S = buf) + fread(buf, 1, 100000, stdin);
        if (S == T) return EOF;
    }
    return *S++;
}
template<typename T>
inline void read(T &x) {
    static char c; x = 0;
    for (c = get(); c < '0' || c > '9'; c = get());
    for (; c >= '0' && c <= '9'; c = get()) x = x * 10 + c - '0';
}

template<typename T>
inline T Max(T a, T b) {
    return a > b ? a : b;
}

struct Seg1 {
    int mx[N << 2];
    int ans[N << 2];
    int l[N << 2], r[N << 2];
    int MX, Ans;

    void Build(int o, int _l, int _r) {
        l[o] = _l; r[o] = _r;
        ans[o] = 0; mx[o] = 0;
        if (_l == _r) return;
        int mid = (_l + _r) >> 1;
        Build(o << 1, _l, mid);
        Build(o << 1 | 1, mid + 1, _r);
    }
    inline int Calc(int o, int v) {
        if (l[o] == r[o]) return mx[o] > v;
        if (v > mx[o << 1]) return Calc(o << 1 | 1, v);
        return Calc(o << 1, v) + ans[o] - ans[o << 1];
    }
    void Modify(int o, int pos, int x) {
        if (l[o] == r[o]) {
            mx[o] = x; ans[o] = 1;
            if (!x) ans[o] = 0;
            return;
        }
        int mid = (l[o] + r[o]) >> 1;
        if (pos <= mid) Modify(o << 1, pos, x);
        else Modify(o << 1 | 1, pos, x);
        mx[o] = Max(mx[o << 1], mx[o << 1 | 1]);
        ans[o] = ans[o << 1] + Calc(o << 1 | 1, mx[o << 1]);
    }
    inline void QAns(int o, int L, int R) {
        if (l[o] >= L && r[o] <= R) {
            Ans += Calc(o, MX);
            MX = Max(MX, mx[o]);
            return;
        }
        int mid = (l[o] + r[o]) >> 1;
        if (R <= mid) return QAns(o << 1, L, R);
        if (L > mid) return QAns(o << 1 | 1, L, R);
        QAns(o << 1, L, R); QAns(o << 1 | 1, L, R);
    }
    inline int QAns(int L, int R) {
        MX = Ans = 0;
        QAns(1, L, R);
        return Ans;
    }
    inline int QMax(int o, int L, int R) {
        if (l[o] >= L && r[o] <= R) return mx[o];
        int mid = (l[o] + r[o]) >> 1, res = 0;
        if (L <= mid) res = Max(res, QMax(o << 1, L, R));
        if (R > mid) res = Max(res, QMax(o << 1 | 1, L, R));
        return res;
    }
    void Init(int n) {
        Build(1, 1, n);
    }
};
Seg1 S1, S2;
int n, opt, x, y, m, q, lca;
struct Opt {
    int opt;
    ui x, y;
};
Opt Q[N];
ui mpy[N], mpx[N];

inline int Dist(int x) {
    int d1 = S1.QAns(x, m), d2 = S2.QAns(m - x + 1, m);
    return d1 + d2;
}

int main(void) {
    freopen("1.in", "r", stdin);
    read(q);
    for (int i = 1; i <= q; i++) {
        read(Q[i].opt); read(Q[i].x);
        if (Q[i].opt != 1) read(Q[i].y);
        if (!Q[i].opt) {
            mpx[++m] = Q[i].x;
            mpy[m] = Q[i].y;
        }   
    }
    sort(mpx + 1, mpx + m + 1);
    sort(mpy + 1, mpy + m + 1);
    for (int i = 1; i <= q; i++)
        if (!Q[i].opt) {
            Q[i].x = lower_bound(mpx + 1, mpx + m + 1, Q[i].x) - mpx;
            Q[i].y = lower_bound(mpy + 1, mpy + m + 1, Q[i].y) - mpy;
        } else {
            Q[i].x = lower_bound(mpx + 1, mpx + m + 1, Q[i].x) - mpx;
            Q[i].y = lower_bound(mpx + 1, mpx + m + 1, Q[i].y) - mpx;
        }
    for (int i = 1; i <= m; i++) mpx[i] = mpy[i] = 0;
    for (int i = 1; i <= q; i++)
        if (!Q[i].opt) mpy[Q[i].y] = Q[i].x;
    S1.Init(m); S2.Init(m);
    for (int i = 1; i <= q; i++) {
        if (Q[i].opt == 0) {
            S1.Modify(1, Q[i].x, Q[i].y);
            S2.Modify(1, m - Q[i].x + 1, Q[i].y);
        } else if (Q[i].opt == 1) {
            S1.Modify(1, Q[i].x, 0);
            S2.Modify(1, m - Q[i].x + 1, 0);
        } else {
            x = Q[i].x; y = Q[i].y;
            if (x > y) swap(x, y);
            int p = S1.QMax(1, x, y);
            lca = mpy[S1.QMax(1, x, y)];
            printf("%d\n", Dist(x) + Dist(y) - 2 * Dist(lca));
        }
    }
    return 0;
}
Keil开发中CMSIS Driver API缺失问题的排查与解决 本文详细解析Keil开发中CMSIS Driver API缺失问题的根源与解决方案。针对版本不匹配、安装不完整等常见原因,提供在线与离线安装的对比及详细排查步骤,重点涵盖版本兼容性分析与项目配置验证,帮助开发者彻底解决API缺失错误并预防问题复发。 阅读详情

相关推荐

Linux ELF文件解析:从file到readelf的完整工具链指南

ELF(可执行与可链接格式)是Linux系统中二进制文件的标准格式,定义了程序加载、内存布局和元数据组织方式。其核心原理在于通过程序头表描述执行视图、节区头表描述链接视图,实现代码与数据的结构化存储。这一格式的技术价值在于为程序调试、安全审计和性能优化提供了底层支持,尤其在动态链接、符号解析和内存保护机制中发挥关键作用。在应用场景上,系统管理员依赖ELF分析工具解决库依赖问题,安全研究员通过检查安全属性评估漏洞风险,开发者则利用反汇编进行代码调试。本文聚焦于file、readelf、objdump等工具链的

weixin_42691065的博客 635

CodeChef FEB14 COT5

来自2016集训队作业。 你需要维护一棵带插入和删除的treap,多次询问某两点间的treap上距离。

GEOTCBRL 942

第七章 Wi-Fi连接过程

系列文章目录 第一章 国内下载AOSP最新源码的方法 第二章 下载AOSP WiFi相关的代码 第三章 将源码导入Android Studio(无需编译idegen) 文章目录系列文章目录前言一、Wi-Fi连接是什么?二、Wi-Fi连接的过程1. 手动连接总结 前言 Wi-Fi连接分为下面几种过程,每种的流程都有些许差异: 手动连接 自动连接 在BSS之间漫游 Passpoint热点连接 一、Wi-Fi连接是什么? Wi-Fi连接是指STA(手机)连接到AP(无线路由器)的过程,这个过程分为链路

Frank.Zhang的专栏 2527

[线段树模拟Treap]Codechef COT5 .Count on a Treap

很早以前留下的坑了首先把所有点按key排序,那么这个序列就是Treap的中序遍历了。 很显然两个点之间的weight最大的点是它们的LCA那么根据 ans=depthx+depthy−2∗depthlcaans=depth_x+depth_y-2*depth_lca 只要能算出 depthxdepth_x 就行了。画画图可以知道这个值就是这个点往两边的上升序列长度之和,可以用BZOJ2957的做

CE玩家 639

开源onlyoffice编译完整过坑版

onlyoffice 编译过坑完整版;

sHImart 4551

《详细指南:本地部署Ollama大型模型的完整步骤》

通过本指南,您应该能够成功地在本地部署Ollama大型模型,并开始使用它进行各种AI任务。Ollama的易用性和高性能使其成为研究和开发的理想选择。Ollama是一个高性能的AI模型部署平台,支持在本地轻松部署大型语言模型。本指南将详细介绍如何在本地环境中部署Ollama,并运行一个大型模型。

eclipsercp的博客 3695

[Treap模拟 线段树] Codechef COT5 Count on a Treap

传送门Description在计算机科学中,Treap根据键值是一棵二叉搜索树,根据权值是一个堆(本题中为大根堆) 。 你的任务是维护一棵Treap,支持以下操作 0 k w 插入一个新节点,键值为k,权值为w。 1 k 删除键值为k的节点。 2 ku kv 输出键值为ku和kv的两个点之间的路径长度。 保证没有两个点键值相同或权值相同,并且删除一个点时该点存在。Analysis考虑如何是如何建T

雯舞 1067

激光三角测量法:斜射与直射式技术的原理与应用解析

本文深入解析激光三角测量法中斜射式与直射式技术的原理、应用及对比。斜射式适用于高精度小范围测量,尤其擅长处理反光表面;直射式则适合大范围位移检测,结构更简单。文章详细介绍了两种技术的光路分析、数学建模、应用场景及选型建议,并探讨了系统校准与误差分析方法,为工业检测领域提供实用参考。

weixin_29280219的博客 414

CodeChef COT5 线段树

CodeChef COT5 线段树题意给出一些点,每个点有一个权值和键值,将这些点建成一个treap,支持插入一个点,删除一个点,询问两点之间的距离。首先考虑怎么建树,将所有点按键值从小到大排序,每次从当前区间找出权值最大的点,作为当前子树的根,该点左边的点建成左子树,右边的点建成右子树。把所有点离线下来,按键值排序,树上两点的lca就是在序列上两点之间的权值最大的点。找到lca后求两点距离就只需

make_it_for_good的博客 858

YonBIP 3.0 报表开发+报表超链接

用友报表开发

m0_55096250的博客 1760

2篇5章1节:实验流行病学的核心特征和设计原则

本文系统阐释实验流行病学的核心定义、四大核心特征、四大基本原则及主流设计类型,结合骨科、肿瘤科、儿科、精神科、内外妇儿及公共卫生等多学科临床实践案例,具象化解读人为干预、随机分组、平行对照、前瞻性设计的核心内涵与应用价值。同时,规范梳理对照、随机、盲法、重复四大研究基本原则,详细介绍临床试验、现场试验、社区试验三类主流研究设计的适配场景与应用差异。

MD Code 167

Codechef:Count on a Treap(线段树)

传送门 题解: Treap的中序遍历是按照键值来排序后的序列,两点的lca为这个序列上区间权值的最小值。 现在只用考虑怎么求深度: 显然往前的一个权值比他大的会成为他的父亲,或者他们中间夹了一个更大的成为他的父亲。 其实就是求上升序列,然后套用常见套路即可。 #include &lt;bits/stdc++.h&gt; using namespace std; typedef pair &lt;i...

DZYO的博客 457

【Zephyr存储专题】09_LittleFs文件系统操作

本文档旨在为开发者介绍Zephyr下Littlef's文件系统相关配置使用指南

zero的博客 3246

树状数组的三种操作

直接贴代码一、改点求段 namespace BIT { #define N 100000 #define lowbit(a) ((a)&(-a)) int c[N],num; void init(int n){num=n;} inline void add(int x,int a) { int xx=x;

Vectorxj的博客 1423

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

[NTT][DP][树链剖分][分治] LOJ #6289. 花朵

SolutionSolutionSolution fu,0/1,ifu,0/1,if_{u,0/1,i}表示uuu子树中选了iii个点,uuu选不选的答案。 转移显然就是一个卷积的形式。 考虑重链剖分。 先把轻儿子卷到根,这样只需要考虑重链。 再考虑重链上的DP。 考虑头尾选不选gu,0/1,0/1gu,0/1,0/1g_{u,0/1,0/1}。这也是个卷积,可以分治+FFT。 #i...

Vectorxj的博客 1012

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

[多项式ln][多项式exp][多项式求幂][生成函数][DP][FNT] BZOJ 3684: 大朋友和多叉树

SolutionSolutionSolution 把DP写成生成函数的形式。f(x)=x+∑d∈Dfd(x)f(x)=x+∑d∈Dfd(x)f(x)=x+\sum_{d\in D}f^d(x)设g(f(x))=xg(f(x))=xg\big(f(x)\big)=x,有g(f(x))g(x)==f(x)−∑d∈Dfd(x)x−∑d∈Dxdg(f(x))=f(x)−∑d∈Dfd(x)g(x)=x−∑...

Vectorxj的博客 923

[构造]AGC005C - Tree Restoring

DescriptionDescription给出一个数组aa。 要求构造一颗树,使节点uu距离最远的点的距离为aua_u。SolutionSolution这颗树的直径d=maxni=1aid=max_{i=1}^n{a_i}。 可以通过对dd奇偶性的分类讨论,把在直径上节点的值计算掉。 然后其他的点的值一定大于等于在直径上的点的值的最小值。 等号可不可取也是要分奇偶性讨论的。#include

Vectorxj的博客 633

[容斥原理][Meet-in-middle][Matrix-Tree定理] SRM551 Div1 Hard SweetFruits

SolutionSolutionSolution 将原问题分成两个子问题。 从所有甜的水果中选出kkk个水果作为真甜的,要求他们甜度之和不超过maxSweetnessmaxSweetnessmaxSweetness的方案数cntkcntkcnt_k 令nnn为甜的水果数目,求出组成的树的方案数treektreektree_k使得nnn个甜的水果中恰有kkk个水果为真甜的。 ans=∑k=0...

Vectorxj的博客 632

BZOJ 4034 [树链剖分][线段树]

如果在一棵树上求两个节点间路径的最大值最小值权值和等等,并且还支持修改某一段路径的权值等等,光靠线段树是不够的,这是就需要树链剖分,将一棵树转化成线段,然后求解。For instance, BZOJ 4034: [HAOI2015]T2 Description 有一棵点数为 N 的树

Vectorxj的博客 623

[后缀自动机][树上启发式合并] LOJ #6041. 「雅礼集训 2017 Day7」事情的相似度

SolutionSolutionSolution O(nn−−√logn)O(nnlog⁡n)\mathcal{O}(n\sqrt n\log n)的莫队连500005000050000都过不了qwq。 %%%gjghfd gjghfd教我SAM+树上启发式合并的做法。 每两个后缀的贡献会在LCA处统计到。 一个暴力的想法就是枚举LCA,那就只需要考虑子树中的点对。有实际贡献意义的就...

Vectorxj的博客 622

[平等博弈][SG函数][字典树合并] BZOJ 4730: Alice和Bob又在玩游戏

SolutionSolutionSolution 记SuSuS_u为uuu到根的链的子树的SG函数值的集合。 考虑从子树转移到根。 一种是去掉根,就是把所有子树异或起来。 一种操作在子树内,相当于把子树的SSS异或上子树的SG异或和。 集合异或上一个数可以打标记。 集合的合并可以用字典树合并。 求mexmex\text{mex}可以二分。 #include &lt;bits/s...

Vectorxj的博客 602

POJ 1988

带权并查集#include<cstdio> #include<cstdlib> #include<iostream> #include<cstring> #define N 100010 using namespace std;int f[N],low[N],size[N],n;//f means the lowestchar get_char() { int cnt=0;char c=ge

Vectorxj的博客 595

BZOJ 2588 [可持久化线段树][lca]

Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权。其中lastans是上一个询问的答案,初始为0,即第一个询问的u是明文。 Input 第一行两个整数N,M。 第二行有N个整数,其中第i个整数表示点i的权值。 后面N-1行每行两个整数(x,y),表示点x到点y有一条边。 最后M行每

Vectorxj的博客 581

[DP][分治] 51Nod 1934 受限制的排列

SolutionSolutionSolution 一个显然的想法就是去找最小的那个数。 最小的数的 lll 和 rrr 就应该是 111 和 nnn 。 因为这是一个排列,我们把问题从最小值处 pospospos 分开,得到两个一样的问题 (1,pos−1)(1,pos−1)(1,pos-1) 和 (pos+1,n)(pos+1,n)(pos+1,n) 。设区间长度为 lenlenlen ,...

Vectorxj的博客 580

POJ 2236

并查集#include<cstdio> #include<cstdlib> #include<iostream> #include<cstring> #include<cmath> #define N 1010 using namespace std;int f[N],n,d; bool vis[N]; struct point { int x,y; }p[N];#define sqr(a)

Vectorxj的博客 578

BZOJ 2002 [LCT]

2002: [Hnoi2010]Bounce 弹飞绵羊 Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏。游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当绵羊达到第i个装置时,它会往后弹ki步,达到第i+ki个装置,若不存在第i+ki个装置,则绵羊被弹飞。绵羊想知道当它从

Vectorxj的博客 547

POJ 2513

字典树+并查集判断是否联通+欧拉回路#include<cstdio> #include<cstdlib> #include<iostream> #include<cstring> #define MAX 2500000 using namespace std;int n,m,cnt=0,num=0,number[MAX],f[MAX]; char str[50],s1[25],s2[25];inli

Vectorxj的博客 535
上一篇: CC QGRID [分治][树链剖分][Dijkstra]
下一篇: BZOJ 4817 [LCT][线段树][树链剖分]
Vectorxj
博客等级 码龄11年 35粉丝 231原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值