T1004 a*b problem(HDU 7448)

不会。

T1005 小塔的养成游戏之梦(HDU 7449)

不会。

T1009 强攻计策(HDU 7453)

容易发现初始速度是多少对答案没有影响,所以我们默认初始速度为 \(0\)。题意相当于在平面直角坐标系上(横轴为时间,纵轴为速度),有一个目标高度,维护一条尽量接近目标的直线,但斜率只能是 \(-1/0/1\),要支持一段区间目标 \(+1\),求直线下方面积。

将一次区间 \(+1\) 拆成一段后缀 \(+1\) 和一段后缀 \(-1\)。注意到一次后缀 \(+1/-1\) 时至多只有一个位置发生向上/向下翻折,在这个位置前与目标的相对高度 \(-1/+1\),之后相对高度不变,那么此时面积的变化量容易用这个位置表示,我们现在的任务就是快速找到这个位置。

具体而言,设 \(h_i\) 表示直线在 \(x = i\) 处的相对高度,手玩容易发现当区间 \(+1\) 时,我们要找第一个 \(0/-1\),区间 \(-1\) 时,我们要找第一个 \(0/1\)。

现在我们要维护一个数据结构,支持区间 \(+1/-1\),区间找第一个 \(-1/0/1\),考虑分块,块内维护排序数组,修改时整块打标记,散块归并重构,询问时散块暴力,整块二分即可,平衡块长,时间复杂度 \(O(n \sqrt {n \log n})\),常数较小。

Code
#include <iostream>
#include <cmath>
#include <numeric>
#include <algorithm>
#include <vector> using namespace std;
using LL = long long; const int N = 1e5 + 5;
const int Mod = 1e9 + 7, Inv = (Mod + 1) / 2; int n, m;
LL ans; namespace Block {
int len, cnt;
int a[N], b[N], tag[N], bl[N], L[N], R[N]; void build () {
len = sqrt(n) * 0.4;
for (int i = 0; i <= n; ++i) {
bl[i] = i / len + 1;
}
cnt = bl[n];
R[0] = -1;
for (int i = 1; i <= cnt; ++i) {
L[i] = R[i - 1] + 1;
R[i] = min(n, L[i] + len - 1);
}
fill(a, a + n + 1, 0);
iota(b, b + n + 1, 0);
fill(tag, tag + cnt + 1, 0);
} int first_val (int x, int y) {
for (int i = x; i <= R[bl[x]]; ++i) {
if (a[i] == y - tag[bl[x]]) {
return i;
}
}
for (int i = bl[x] + 1; i <= cnt; ++i) {
if (a[b[R[i]]] < y - tag[i] || a[b[L[i]]] > y - tag[i]) continue;
auto cmp = [&](int i, int j) -> bool {
return a[i] < j;
};
auto it = lower_bound(b + L[i], b + R[i] + 1, y - tag[i], cmp);
if (it != b + R[i] + 1 && a[*it] == y - tag[i]) return *it;
}
return n + 1;
} int tmpa[N][2];
int al[2]; void add (int l, int r, int x) {
r = min(r, n);
auto rebuild = [&](int l, int r, int gl, int gr) -> void {
al[0] = 0, al[1] = 0;
for (int i = l; i <= r; ++i) {
int o = b[i] >= gl && b[i] <= gr;
tmpa[++al[o]][o] = b[i];
}
int p = l;
auto cmp = [&](int i, int j) -> bool {
return a[i] < a[j] || a[i] == a[j] && i < j;
};
for (int cur[2] = {1, 1}; cur[0] != al[0] + 1 || cur[1] != al[1] + 1; ) {
if (cur[0] != al[0] + 1 && (cur[1] == al[1] + 1 || cmp(tmpa[cur[0]][0], tmpa[cur[1]][1]))) {
b[p++] = tmpa[cur[0]][0], ++cur[0];
}
else {
b[p++] = tmpa[cur[1]][1], ++cur[1];
}
}
};
if (bl[l] == bl[r]) {
for (int i = l; i <= r; ++i) {
a[i] += x;
}
rebuild(L[bl[l]], R[bl[l]], l, r);
}
else {
for (int i = l; i <= R[bl[l]]; ++i) {
a[i] += x;
}
for (int i = L[bl[r]]; i <= r; ++i) {
a[i] += x;
}
rebuild(L[bl[l]], R[bl[l]], l, R[bl[l]]);
rebuild(L[bl[r]], R[bl[r]], L[bl[r]], r);
for (int i = bl[l] + 1; i <= bl[r] - 1; ++i) {
tag[i] += x;
}
}
}
} void suf_add (int x) {
int pos = min(Block::first_val(x, 0), Block::first_val(x, 1));
ans += max(0, (n - pos) * 2 - 1);
Block::add(x, pos, -1);
} void suf_minus (int x) {
int pos = min(Block::first_val(x, 0), Block::first_val(x, -1));
ans -= max(0, (n - pos) * 2 - 1);
Block::add(x, pos, 1);
} int main () {
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int T;
cin >> T;
while (T--) {
cin >> n >> m;
Block::build(), ans = 0;
for (int i = 1, l, r; i <= m; ++i) {
cin >> l >> r;
suf_add(l), suf_minus(r);
cout << ans % Mod * Inv % Mod << '\n';
}
}
return 0;
}

