BZOJ K大数查询(分治)(Zjoi2013)

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3110

Description

有N个位置,M个操作。操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c
如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少。

Input

第一行N,M
接下来M行,每行形如1 a b c或2 a b c

Output

输出每个询问的结果

题目大意:略。
思路:分治答案。答案范围[-n, n],从前往后扫描,若是插入操作且c>mid,则把线段树中区间[a, b]加一,并置为为类别1;否则置为类别0。若是询问操作,若目前线段树中区间[a, b]的和小于等于c,则置为类别1;否则置为类别0,并把c减去区间[a, b]的和。然后分治处理,其中类别0中,答案范围为[-n, mid];类别1中,答案范围为[mid + 1, n]。按类别排序后,两个区间之间互不影响。时间复杂度为O(nlognlogn)。
代码(4940MS):
  1 #include <cstdio>
  2 #include <algorithm>
  3 #include <iostream>
  4 #include <cstring>
  5 using namespace std;
  6 typedef long long LL;
  7 
  8 const int MAXN = 50010;
  9 const int MAXT = MAXN << 2;
 10 
 11 int sum[MAXT];
 12 int add[MAXT];
 13 bool clr[MAXT];
 14 
 15 #define ll (x << 1)
 16 #define rr (ll | 1)
 17 #define mid ((l + r) >> 1)
 18 void initTree() {
 19     sum[1] = add[1] = 0;
 20     clr[1] = true;
 21 }
 22 
 23 void pushdown(int x, int l, int r) {
 24     if(clr[x]) {
 25         clr[ll] = clr[rr] = true;
 26         sum[ll] = sum[rr] = add[ll] = add[rr] = 0;
 27         clr[x] = false;
 28     }
 29     if(add[x]) {
 30         sum[ll] += (mid - l + 1) * add[x];
 31         add[ll] += add[x];
 32         sum[rr] += (r - mid) * add[x];
 33         add[rr] += add[x];
 34         add[x] = 0;
 35     }
 36 }
 37 
 38 void maintain(int x) {
 39     sum[x] = sum[ll] + sum[rr];
 40 }
 41 
 42 void modify(int x, int l, int r, int a, int b) {
 43     if(a <= l && r <= b) {
 44         add[x]++;
 45         sum[x] += (r - l + 1);
 46     } else {
 47         pushdown(x, l, r);
 48         if(a <= mid) modify(ll, l, mid, a, b);
 49         if(mid < b) modify(rr, mid + 1, r, a, b);
 50         maintain(x);
 51     }
 52 }
 53 
 54 int query(int x, int l, int r, int a, int b) {
 55     if(a <= l && r <= b) {
 56         return sum[x];
 57     } else {
 58         pushdown(x, l, r);
 59         int res = 0;
 60         if(a <= mid) res += query(ll, l, mid, a, b);
 61         if(mid < b) res += query(rr, mid + 1, r, a, b);
 62         return res;
 63     }
 64 }
 65 #undef mid
 66 
 67 struct Node {
 68     int op, id, a, b, c, v;
 69     void read(int i) {
 70         id = i;
 71         scanf("%d%d%d%d", &op, &a, &b, &c);
 72     }
 73     bool operator < (const Node &rhs) const {
 74         if(v != rhs.v) return v < rhs.v;
 75         return id < rhs.id;
 76     }
 77 } p[MAXN];
 78 int ans[MAXN];
 79 int n, m;
 80 
 81 void work(int a, int b, int l, int r) {
 82     if(l > r) return ;
 83     if(a == b) {
 84         for(int i = l; i <= r; ++i)
 85             if(p[i].op == 2) ans[p[i].id] = a;
 86         return ;
 87     }
 88     initTree();
 89     int mid = a + ((b - a) >> 1), t = l - 1;
 90     for(int i = l; i <= r; ++i) {
 91         if(p[i].op == 1) {
 92             if(p[i].c > mid) modify(1, 1, n, p[i].a, p[i].b), p[i].v = 1;
 93             else p[i].v = 0;
 94         } else {
 95             int s = query(1, 1, n, p[i].a, p[i].b);
 96             if(p[i].c <= s) p[i].v = 1;
 97             else p[i].v = 0, p[i].c -= s;
 98         }
 99         t += !p[i].v;
100     }
101     sort(p + l, p + r + 1);
102     work(a, mid, l, t);
103     work(mid + 1, b, t + 1, r);
104 }
105 
106 int main() {
107     scanf("%d%d", &n, &m);
108     for(int i = 1; i <= m; ++i) p[i].read(i);
109     memset(ans + 1, 0x80, m * sizeof(int));
110     work(-n, n, 1, m);
111     for(int i = 1; i <= m; ++i)
112         if(ans[i] >= -n) printf("%d\n", ans[i]);
113 }
View Code

 

