[OJ#40]后宫佳丽

试题描述

如果机房要关门了,或者有妹子在等你,你可以直接看最后一句话。

Fyq 是一只饥渴的鸭子。

Fyq 有一个充实的后宫,可惜他总是体力不支,为此他经常苦恼,总是想方设法让自己能够泡到更多妃子。

Fyq 为他的的每个妃子建立了一间屋子,屋子与屋子之间可能有一条路连接。每条路有一个长度 len,Fyq 走过这条路时会消耗 len 的体力,但是当 Fyq 进入一间屋子云雨一翻后,体力立刻恢复至初始值。每个妃子有一个类型 typei,Fyq 希望知道他见到次数最多的会是哪个类型,以便做更加充分的准♂备。注意,如果有见到次数并列第一的几个类型,那么请输出类型编号最小的,因为 Fyq 更加偏爱类型编号小的妃子。

接下来有 q 天,Fyq 每天都打算找他的妃子们。第 i 天他会从妃子 xi 的屋子出发,初始时有 wi 的体力。你不能让 Fyq 太虚导致他无法好好享受,所以你要保证任何时刻不能让他的体力值低于 0。

一句话题意:给你一个 n 个节点 m 条边的无向图,边有长度,点带颜色(节点 i 的颜色为 typei);给你 q 个询问形如 (xi,wi),每次你从节点 xi 出发,只能走长度不超过 wi 的边,问经过的所有节点中颜色数目最多的颜色是哪个(如果有多个并列,输出颜色编号最小的)。

(无向图有可能不连通。)

输入

第一行三个整数 n,m,secret。secret 的含义待会解释。

第二行 n 个整数,第 i 个整数表示 typei

接下来 m 行每行三个整数 u,v,len,表示 u,v 之间有一条长度为 len 的双向边。

接下来一行一个整数 q。

接下来 q 行,每行两个整数 xi,wi 表示 Fyq 一天的计划。

secret 的值域为 {0,1},若 secret=1 表示 Fyq 比较害羞,他不肯一次告诉你接下来 q 天的所有计划,所以他对计划进行了加密,解密的方式 xi 和 wi 都异或上 lastans,lastans 表示昨天的答案;如果是第一天 lastans=0,即第一天的信息 Fyq 没有加密。

输出

输出 q 行,第 i 行一个整数表示第 i 天的答案。

输入示例1

5 6 0
2 1 1 3 2
1 2 2
1 3 4
2 3 7
3 4 5
4 5 6
5 3 3
4
1 1
2 2
4 4
5 8

输出示例1

2
1
3
1

输入示例2

5 6 1
2 1 1 3 2
1 2 2
1 3 4
2 3 7
3 4 5
4 5 6
5 3 3
4
1 1
0 0
5 5
6 11

输出示例2

2
1
3
1

数据规模及约定

对于 20% 的数据,1≤n≤1000

对于另外 40% 的数据,secret=0

对于全部数据,1≤n≤105,1≤m,q≤2×105,1≤typei,u,v,xi≤n,1≤len,wi≤106

题解

我们构出 kruskal 重构树,问题变成了求子树内最小众数,可以自底向上用平衡树启发式合并算出每个节点的子树的答案。

关于 kruskal 重构树可以去看一下这道题。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
using namespace std;int read() {int x = 0, f = 1; char c = getchar();while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }return x * f;
}#define maxn 100010
#define maxm 200010
#define maxlog 18struct Node {int col, val, r, siz;Node() {}Node(int _1, int _2, int _3): col(_1), val(_2), r(_3) {}bool operator < (const Node& t) const { return val != t.val ? val < t.val : col > t.col; }
} ns[maxn];
int ToT, ch[maxn][2], fa[maxn], rec[maxn], rcnt;
int getnode() {if(rcnt) {int o = rec[rcnt--];ch[o][0] = ch[o][1] = fa[o] = 0;return o;}return ++ToT;
}
void maintain(int o) {if(!o) return ;ns[o].siz = ns[ch[o][0]].siz + 1 + ns[ch[o][1]].siz;return ;
}
void rotate(int u) {int y = fa[u], z = fa[y], l = 0, r = 1;if(z) ch[z][ch[z][1]==y] = u;if(ch[y][1] == u) swap(l, r);fa[u] = z; fa[y] = u; fa[ch[u][r]] = y;ch[y][l] = ch[u][r]; ch[u][r] = y;maintain(y); maintain(u);return ;
}
Node opt;
void Add(int& o, int col, int val) {if(!o) {ns[o = getnode()] = Node(col, val, rand()); opt = max(opt, ns[o]);return maintain(o);}if(ns[o].col == col){ ns[o].val += val; opt = max(opt, ns[o]); return ; }bool d = col > ns[o].col; opt = max(opt, ns[o]);Add(ch[o][d], col, val); fa[ch[o][d]] = o;if(ns[ch[o][d]].r > ns[o].r) {int t = ch[o][d];rotate(t); o = t;}return maintain(o);
}
Node Set[maxn]; int cnts;
void recycle(int& o) {if(!o) return ;Set[++cnts] = ns[o];rec[++rcnt] = o;recycle(ch[o][0]); recycle(ch[o][1]);o = 0;return ;
}struct Edge {int a, b, c;Edge() {}Edge(int _1, int _2, int _3): a(_1), b(_2), c(_3) {}bool operator < (const Edge& t) const { return c < t.c; }
} es[maxm];int pa[maxn<<1], Rt[maxn<<1];
int findset(int x){ return x == pa[x] ? x : pa[x] = findset(pa[x]); }int E, head[maxn<<1], nxt[maxn<<1], to[maxn<<1], Fa[maxn<<1][maxlog];
void AddEdge(int a, int b) {to[++E] = b; nxt[E] = head[a]; head[a] = E;return ;
}
bool vis[maxn<<1];
void build(int u) {vis[u] = 1;for(int i = 1; i < maxlog; i++) Fa[u][i] = Fa[Fa[u][i-1]][i-1];for(int e = head[u]; e; e = nxt[e])Fa[to[e]][0] = u, build(to[e]);return ;
}int color[maxn<<1], totc[maxn<<1], wei[maxn<<1];
int jump(int u, int W) {for(int i = maxlog - 1; i >= 0; i--) if(Fa[u][i] && wei[Fa[u][i]] <= W) u = Fa[u][i];return u;
}int main() {int n = read(), m = read(), online = read();for(int i = 1; i <= n; i++) color[i] = read();for(int i = 1; i <= m; i++) {int a = read(), b = read(), c = read();es[i] = Edge(a, b, c);}sort(es + 1, es + m + 1);for(int i = 1; i < (n << 1); i++) {pa[i] = i;if(i <= n) Add(Rt[i], color[i], 1), totc[i] = 1, wei[i] = 0;}for(int i = 1; i <= m; i++) {int a = findset(es[i].a), b = findset(es[i].b), c;if(a != b) {wei[c = ++n] = es[i].c;if(ns[Rt[a]].siz < ns[Rt[b]].siz) swap(a, b);Rt[c] = Rt[a]; recycle(Rt[b]);opt = Node(color[a], totc[a], 0);while(cnts) Add(Rt[c], Set[cnts].col, Set[cnts].val), cnts--;color[c] = opt.col; totc[c] = opt.val;AddEdge(c, a); AddEdge(c, b);pa[a] = pa[b] = c;}}for(int i = n; i; i--) if(!vis[i]) build(i);
//  for(int i = 1; i <= n; i++) printf("%d%c", color[i], i < n ? ' ' : '\n');int q = read(), lst = 0;for(int k = 1; k <= q; k++) {int x = read() ^ lst * online, w = read() ^ lst * online;printf("%d\n", lst = color[jump(x,w)]);}return 0;
}

