首页 > 其他分享 >天使玩偶 解题报告

天使玩偶 解题报告

时间:2023-02-04 20:22:44浏览次数:87  
标签:一个点 天使 ++ mid 玩偶 int 解题 cdq 我们

在 1145141919810 天前,SX 看了看 cdq 分治和整体二分,照着题解打了代码,照着代码理解了下这两种东西是干嘛用的。

然后他就自信的以为自己理解了这两种东西。

其实不然,啥叫你对着代码懂了代码你就懂了这个的原理啊,我的评价是 sx 就是依托答辩(确信


链接 Link

题目描述很清晰,这是在一个二维平面上,每次有两种操作:

  1. 新添加一个点。
  2. 询问距离点 \((x, y)\) 曼哈顿距离最小的点。

先简化问题,考虑不带修,只有 2 操作的版本,这个时候我们发现这个问题不好做,我们再简化问题(雾),把它简化到一维上去,也就是一根线段上。如果现在有一根线段,线段上有一些点,然后每次询问一个点 \(x\) 距离它最小距离的点是啥,这个时候这个问题就非常智力残障,对原有的点排个序,二分它的前驱后继。

那回到二维的版本,一维的操作给了我们启发,首先我们在一维,每个点有前驱后继。在二维,一个点把整个平面分成了四个象限,我们就拿第三象限举例,因为剩下三个象限与第三象限情况差不多,只要把坐标反转一下就好了,而且第三象限中,\(x' < x, y' < y\),这看上去非常的顺眼(雾),让我们很想去维护(究极雾)。

那么我们的问题就变成了:在一个二维平面上,有 \(n\) 个点,第 \(i\) 个点坐标为 \((x_i, y_i)\),\(m\) 个询问每次查询距离 \((x, y)\) 曼哈顿距离最近的点 \(k\) 且 \(x_k < x, y_k < y\)。

三个约束条件:\(x_k < x, y_k < y\),还要最小化 \(x - x_k + y - x_k = (x+y) - (x_k + y_k)\)(分离已知项和未知项)我们不难想到令 \(w_k = (x_k + y_k)\),那么实际上这里就是让我们求 \(x_k < x, y_k < y\) 的最大的 \(w_k\)。

根据一维的方法,我们不难想到以 \(x\) 为第一关键字排序。当然这样不行,对所有输入和查询的点都存下来,离线,再按照 \(x\) 为第一关键字排序,依次处理就行了。如此以来就可以暴保证所有的点都是 \(x_k < x\) 的。不看第一维,我们的问题就变成了:求一个 \(k\) 满足 \(y_k < y\) 且 \(w_k\) 最大。

不难想到维护一个数组 \(g\),\(g[i] = \max{w_k(y_k = i)}\)(因为有可能很多的 \(y_k\) 相等)每次要查询 \([0, y - 1]\) 的 \(g\) 前缀最大值。显而易见用树状数组线段树都行。时间复杂度 \(O((n + m)\log_2 n)\)

这块扯这么长是因为这是我这种幼儿园智力障碍小朋友的思考过程,大佬估计一眼就秒了 qwq


下面考虑动态的带修问题。首先来思考一下,假设多了一个点 \((x', y')\) 会造成哪些影响?

对于第二维度 \(y\) 当然很好维护,但是它的前提 \(x\) 有序不在了。如果我们新加入一个点 \((x', y')\),它会不会对后面的点造成影响,会的。对哪些点?\(x_i < x'\) 的。这怎么维护?你让我维护这个东西,没有这个能力好吧,再输就输越南了(划掉

cdq 分治妙在对时间来做分治。为什么是时间呢?比如说我们有个修改,在第 \(i\) 刻,那么 \(i - 1\) 刻前的所有查询不受影响,该怎么来还是怎么来,\(i + 1\) 后的就要记录它的影响。那么对于 \(i + 1\) 后的所有查询,我们只需要更新这一个点的贡献即可。

问题出在这里:我们可能会有很多个点都要更新。cdq 分治的思想在于,对于每个时间段 \([l, r]\),先单纯地计算 \([1, mid]\)(可以看成,对于 \(m\) 条操作,我们只做 \(1\sim mid\) 条操作的结果),然后再计算 \([mid + 1, r]\) 的答案(同上),然后我们拿 \([l, mid]\) 里面的修改,去更新 \([mid + 1, r]\) 的已经求出来的答案。

拿上面这题炒栗子。由于我们是分治处理的,用我们刚刚做静态问题的思路,我们默认 \([l, mid]\),\([mid + 1, r]\) 的 \(x\) 是有序的。然后我们就可以用线性复杂度合并这两个有序的序列,像归并排序一样。有没有发现现在我们和最初的静态问题一样了!我们仍然可以挨个扫描这个点的序列,然后加点,查询,就和静态问题一样!

然后……就没了吧 qwq

#include <iostream>
#include <cstring>
#include <algorithm>
#define MAXN 1000000
#define QWQ cout << "QWQ" << endl;
using namespace std;
int f = 0;
int INF;
struct node {
    int opt, x, y, id;
} a[MAXN + 10];
//qaq
int tr[MAXN + 10];
int lowbit(int x) {
    return x & (-x);
}
int n;
void change(int x, int y) {
    for(int p = y; p <= 1000000; p += lowbit(p))
        tr[p] = max(tr[p], x + y);      
}
int query(int x) {
    int res = 0;
    while(x) {
        res = max(res, tr[x]);
        x -= lowbit(x);
    }
    return res;
}
void clear(int pos) {
    for(; pos <= 1000000; pos += lowbit(pos))
        tr[pos] = 0;
}
//qwq
node tmp[MAXN + 10];
int ans[MAXN + 10];
void sto_cdq_orz(int l, int r) {
    if(l >= r) return ;
    int mid = (l + r) >> 1;
    sto_cdq_orz(l, mid);
    sto_cdq_orz(mid + 1, r);
    int pos = l, p = mid + 1, c = l - 1;
    while(pos <= mid && p <= r) {
        if(a[pos].x <= a[p].x) {
            if(a[pos].opt == 1) change(a[pos].x, a[pos].y);
            tmp[++c] = a[pos], pos++;
        }
        else {
            if(a[p].opt == 2) {
                int qaq = query(a[p].y);
                if(qaq) ans[a[p].id] = min(ans[a[p].id], a[p].x + a[p].y - qaq);
            } 
            tmp[++c] = a[p], p++;
        }
    }
    while(pos <= mid) tmp[++c] = a[pos], pos++;
    while(p <= r) {
        if(a[p].opt == 2) {
            int qaq = query(a[p].y);
            if(qaq) ans[a[p].id] = min(ans[a[p].id], a[p].x + a[p].y - qaq);
        } 
        tmp[++c] = a[p], p++;
    }
    for(int p = l; p <= r; p++) a[p] = tmp[p];
    for(int p = l; p <= r; p++)
        if(a[p].opt == 1) clear(a[p].y);
    return ;
}
//
node qwq[MAXN + 10];
void init() {
    int m;
    cin >> n >> m;
    for(int p = 1, x, y; p <= n; p++) {
        cin >> x >> y;
        x++, y++;
        a[p].opt = 1, a[p].x = x, a[p].y = y;
    }
    for(int p = 1, opt, x, y; p <= m; p++) {
        cin >> a[++n].opt >> a[n].x >> a[n].y;
        a[n].x++, a[n].y++;
        if(a[n].opt == 2) f++, a[n].id = f;
    }
    for(int p = 1; p <= n; p++)
        qwq[p] = a[p];
}
void work() {
    memset(ans, 0x7f, sizeof(ans));
    memset(ans, 0x3f, sizeof(ans));
    sto_cdq_orz(1, n);
    for(int p = 1; p <= n; p++) a[p] = qwq[p], a[p].x = 1000001 - a[p].x;
    sto_cdq_orz(1, n);
    for(int p = 1; p <= n; p++) a[p] = qwq[p], a[p].y = 1000001 - a[p].y;
    sto_cdq_orz(1, n);
    for(int p = 1; p <= n; p++) a[p] = qwq[p], a[p].x = 1000001 - a[p].x, a[p].y = 1000001 - a[p].y;
    sto_cdq_orz(1, n);
}
int main() {
    init();
    work();
    for(int p = 1; p <= f; p++)
        cout << ans[p] << endl;
}

标签:一个点,天使,++,mid,玩偶,int,解题,cdq,我们
From: https://www.cnblogs.com/thirty-two/p/17092269.html

相关文章

  • 「解题报告」[省选联考 2022] 学术社区
    摆烂了,不想写代码了。我怎么这么菜啊,看题解里说的各种思路,我一个都没想到。哭考虑给每个消息建一个点,每两个点之间连边\(x\toy\),边权为将\(y\)接在\(x\)后头能......
  • 2023华数杯B题社会稳定预警研究的材料支撑以及解题思路【全网独家社会稳定预警研究材
    B题社会稳定预警研究材料支撑:(动态链接,后期会一直不断新增支撑论文进去)社会稳定预警研究材料支撑合集下载部分截图如下:(还会不断更新)题目问题B:社会稳定预警研究人类和......
  • 「解题报告」ARC142C Tree Queries
    \(2n\)次询问,那就考虑直接问出来\(d_{1,i},d_{2,i}\)。首先显然有:\(|d_{1,i}-d_{2,i}|\led_{1,2}\led_{1,i}+d_{2,i}\)那么我们可以求出\(d_{1,i}+d_......
  • ABC287 解题报告【A~F】
    AtcoderBeginnerContest287姗姗来迟的解题报告C题漏了一个细节,狂WA,心态爆炸,暴跌58ratingContestlinkMyresultA-Majority直接统计For的个数,与\(\dfrac{......
  • Codeforces Round #846 (Div. 2) 解题报告
    前情提要:我是沙币比赛链接A.Hayatoand贪心,不大想讲代码写的很丑voidsolve(){ vector<int>a; intn,x; cin>>n; a.push_back(0); for(inti=1;i<=n;++i)......
  • DevopsCamp 第一期作业: 《cobra - 01 实现编译与参数绑定(简单)》 解题答案
    DevopsCamp第一期作业:《cobra-01实现编译与参数绑定(简单)》解题答案原文链接:​​https://tangx.in/posts/2023/01/23/devopscamp-cobra01/​​本文为​​DevOpsCam......
  • 「解题报告」ARC135D Add to Square
    这种题的第一想法应当是找不变量。如果给原图黑白染色,那么每次操作都是操作两个黑格两个白格,那么黑格与白格的差不变。如果我们给黑格的数乘上\(-1\),那么就是所有格子的......
  • 「解题报告」ARC136F Flip Cells
    感觉AtCoder上高于铜的难度就完全是随机了,这题完全是金吧,怎么可能只有铜啊,我快写自闭了。以下记\(n=hw\)。我们设三个DP数组:\(f_i\)为从初始状态经过\(i\)步之......
  • 「解题报告」ARC136E Non-coprime DAG
    很妙啊这题。我们来分析\(x\)能到\(y\)的数有什么性质。既然是不互质,那么可以考虑看这个数的最小质因子是什么。记\(f(x)\)为\(x\)的最小质因子。我们将质因子......
  • 「解题报告」ARC137F Overlaps
    首先有经典结论,两个实数随机变量相等的概率为\(0\)。那么在实数上随机若干个数,最后肯定会有一个顺序关系,而我们只关心这个顺序,所以可以把问题变成离散的。也就是我们现在......