转载于:https://www.cnblogs.com/oyking/p/3905850.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473162.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么电脑不能打字_为什么不能用电脑验光仪测出来的度数直接配眼镜?

当今世界&#xff0c;科学技术爆炸式发展和进步&#xff0c;很多人问我&#xff1a;“电脑验光仪的准确度越来越高&#xff0c;会不会取代人工验光师&#xff1f;”我们这代人从小听着学着“科学技术是第一生产力”长大的&#xff0c;自然是技术崇拜者&#xff0c;自然的反应当…

前端DEMO:网络上流行的抖音罗盘

一、效果&#xff1a; 二、关于代码&#xff1a; CSS/demo.css代码&#xff1a; * {margin: 0;padding: 0; } html, body {width: 100%;height: 100%;background-color: black;overflow: hidden; } #clock {position: relative;width: 100%;height: 100%;background: black; }…

一个符合SEO优化标准的网站应具备哪些特征?

我们在进行网站建设时&#xff0c;都希望自己的网站能在搜索引擎中获得一个好的排名&#xff0c;都希望自己的网站能有很多的网页被百度等主流搜索引擎收录。要想获得搜索引擎的青睐&#xff0c;前提是要做好网站的SEO优化。那么&#xff0c;一个符合SEO优化标准的网站应该具备…

[Kaggle] Sentiment Analysis on Movie Reviews(BERT)

文章目录1. 预训练模型下载2. 数据集3. 加载预训练模型4. 提交结果练习地址&#xff1a;https://www.kaggle.com/c/sentiment-analysis-on-movie-reviews 相关博文&#xff1a; [Kaggle] Spam/Ham Email Classification 垃圾邮件分类&#xff08;BERT&#xff09; 本文使用 hu…

Qt利用avilib实现录屏功能_openlayers6结合geoserver利用WFS服务实现图层编辑功能(附源码下载)...

内容概览1.openlayers6结合geoserver利用WFS服务实现图层编辑功能2.源代码demo下载效果图如下&#xff1a;本篇主要是参照openlayers6结合geoserver利用WFS服务实现图层新增功能(附源码下载)基础上实现的&#xff0c;openlayers6通过调用geoserver发布的地图服务WFS来达到图层编…

Python 解决写入csv中间隔一行空行问题

一、问题描述&#xff1a;生成的csv文件每两行中间都有一行空白行 # 写入csv&#xff1a; with open(birth_weight_file,w) as f:writercsv.writer(f)writer.writerow(birth_header)writer.writerows(birth_data)f.close() 二、解决办法&#xff1a;写入后面加上newline wit…

LeetCode DD-2020006. 简单游戏(前缀和)

文章目录1. 题目2. 解题1. 题目 给出一个长度为 n 的数组 a&#xff0c;你需要在这个数组中找到一个长度至少为 m 的区间&#xff0c;使得这个区间内的数字的和尽可能小。 输入描述: 第一行包含一个正整数 n&#xff0c;m,表示数组的大小和所选区间的最小长度。(1<n<1…

【转载】OpenStack Swift学习笔记

免责声明&#xff1a; 本文转自网络文章&#xff0c;转载此文章仅为个人收藏&#xff0c;分享知识&#xff0c;如有侵权&#xff0c;请联系博主进行删除。 原文作者&#xff1a;崔炳华 原文地址&#xff1a;http://blog.csdn.net/i_chips/article/details/17787017 1 概…

Android Studio 选项菜单和动画结合_Android 应用与iOS 应用之间的设计差异对比!

