语言系统紊乱了 QAQ

这道题感觉不是很难鸭 qwq。

先只考虑一个国家,怎么做?很显然,就直接二分一下就行了。判定答案可以维护一个差分数组,然后最后对它做一个前缀和,再求一下这个国家的流行数量就好了 qwq。

二分是 \(O(\log_k)\) 的,差分最坏要做 \(O(k)\) 的,前缀和是 \(O(m)\) 的,所以总共时间复杂度是 \(O((k + m)\log_2 k)\)。

诶?\(m\) 为什么会出现在这个复杂度里?许昊然巨佬在他的论文里写到了,我们的这个复杂度每次只能和待处理的操作长度有关,而不能和总序列长度有关。

这怎么办?我们不能用 \(O(m)\) 直接做一遍前缀和,那我们就用一个树状数组维护这个前缀和。

套上整体二分的板子就没了趴

#include <iostream>
#include <vector>
#define MAXN 500000
#define QWQ cout << "qwq" << endl;
using namespace std;
int n, m, k;
vector <int> vec[MAXN + 10];
int Q[MAXN + 10], ta[MAXN + 10], tb[MAXN + 10], ans[MAXN + 10];
int L[MAXN + 10], R[MAXN + 10], val[MAXN + 10];
int tr[MAXN + 10], aim[MAXN + 10]; int lowbit(int x){return x & (-x);}
void add(int pos, int val) {
for(; pos <= m; pos += lowbit(pos))
tr[pos] += val;
}
int query(int pos) {
int rest = 0;
while(pos) {
rest += tr[pos];
pos -= lowbit(pos);
}
return rest;
} void solve(int l, int r, int s, int t) {
if(s == t) {
for(int p = l; p <= r; p++)
ans[Q[p]] = s;
return ;
}
int mid = (s + t) >> 1;
for(int p = s; p <= mid; p++)
if(L[p] <= R[p])
add(L[p], val[p]), add(R[p] + 1, -val[p]);
else {
add(L[p], val[p]), add(m + 1, -val[p]);
add(1, val[p]), add(R[p] + 1, -val[p]);
} int t1 = 0, t2 = 0; for(int p = l; p <= r; p++) {
int tal = 0;
for(int i = 0; i < vec[Q[p]].size(); i++) {
tal += query(vec[Q[p]][i]);
if(tal >= aim[Q[p]]) break;
} if(tal >= aim[Q[p]]) ta[++t1] = Q[p];
else aim[Q[p]] -= tal, tb[++t2] = Q[p];
}
for(int p = s; p <= mid; p++)
if(L[p] <= R[p])
add(L[p], -val[p]), add(R[p] + 1, val[p]);
else {
add(L[p], -val[p]), add(m + 1, val[p]);
add(1, -val[p]), add(R[p] + 1, val[p]);
} for(int p = l, i = 1; i <= t1; p++, i++) Q[p] = ta[i];
for(int p = l + t1, i = 1; i <= t2; p++, i++) Q[p] = tb[i];
solve(l, l + t1 - 1, s, mid);
solve(l + t1, r, mid + 1, t);
} int main() {
cin >> n >> m;
for(int p = 1, x; p <= m; p++) {
cin >> x;
vec[x].push_back(p);
}
for(int p = 1; p <= n; p++)
cin >> aim[p], Q[p] = p; cin >> k;
int tot = 0;
for(int p = 1; p <= k; p++) {
int a, b, c;
cin >> L[p] >> R[p] >> val[p];
} solve(1, n, 1, k + 1);
for(int p = 1; p <= n; p++) {
if(ans[p] == k + 1) cout << "NIE" << endl;
else cout << ans[p] << endl;
}
}

