首页 > 其他分享 >2024初秋集训——提高组 #33

2024初秋集训——提高组 #33

时间:2024-10-09 10:50:44浏览次数:7  
标签:begin end 33 mid 2024 int MAXN cases 初秋

C. 星际航行

题目描述

给定一个 \(N\) 个点 \(M\) 条边的无向带权图。我们定义一条路径的长度为路径上边权最大值。有 \(Q\) 次查询,第 \(i\) 次查询从 \(u\) 到其他 \(N-1\) 个点的最短路径中路径长度第 \(k\) 大的长度。

思路

首先,此题显然只会在最小生成树上选择路径。所以我们可以先求出最小生成树。

又因为两个点之间的最长路径为其在 kruskal 重构树上的 LCA。所以我们可以建出重构树,那么从一个结点 \(u\) 出发的可能路径长度就是 \(u\) 的祖先的点权,小于或等于某个长度的路径数量就为对应结点的子树内叶子数量减一(因为要去掉自己到达自己)。使用倍增求解即可。

空间复杂度 \(O(N\log N+M)\),时间复杂度 \(O(M\log M+(N+Q)\log N)\)。

代码

#include<bits/stdc++.h>
using namespace std;

const int MAXM = 200001, MAXN = 100001;

struct Edge {
  int u, v, w;
}g[MAXM];

int n, m, q, _f[MAXN], a[MAXN], tot, f[19][MAXN], leaf[MAXN];
vector<int> e[MAXN];

int getfa(int u) {
  return (_f[u] == u ? u : _f[u] = getfa(_f[u]));
}

void dfs(int u) {
  leaf[u] = (e[u].empty());
  for(int i = 1; i <= 18; ++i) {
    f[i][u] = f[i - 1][f[i - 1][u]];
  }
  for(int v : e[u]) {
    f[0][v] = u;
    dfs(v);
    leaf[u] += leaf[v];
  }
}

int Get(int u, int k) {
  for(int i = 18; i >= 0; --i) {
    if(f[i][u] && leaf[f[i][u]] - 1 < k) {
      u = f[i][u];
    }
  }
  return a[f[0][u]];
}

int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n >> m >> q;
  tot = n;
  for(int i = 1; i <= m; ++i) {
    cin >> g[i].u >> g[i].v >> g[i].w;
  }
  sort(g + 1, g + m + 1, [](const Edge &a, const Edge &b) -> bool {
    return a.w < b.w;
  });
  iota(_f + 1, _f + 2 * n + 1, 1);
  for(int i = 1; i <= m; ++i) {
    int u = getfa(g[i].u), v = getfa(g[i].v), w = g[i].w;
    if(u != v) {
      a[++tot] = w;
      e[tot].emplace_back(u);
      e[tot].emplace_back(v);
      _f[u] = _f[v] = tot;
    }
  }
  dfs(tot);
  for(int i = 1, u, k; i <= q; ++i) {
    cin >> u >> k;
    cout << Get(u, n - k) << "\n";
  }
  return 0;
}

D. 异或函数

题目描述

我们令 \(f(x)=0\oplus1\oplus \dots\oplus x\)。给定一个序列 \(A_1,A_2,\dots,A_N\),有 \(M\) 次操作:

  • 对于 \(\forall l\le i\le r, A_i\leftarrow A_i+x\)。
  • 求 \(\sum \limits_{i=l}^r f(A_i)\)。

思路

通过打表或推式子可以发现,\(f(x)=\begin{cases}2\mid x&x\\2\not \mid x&0\end{cases}+\begin{cases}2\mid \lfloor\frac{x-1}{2}\rfloor&1\\2\not \mid \lfloor\frac{x-1}{2}\rfloor&0\end{cases}\)。

使用线段树维护 \(\sum \begin{cases}2\mid x&x\\2\not \mid x&0\end{cases},\sum \begin{cases}2\mid x&0\\2\not \mid x&x\end{cases},\sum \begin{cases}2\mid x&1\\2\not \mid x&0\end{cases},\sum \begin{cases}2\mid x&0\\2\not \mid x&1\end{cases},\sum \begin{cases}2\mid \lfloor\frac{x-1}{2}\rfloor&1\\2\not \mid \lfloor\frac{x-1}{2}\rfloor&0\end{cases},\begin{cases}2\mid \lfloor\frac{x-1}{2}\rfloor&0\\2\not \mid \lfloor\frac{x-1}{2}\rfloor&1\end{cases}\) 即可。