同一个App&#xff0c;为什么iOS 和Android 的交互操作有那么大的区别&#xff1f;本文将用大量原生设计案例&#xff0c;为你一一说明它们为什么应该这样做&#xff0c;赶紧学起来&#xff01;了解并适当结合平台规范与优势&#xff0c;才能做到最佳的用户体验。为了创建最佳的…

图片操作案例:python 批量更改图像尺寸到统一大小的方法

一、需求&#xff1a; 批量修改该图片长与宽尺寸 二、素材&#xff1a; 三、代码&#xff1a; from PIL import Image import os.path import globdef convertjpg(jpgfile,outdir,width512,height512):imgImage.open(jpgfile)try:new_imgimg.resize((width,height),Image.BI…

LeetCode 753. 破解保险箱(DFS)

文章目录1. 题目2. 解题1. 题目 有一个需要密码才能打开的保险箱。 密码是 n 位数, 密码的每一位是 k 位序列 0, 1, …, k-1 中的一个 。 你可以随意输入密码&#xff0c;保险箱会自动记住最后 n 位输入&#xff0c;如果匹配&#xff0c;则能够打开保险箱。 举个例子&#x…

windows副本不是正版怎么解决_解决Windows沙盒怎么联网问题

windows 沙盒简单来讲就是一款沙盒虚拟化的Windows系统&#xff0c;而最近还蛮多小伙伴来问小编说&#xff0c;Windows沙盒能够联网吗&#xff1f;Windows沙盒怎么联网&#xff1f;针对这个问题&#xff0c;接下来小编就来和大家好好的说说关于windows沙盒的情况吧。1、首先我们…

textract安装使用

http://textract.readthedocs.org/en/latest/ import textracttext textract.process("rbm.pdf")转载于:https://www.cnblogs.com/huiwq1990/p/3915751.html

西瓜视频(头条)解析并利用IDM工具下载

一、西瓜视频网址解析完整代码&#xff1a; import requests import urllib3 urllib3.disable_warnings() import re import json import base64cookie你的cookie headers{"user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like…

天池 在线编程 寻找字母(计数)

文章目录1. 题目2. 解题1. 题目 给定一个字符串str&#xff0c;返回字符串中字母顺序最大的而且同时在字符串中出现大写和小写的字母。 如果不存在这样的字母&#xff0c;返回‘~‘。 please return uppercase |str|<1000示例 例 1&#xff1a; 输入:"aAbBcD" 输…

电脑硬件检测_【学无止境】电脑硬件维修测试学习资料(附送各类PC检修资源)...

大橙子资源驿站『 电脑硬件维修测试学习资料』多年的PC硬件检修工具和资料&#xff0c;都是本人一年年亲测积累起来的&#xff0c;安全无毒。打包上传分享给大家。—— 资源分享者语关于『 电脑硬件维修学习资料 』这是甛橙从论坛搬运的&#xff0c;因为看着评分挺高&#xff0…

加速国内 Github 访问,下载的9种方案!

1、GitHub 镜像访问 ​​​​​​​这里提供两个最常用的镜像地址&#xff1a; https://github.com.cnpmjs.org https://hub.fastgit.org 也就是说上面的镜像就是一个克隆版的Github&#xff0c;你可以访问上面的镜像网站&#xff0c;网站的内容跟Github是完整同步的镜像&…

C#验证邮件

public static bool IsEmail(string email) {String strExp "\w([-.]\w)*\w([-.]\w)*\.\w([-.]\w)*";Regex r new Regex(strExp);Match m r.Match(email);return m.Success; }转载于:https://www.cnblogs.com/51net/p/3916075.html

天池 在线编程 三等分(模拟)

文章目录1. 题目2. 解题1. 题目 给定一个由 0 和 1 组成的数组 A&#xff0c;将数组分成 3 个非空的部分&#xff0c;使得所有这些部分表示相同的二进制值。 如果可以做到&#xff0c;请返回任何 [i, j]&#xff0c;其中 i1 < j&#xff0c;这样一来&#xff1a; A[0], A…

Python设计模式之模板方法模式实例详解

1、模板方法模式定义 定义一个操作中的算法的框架&#xff0c;而将一些步骤延迟到子类中&#xff0c;使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定的步骤。 子类实现的具体方法叫作基本方法&#xff0c;实现对基本方法高度的框架方法&#xff0c;叫作模板方…