T1012 图计算(HDU 7456)

考虑对于每一张图分别维护并查集,我们使用启发式合并,这样可以保证每个结点的 \(fa\) 就是它的最高级祖先,对于每一个结点,为它在所有图中的 \(fa\) 序列哈希即可。

Code
#include <iostream>
#include <vector>
#include <tuple>
#include <unordered_map> using namespace std;
using LL = long long;
using Tp = tuple<int, int, int>; const int N = 5e4 + 5, M = 105; int n, m, d, q; struct Hash_Arr {
int len; struct Hash {
int mod, base, len;
int pw[M], now; void init (int mod_, int base_, int len_) {
mod = mod_, base = base_, now = 0, len = len_;
pw[0] = 1;
for (int i = 1; i <= len; ++i) {
pw[i] = 1ll * pw[i - 1] * base % mod;
}
} void add (int x, int y) { now = (now + 1ll * (mod + y) * pw[x]) % mod; }
} ha[3]; void init (int len_) {
len = len_;
ha[0].init(1000000007, 1000000009, len);
ha[1].init(1000000021, 1000000033, len);
ha[2].init(1000000087, 1000000093, len);
} void add (int x, int y) {
ha[0].add(x, y);
ha[1].add(x, y);
ha[2].add(x, y);
} Tp get_val () { return make_tuple(ha[0].now, ha[1].now, ha[2].now); }
} h[N]; struct tHash {
const int tB = 998244353, tP = tB * tB; int operator() (Tp x) const {
return get<0>(x) + get<1>(x) * tB * get<2>(x) * tP;
}
}; unordered_map<Tp, int, tHash> p;
LL ans; void add (Tp x) {
int v = p[x]++;
ans += v;
} void remove (Tp x) {
int v = --p[x];
ans -= v;
} struct U {
int fa[N], id;
vector<int> vec[N]; void init (int id_) {
id = id_;
fill(vec + 1, vec + n + 1, vector<int>());
for (int i = 1; i <= n; ++i) {
vec[i].push_back(i);
fa[i] = i;
h[i].add(id, i);
}
} void unite (int x, int y) {
x = fa[x], y = fa[y];
if (x == y) return;
if (vec[x].size() < vec[y].size()) swap(x, y);
for (auto v : vec[y]) {
vec[x].push_back(v);
remove(h[v].get_val());
h[v].add(id, x - fa[v]);
add(h[v].get_val());
fa[v] = x;
}
vec[y].clear();
}
} uf[M]; int main () {
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int T;
cin >> T;
while (T--) {
cin >> n >> m >> d >> q;
for (int i = 1; i <= n; ++i) {
h[i].init(d + 1);
}
for (int i = 1; i <= d + 1; ++i) {
uf[i].init(i);
}
p.clear(), ans = 0;
for (int i = 1; i <= n; ++i) {
add(h[i].get_val());
}
for (int i = 1, u, v; i <= m; ++i) {
cin >> u >> v;
for (int j = 1; j <= d + 1; ++j) {
uf[j].unite(u, v);
}
}
for (int i = 1, u, v, w; i <= q; ++i) {
cin >> u >> v >> w;
uf[w].unite(u, v);
cout << ans << '\n';
}
}
return 0;
}

