#503. 「LibreOJ β Round」ZQC 的课堂 容斥原理+Treap

本文介绍了一种使用Treap数据结构解决特定坐标轴穿越计数问题的方法。通过维护两个Treap来分别处理x轴和y轴的穿越情况,实现对坐标轴穿越次数的有效计算。文章详细阐述了解决方案的思路、数据结构的设计及具体实现。

题目:

595d7520b4062.png

题解:

比较容易发现 : \(x,y\) 的贡献是独立的。
所以可以分开考虑。
假设我们考虑 \(x\).向量在 \(x\) 方向的投影依次是 : \(\{a_1,a_2, ... ,a_n\}\)
那么在点 \(i\) 时候的 \(x\) 坐标即 : \(1 + \sum_{k=1}^ia_i\),设 \(s_i = \sum_{k=1}^ia_i\)
那么贡献即 : \(\sum_{i=1}^[(1+s_{i-1})*(1+s_i) < 0]\)
也就是 : \(\sum_{i=1}^n [max\{s_i,s_{i-1}\}>0 \space \space \&\& \space \space min\{s_i,s_{i-1}\} < 0]\)
考虑容斥原理,我们可以得到 :
\[n - \sum_{i=1}^n[max\{s_i,s_{i-1}\}<0] - \sum_{i=1}^n[min\{s_i,s_{i-1}\}>0]\]
还有 :
\(\sum_{i=1}^n [max\{s_i,s_{i-1}\}<0 \space \space \&\& \space \space min\{s_i,s_{i-1}\} > 0]\) \(?\)
不存在的

所以用 Splay 支持单点修改,区间加上一个数和统计小于/大于零的数的个数。
分别维护即可。

后来又去写才发现自己想简单了。
按照序列序插入做和按照权值插入做都不能简单的直接应用到全局。
正确的姿势是维护一个偏移量,表示插入到Treap中的点和实际上的点偏差了多少。