空间复杂度 \(O(N)\),时间复杂度 \(O(Q\log N)\)。

代码

#include<bits/stdc++.h>
using namespace std;
using ll = long long;

const int MAXN = 100001;

int florr2(int x) {
  return (x < 0 ? (x - 1) / 2 : x / 2);
}

int f(int x) {
  return ((x & 1) ^ 1) * x + (((florr2(x - 1) + 2) & 1) ^ 1);
}

struct Segment_Tree {
  int l[MAXN << 2], r[MAXN << 2], cnt[MAXN << 2][2][2], cnt2[MAXN << 2][2], a[MAXN], nxt[2][2];
  ll sum[MAXN << 2], res[MAXN << 2][2], lazy[MAXN << 2];
  void pushup(int u) {
    res[u][0] = res[u << 1][0] + res[(u << 1) | 1][0], res[u][1] = res[u << 1][1] + res[(u << 1) | 1][1];
    cnt2[u][0] = cnt2[u << 1][0] + cnt2[(u << 1) | 1][0], cnt2[u][1] = cnt2[u << 1][1] + cnt2[(u << 1) | 1][1];
    cnt[u][0][0] = cnt[u << 1][0][0] + cnt[(u << 1) | 1][0][0], cnt[u][0][1] = cnt[u << 1][0][1] + cnt[(u << 1) | 1][0][1];
    cnt[u][1][0] = cnt[u << 1][1][0] + cnt[(u << 1) | 1][1][0], cnt[u][1][1] = cnt[u << 1][1][1] + cnt[(u << 1) | 1][1][1];
    sum[u] = sum[u << 1] + sum[(u << 1) | 1];
  }
  void build(int u, int s, int t) {
    l[u] = s, r[u] = t;
    if(s == t) {
      res[u][a[s] & 1] = a[s], cnt[u][(florr2(a[s] - 1) + 2) & 1][(a[s] + 1) & 1] = 1, sum[u] = f(a[s]), cnt2[u][a[s] & 1] = 1;
      return;
    }
    int mid = (s + t) >> 1;
    build(u << 1, s, mid), build((u << 1) | 1, mid + 1, t);
    pushup(u);
  }
  void tag(int u, ll x) {
    if(!x) {
      return;
    }
    if(x % 2) {
      swap(res[u][0], res[u][1]);
      swap(cnt2[u][0], cnt2[u][1]);
    }
    res[u][0] += 1ll * cnt2[u][0] * x;
    res[u][1] += 1ll * cnt2[u][1] * x;
    nxt[0][0] = nxt[0][1] = nxt[1][0] = nxt[1][1] = 0;
    for(bool o : {0, 1}) {
      for(bool o2 : {0, 1}) {
        nxt[(o + ((x / 2) & 1) + (((x & 1) + o2) / 2) & 1)][(o2 + (x & 1)) & 1] += cnt[u][o][o2];
      }
    }
    cnt[u][0][0] = nxt[0][0], cnt[u][0][1] = nxt[0][1], cnt[u][1][0] = nxt[1][0], cnt[u][1][1] = nxt[1][1];
    sum[u] = res[u][0] + cnt[u][0][0] + cnt[u][0][1];
    lazy[u] += x;
  }
  void pushdown(int u) {
    tag(u << 1, lazy[u]), tag((u << 1) | 1, lazy[u]), lazy[u] = 0;
  }
  void update(int u, int s, int t, ll x) {
    if(l[u] >= s && r[u] <= t) {
      tag(u, x);
      return;
    }
    pushdown(u);
    if(s <= r[u << 1]) {
      update(u << 1, s, t, x);
    }
    if(t >= l[(u << 1) | 1]) {
      update((u << 1) | 1, s, t, x);
    }
    pushup(u);
  }
  ll Getsum(int u, int s, int t) {
    if(l[u] >= s && r[u] <= t) {
      return sum[u];
    }
    pushdown(u);
    ll x = 0;
    if(s <= r[u << 1]) {
      x += Getsum(u << 1, s, t);
    }
    if(t >= l[(u << 1) | 1]) {
      x += Getsum((u << 1) | 1, s, t);
    }
    return x;
  }
}tr;

int n, m;

int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n >> m;
  for(int i = 1; i <= n; ++i) {
    cin >> tr.a[i];
  }
  tr.build(1, 1, n);
  for(int i = 1, op, l, r, x; i <= m; ++i) {
    cin >> op >> l >> r;
    if(op == 1) {
      cin >> x;
      tr.update(1, l, r, x);
    }else {
      cout << tr.Getsum(1, l, r) << "\n";
    }
  }
  return 0;
}