[POI2011]MET-Meteors 解题报告的更多相关文章

  1. 洛谷 P3521 [POI2011]ROT-Tree Rotations 解题报告

    P3521 [POI2011]ROT-Tree Rotations 题意:递归给出给一棵\(n(1≤n≤200000)\)个叶子的二叉树,可以交换每个点的左右子树,要求前序遍历叶子的逆序对最少. 大体 ...

  2. CH Round #56 - 国庆节欢乐赛解题报告

    最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...

  3. 二模13day1解题报告

    二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...

  4. BZOJ 1051 最受欢迎的牛 解题报告

    题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4438  Solved: 2353[S ...

  5. 习题:codevs 2822 爱在心中 解题报告

    这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...

  6. 习题:codevs 1035 火车停留解题报告

    本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...

  7. 习题: codevs 2492 上帝造题的七分钟2 解题报告

    这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...

  8. 习题:codevs 1519 过路费 解题报告

    今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...

  9. NOIP2016提高组解题报告

    NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合

  10. LeetCode 解题报告索引

    最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中......                        ...

随机推荐

  1. 关于python3格式化字符输出的问题

    前言 今天简答写了一个爬虫,利用 % 格式化输出总是有问题 第一种写法: url = 'https://yysygw.res.netease.com/pc/gw/20190826151318/data ...

  2. 【离线数仓】Day03-系统业务数据仓库:数仓表概念、搭建、数据导入、数据可视化、Azkaban全调度、拉链表的使用

    一.电商业务与数据结构简介 1.业务流程 2.常识:SKU/SPU SKU=Stock Keeping Unit(库存量基本单位).现在已经被引申为产品统一编号的简称,每种产品均对应有唯一的SKU号. ...

  3. .NET 6 实现滑动验证码(四)、扩展类

    为了能够通过配置文件(appsettings.json)或通过代码进行背景图片与模板进行配置.可自定义资源类型.自定义验证规则,本节创建一些扩展类,用来实现这些功能. 上一节内容:NET 6 实现滑动 ...

  4. OpenVINO计算机视觉模型加速

    OpenVINO计算机视觉模型加速 OpenVINO介绍 计算机视觉部署框架,支持多种边缘硬件平台 Intel开发并开源使用的计算机视觉库 支持多个场景视觉任务场景的快速演示 四个主要模块: 1.开发 ...

  5. YonBuilder移动开发平台功能大盘点

    YonBuilder是面向企业组织和个人开发者的低代码开发平台,实现无代码.低代码.专业代码开发三种模式.提供元数据驱动和画布构建两种开发方式,通过点击拖拽+自动化代码生成和移动多端编译的技术,与开放 ...

  6. Solon Java Framework v1.12.0 发布

    一个更现代感的 Java 应用开发框架:更快.更小.更自由.没有 Spring,没有 Servlet,没有 JavaEE:独立的轻量生态.主框架仅 0.1 MB. @Controller public ...

  7. [OpenCV实战]13 OpenCV中使用Mask R-CNN进行对象检测和实例分割

    目录 1 背景介绍 1.1 什么是图像分割和实例分割 1.2 Mask-RCNN原理 2 Mask-RCNN在OpenCV中的使用 2.1 模型下载 2.2 模型初始化 2.3 模型加载 2.4 输出 ...

  8. Visual Studio2017快速收缩/扩展代码块

    首先要设置伸缩函数的同时也伸缩region块: 快捷键 Ctrl+M+O 收缩所有方法 Ctrl+M+L 展开所有方法

  9. 又一重要进展发布!OpenMMLab算法仓支持昇腾AI训练加速

    摘要:上海人工智能实验室的浦视开源算法体系(OpenMMLab)团队基于昇腾AI发布了MMDeploy 0.10.0版本,该版本已支持OpenMMLab算法仓库在昇腾异构计算架构CANN上的推理部署. ...

  10. 数据结构与算法 -> 并查集

    一.并查集概念 并查集是一种树形的数据结构,顾名思义,它用于处理一些不交集的合并及查询问题. 它支持两种操作: 查找(Find):确定某个元素处于哪个子集,单次操作时间复杂度 O(α(n)),即查询元 ...