所以我们可以只将操作指针右侧的点全部插入到Treap中,并且在外面记录所有在Treap中的元素与实际的相差了多少。
怎么处理每个元素实际上的偏差并不是全局的偏差?
插入的时候让这个元素向反方向偏移一下再插入,然后就可以保证所有Trie中的元素偏移量都一样了。
对于所有指针左边的点,我们知道我们修改的时候不会对左边的东西造成任何影响。
所以可以直接维护终坐标和在这段时间内跨越坐标轴的次数。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef pair<int,int> pa;
inline void read(int &x){
    x=0;static char ch;static bool flag;flag = false;
    while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
    while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
#define rg register int
#define rep(i,a,b) for(rg i=(a);i<=(b);++i)
#define per(i,a,b) for(rg i=(a);i>=(b);--i)
#define mk(x,y) make_pair(x,y)
#define fst first
#define snd second
const int maxn = 100010;
struct Treap{
    struct Node{
        Node *ch[2];
        int w,siz,fix;
        void update(){
            siz = ch[0]->siz + ch[1]->siz + 1;
        }
    }*root,mem[maxn],*it,*null;
    Node *ws[maxn];int top;
    inline void init(){
        it = mem;null = it ++ ;
        null->ch[0] = null->ch[1] = null;
        null->siz = 0;null->fix = 0x3f3f3f3f;
        root = null;
    }
    inline Node* newNode(int x){
        Node *p = top ? ws[top--] : it ++ ;
        p->ch[0] = p->ch[1] = null;
        p->siz = 1;p->fix = rand();
        p->w = x;return p;
    }
    inline void rotate(Node* &p,int k){
        Node *x = p->ch[k^1];
        p->ch[k^1] = x->ch[k];
        x->ch[k] = p;
        p->update();x->update();
        p = x;return ;
    }
    void insert(Node* &p,int x){
        if(p == null){
            p = newNode(x);
            return ;
        }insert(p->ch[x >= p->w],x);
        if(p->ch[x>=p->w]->fix < p->fix)
            rotate(p,x<p->w);
        p->update();
    }
    void erase(Node* &p,int x){
        if(p->w == x){
            if(p->ch[0] != null && p->ch[1] != null){
                int k = p->ch[0]->fix < p->ch[1]->fix;
                rotate(p,k);
                erase(p->ch[k],x);
            }else{
                Node *y = p->ch[0] != null ? p->ch[0] : p->ch[1];
                ws[++top] = p;p = y;
            }
        }else erase(p->ch[x >= p->w],x);
        if(p != null) p->update();
    }
    inline void insert(int x){insert(root,x);}
    inline void erase(int x){erase(root,x);}
    inline int les(int x){
        Node *p = root;
        int res = 0;
        while(p != null){
            if(p->w > x) p = p->ch[0];
            else res += p->ch[0]->siz + 1,p = p->ch[1];
        }return res;
    }
    inline int gre(int x){
        Node *p = root;
        int res = 0;
        while(p != null){
            if(p->w < x) p = p->ch[1];
            else res += p->ch[1]->siz + 1,p = p->ch[0];
        }return res;
    }
    Treap(){init();}
}zsx[2],zsy[2];
pa a[maxn];
int X,Y,dx,dy,pot,n,ansx,ansy;
inline void move_right(){
    if(pot == n) return ;++ pot;
    zsx[0].erase(min(X-dx,X+a[pot].fst-dx));
    zsy[0].erase(min(Y-dy,Y+a[pot].snd-dy));
    zsx[1].erase(max(X-dx,X+a[pot].fst-dx));
    zsy[1].erase(max(Y-dy,Y+a[pot].snd-dy));
    if(X*(X+a[pot].fst) < 0) ++ ansx;
    if(Y*(Y+a[pot].snd) < 0) ++ ansy;
    X += a[pot].fst;Y += a[pot].snd;
}
inline void move_left(){
    if(pot == 1) return ;
    X -= a[pot].fst;Y -= a[pot].snd;
    if(X*(X+a[pot].fst) < 0) -- ansx;
    if(Y*(Y+a[pot].snd) < 0) -- ansy;
    zsx[0].insert(min(X-dx,X+a[pot].fst-dx));
    zsy[0].insert(min(Y-dy,Y+a[pot].snd-dy));
    zsx[1].insert(max(X-dx,X+a[pot].fst-dx));
    zsy[1].insert(max(Y-dy,Y+a[pot].snd-dy));
    -- pot;
}
inline void modify(){
    int x,y;read(x);read(y);
    if(X*(X-a[pot].fst) < 0) -- ansx;
    if(Y*(Y-a[pot].snd) < 0) -- ansy;
    X += x - a[pot].fst;
    Y += y - a[pot].snd;
    dx += x - a[pot].fst;
    dy += y - a[pot].snd;
    a[pot] = mk(x,y);
    if(X*(X-x) < 0) ++ ansx;
    if(Y*(Y-y) < 0) ++ ansy;
}
inline int query(){
    int res = n - pot - zsx[0].gre(-dx) - zsx[1].les(-dx) + 
        n - pot - zsy[0].gre(-dy) - zsy[1].les(-dy);
    return res + ansx + ansy;
}
int main(){
    srand(2619520);
    int q;read(n);
    X = Y = 1;
    rep(i,1,n){
        read(a[i].fst);read(a[i].snd);
        zsx[0].insert(min(X,X+a[i].fst));
        zsy[0].insert(min(Y,Y+a[i].snd));
        zsx[1].insert(max(X,X+a[i].fst));
        zsy[1].insert(max(Y,Y+a[i].snd));
        X += a[i].fst;Y += a[i].snd;
    }X = Y = 1;
    move_right();read(q);
    char ch;
    while(q--){
        while(ch=getchar(),ch<'!');
        if(ch == 'B') move_left();
        else if(ch == 'F') move_right();
        else if(ch == 'C') modify();
        else printf("%d\n",query());
    }
    return 0;
}

转载于:https://www.cnblogs.com/Skyminer/p/7124354.html

标题基于SpringBoot的马术俱乐部管理系统设计与实现AI更换标题第1章引言介绍马术俱乐部管理系统的研究背景、意义、国内外研究现状、论文方法及创新点。1.1研究背景与意义阐述马术俱乐部管理系统对提升俱乐部管理效率的重要性。1.2国内外研究现状分析国内外马术俱乐部管理系统的发展现状及存在的问题。1.3研究方法以及创新点概述本文采用的研究方法,包括SpringBoot框架的应用,以及系统的创新点。第2章相关理论总结和评述与马术俱乐部管理系统相关的现有理论。2.1SpringBoot框架理论介绍SpringBoot框架的基本原理、特点及其在Web开发中的应用。2.2数据库设计理论阐述数据库设计的基本原则、方法以及在管理系统中的应用。2.3马术俱乐部管理理论概述马术俱乐部管理的基本理论,包括会员管理、课程安排等。第3章系统设计详细描述马术俱乐部管理系统的设计方案,包括架构设计、功能模块设计等。3.1系统架构设计给出系统的整体架构,包括前端、后端和数据库的交互方式。3.2功能模块设计详细介绍系统的各个功能模块,如会员管理、课程管理、预约管理等。3.3数据库设计阐述数据库的设计方案,包括表结构、字段设计以及数据关系。第4章系统实现介绍马术俱乐部管理系统的实现过程,包括开发环境、编码实现等。4.1开发环境搭建介绍系统开发所需的环境,包括操作系统、开发工具等。4.2编码实现详细介绍系统各个功能模块的编码实现过程。4.3系统测试与调试阐述系统的测试方法、测试用例以及调试过程。第5章系统应用与分析呈现马术俱乐部管理系统的应用效果,并进行性能分析。5.1系统应用情况介绍系统在马术俱乐部中的实际应用情况。5.2系统性能分析从响应时间、并发处理能力等方面对系统性能进行分析。5.3用户反馈与改进收集用户反馈,提出系统改进建议。第6章结论与展望总结马术俱乐部管理系统的设计与实现成果,并展望未来的研究
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值