标签:begin,end,33,mid,2024,int,MAXN,cases,初秋
From: https://www.cnblogs.com/yaosicheng124/p/18453751

相关文章

  • 20241008
    短路显然可以得出一个结论,一个数字大的点肯定要到一个数字比他小的点,这个我们可以用单调栈维护出来比一个点小的第一个点,然后\(dp\)即可#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e5+5;intn,a[N],pos[N],dp[N],sum......
  • [智能网联汽车/数据标准/法规政策] 标准解读:GB/T 44464-2024《汽车数据通用要求》
    0引言随着智能技术的不断发展,智能网联汽车作为新时代移动智能终端的代表,正引领着汽车产业向智能化、网联化深刻转型与升级。智能网联汽车与云端服务器、移动端、车端等设备存在大量的数据交互,包括车辆运行数据、用户个人信息等。缺乏对这些数据实施的有效监管与控制,将潜藏重大......
  • 2024年10月
    来到宜善后,从老板的认知里,得到的启示:世界就是一本巨大的开卷资料库,你想创造价值、做成某件事,即想这份开卷考试得到一个好的结果,就是去照着问题找答案。会找很重要。找到后就是模仿的执行,就能得到好的结果。高中时,化学老师带着我们班一年提高了成绩,也是在,教我们吃透所谓的开卷资料......
  • 界面控件Kendo UI for jQuery 2024 Q3亮点 - 支持切换编辑模式
    随着最新的2024Q3版本,Progress使用户能够使用现成的页面模板和构建块更快地构建令人惊叹的应用程序,使您的Telerik和KendoUI开发体验更好。Telerik和KendoUI 2024Q3版本将焦点放在新推出的页面模板和构建块上,每个页面模板和构建块都预先配置了TelerikUIforBlazor、KendoU......
  • 20222417 2024-2025-1 《网络与系统攻防技术》实验一实验报告
    1.实验内容(1).掌握反汇编与十六进制编程器(2).能正确修改机器指令改变程序执行流程(3).能正确构造payload进行bof攻击2.实验过程(1).直接修改程序机器指令,改变程序执行流程将pwn1文件放入共享文件夹,后续在kali中使用,再将文件复制到实验文件夹share路径下找到本次实验所用的三个代码片......
  • 2024/10/8
    色给定一张图,每个点有一个颜色。每次操作求改一个颜色,然后询问所有不同颜色点对的最短距离。给出一种\(O(n\sqrt{n})\)的做法。先按照边权从小到大排序,然后将边分块。对于每一个块,我们只需要快速判断块内是否存在一条边的两点颜色不同即可。对于一个块可以算出\(\sum(co......
  • 20241008_Day 04
    helloworld!1.安装NOTEPAD++2.新建代码文件夹3.新建JAVA文件1.可以新建text文件,修改后缀为.java2.打开方式修改为notepad+++4.编写代码具体为:javapublicclassHello{publicstaticvoidmain(String[]args){System.out.print("Hello,world!");}}5.......
  • 【电商搜索】现代工业级电商搜索技术-EMNLP2024-无监督的用户偏好学习
    【电商搜索】现代工业级电商搜索技术-EMNLP2024-无监督的用户偏好学习0.论文信息Title:UnsupervisedHumanPreferenceLearningAuthors:SumukShashidhar,AbhinavChinta,VaibhavSahai,DilekHakkaniTurComments:EMNLP2024MainConferencehttps://arxiv.or......
  • NewStar2024-week1
    前言:刚开始比赛,时间比较多尝试了一下所有题目,难度也很友好,之后就写密码了,写全部太累了Week1CryptoBase4C4A575851324332474E324547554B494A5A4446513653434E564D444154545A4B354D45454D434E4959345536544B474D5134513D3D3D3D秒了一眼秒了p,q相近或者factordb查"""fro......
  • NOIP2024集训 Day47 总结
    前言人有两次生命,当他意识到只有一次的时候,第二次生命就开始最小生成树和二分图匹配专题,感觉总体都比较套路。但是这些套路为啥感觉见都没见过啊,怪不得做这么慢。色观察到对于最终答案显然都是最小生成树上一条两个端点颜色不同的边。而这个题并不会改变图的形态,仅仅是改......