转载于:https://www.cnblogs.com/xiao-ju-ruo-xjr/p/6606038.html

[OJ#40]后宫佳丽相关推荐

  1. 清朝后宫佳丽的真实照片

  2. synchronized 王的后宫总管,线程是王妃

    假如 synchronized 是「王」身边的「大总管」,那么 Thread 就像是他后宫的王妃.「王」每日只能选择一个王妃陪伴,王妃们会想方设法争宠获得陪伴权,大总管需要通过一定的手段让王「翻牌」一 ...

  3. 后宫模拟器代码 面向对象文章辅助使用

    后宫模拟器代码 人父类 妃子子类 宦官子类 医生子类 皇帝 测试类 代码块 代码块测试 资源 人父类 package com.qingsu.personnel;public class Person ...

  4. CodeVS4416 FFF 团卧底的后宫

    题目描述 Description 你在某日收到了 FFF 团卧底的求助,在他某日旅游回来,他的后宫们出现了一些不可调和的矛盾,如果 FFF 团卧底把自己的宝贝分给 a 号妹子,那么 b 号妹子至少要在 ...

  5. C++ -- 基于多态的后宫管理系统(其实就是职工管理或者图书管理系统根据我自己的需求改编,毕竟追我的人太多了,要好好管理一下)

    Linux环境下C++基于多态的后宫管理系统 实现如下几个功能 后宫每位佳丽都有4个属性,分别是编号.姓名.颜值.身份 并且把数据保存到文件中,保证数据不会在程序结束时流失,下一次使用还可以恢复以前的 ...

  6. CODE[VS] 4416 FFF团卧底的后宫

    题目描述 Description 你在某日收到了 FFF 团卧底的求助,在他某日旅游回来,他的后宫们出现了一些不可调和的矛盾,如果 FFF 团卧底把自己的宝贝分给 a 号妹子,那么 b 号妹子至少要在 ...

  7. 后宫宛如传服务器维护,更新丨《后宫宛如传》1.21.0版本更新公告

    原标题:更新丨<后宫宛如传>1.21.0版本更新公告 亲爱的小主: 为了改善小主们的后宫生活,宫廷将于 1月7日(周四)凌晨2:00-6:00停服更新(最新服不停服),开服时间会视维护进度 ...

  8. 你想体验后宫选妃吗?js带你体验后宫选妃

    你想体验后宫选妃吗?js带你体验后宫选妃 1.点击开始,启动定时器,获取当前时间置于文本框中,每隔10秒记录下来选中的妃子,点击去重,可以去除重复的妃子名 2.点击停止,停止选妃 效果实现: 代码实现 ...

  9. 差分约束 4416 FFF 团卧底的后宫

    /* 4416 FFF 团卧底的后宫  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解 题目描述 Description 你在某日收到了 FFF 团卧底的求 ...

最新文章

  1. 卓越性能代码_「Win」被隐藏起来的卓越性能模式,为何不想让人发现?
  2. modbus通讯失败_技成周报38期 | SMART PLC Modbus通讯、组态、模拟量等常见问题
  3. php curl 模拟多线程,php利用curl 多线程 模拟 并发的详解
  4. [可视化-tableau]tableau的学习实践入门篇
  5. python txt文件排序,使用Python在.txt文件中按數值(降序)排序高分列表
  6. Android全面屏如何做适配
  7. gpgga格式读取MATLAB,gpgga数据格式
  8. MySQL8的URL和Driver的写法
  9. Windows每次开机键盘无法使用,需要重新拔插键盘USB接口的解决方案
  10. 独家对话行癫:最详解密阿里云顶层设计和底层逻辑
  11. 计算—六合彩的中奖概率
  12. easyexcel获取所有sheet页名称_【EXCEL】如何快速获取所有表格名称
  13. 基带集成或独立?市售主流4G手机芯片浅析
  14. 一个故事看懂AI神经网络工作原理
  15. 倒计时、定时器的五种方式,有这篇就够了
  16. STM32控制舵机转动_从0到1
  17. 阿朱推荐的产品经理读物30本书(修订版)
  18. 股票逐笔成交接口lv2
  19. 农夫、狼、羊过河问题
  20. 年薪20万招java讲师

热门文章

  1. docker springboot读取配置文件_Docker从入门到掉坑(三):容器太多,操作好麻烦
  2. pytorch torch.nn.TransformerEncoderLayer
  3. mysql 分组group
  4. nginx listen
  5. C++ newdelete
  6. jQuery 事件方法(交互)
  7. Mysql 学习总结(86)—— Mysql 的 JSON 数据类型正确使用姿势
  8. Java基础学习总结(37)——Java23中设计模式(Design Patterns)详解
  9. 50道编程小题目之【完全平方数】
  10. stm08S单片机C语言编,STM8S单片机入门1(开发环境搭建)