HDU-ACM 2024 Day2的更多相关文章

  1. hdu acm 1028 数字拆分Ignatius and the Princess III

    Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  2. HDU ACM 题目分类

    模拟题, 枚举1002 1004 1013 1015 1017 1020 1022 1029 1031 1033 1034 1035 1036 1037 1039 1042 1047 1048 104 ...

  3. hdu acm 1166 敌兵布阵 (线段树)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  4. hdu acm 2082 找单词

    找单词 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  5. HDU ACM 1325 / POJ 1308 Is It A Tree?

    Is It A Tree? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  6. HDU ACM 1134 Game of Connections / 1130 How Many Trees?(卡特兰数)

    [题目链接]http://acm.hdu.edu.cn/showproblem.php?pid=1134 [解题背景]这题不会做,自己推公式推了一段时间,将n=3和n=4的情况列出来了,只发现第n项与 ...

  7. HDU ACM Eight

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1043 解题背景: 看到八数码问题,没有任何的想法,偶然在翻看以前做的题的时候发现解决过类似的一道题,不 ...

  8. HDU ACM 1690 Bus System (SPFA)

    Bus System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  9. HDU ACM 1224 Free DIY Tour (SPFA)

    Free DIY Tour Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  10. HDU ACM 1869 六度分离(Floyd)

    六度分离 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

随机推荐

  1. OSS简单文件上传和本地存储上传

    网站的文件上传方法 本地存储上传 // 本地存储方式 MultipartFile接受文件 @PostMapping("/save") public Result save(Stri ...

  2. 智能工业化的关键一环:sim2real的仿真环境设计

    智能工业化,不论是智能机器人技术还是数字孪生技术,都不可避免的要使用的一个技术就是仿真环境技术. 在智能工业化还停留在学术阶段的时候,大家都可以使用一些开源的免费的仿真环境做research,但是到了 ...

  3. 【转载】 Ring Allreduce (深度神经网络的分布式计算范式 -------------- 环形全局规约)

    作者:初七123链接:https://www.jianshu.com/p/8c0e7edbefb9来源:简书著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. ----------- ...

  4. udp协议实现组播功能

    /*************************************************************************************************** ...

  5. dpwwn-01靶机笔记

    dpwwn-01靶机笔记 概述 这是一台Vulnhub的靶机,主要在web方面,我们无法找到突破口时,应该怎样抉择mysql和ssh的爆破,以及弱口令的尝试. 我这里准备了连接,当然你也可去Vulnh ...

  6. 数字名片工具 BBlog:使用一个链接,快速创建和分享你的信息主页和数字花园

    数字名片 BBlog:使用一个链接,快速创建和分享你的信息主页和数字花园 随着移动互联网技术的快速发展,数字名片产品已成为现代社交和网络营销的重要工具.数字名片可以帮助个人和企业在各种场合中展示和分享 ...

  7. 彻底解决ROS1安装问题,一键解决远离rosdep init 和rosdep update出错

    彻底解决ROS1安装问题 相信很多小伙伴在刚入门ROS的时候就遇到ROS安装这个拦路虎. 普遍出错的环节在rosdep init 和rosdep update,由于要访问国外的站点就导致国内访问很容易 ...

  8. Linux 挂载设备

    手动挂载 挂载: # 创建挂载目录 sudo mkdir -p /path/to/mount # 挂载 sudo mount /dev/sdX1 /path/to/mount # 确认挂载 df -h ...

  9. 【FFmpeg】之Mac系统爬取所有M3U8视频下载方法

    前言 由于有的网站不允许下载视频,到了有效期就不能看了,但是我想以后反复看,怎么办呢? 前提准备 操作系统:Mac 浏览器:谷歌浏览器 抓取m3u8工具:猫爪 视频处理工具:ffmpeg 需要安装工具 ...

  10. git merge 详细操作,看完就懂

    [root@hostname git_test]# git init hint: Using 'master' as the name for the initial branch. This def ...