2020 CCPC Wannafly Winter Camp Day1 - I. K小数查询(分块)

时间:2022-09-01 15:23:39

题目链接:K小数查询

题意:给你一个长度为$n$序列$A$,有$m$个操作,操作分为两种:

  • 输入$x,y,c$,表示对$i\in[x,y] $,令$A_{i}=min(A_{i},c)$
  • 输入$x,y,k$,表示询问区间$[x,y]$中的第$k$小数

思路:数据范围不是很大,可以分块来做,记录每个块已经更新过的最小值$imin[]$,询问时二分答案,然后求出$[x,y]$区间中小于等于$mid$的数的个数$cnt$,通过判断$cnt$与$k$的大小来改变$l,r$即可

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <cmath> using namespace std; const int N = ;
const int INF = 0x3f3f3f3f; int block, belong[N], num, l[N], r[N], imin[N];
int n, m, a[N];
vector<int> v[N]; void build()
{
block = sqrt(n);
num = n / block;
if (n % block) num++;
for (int i = ; i <= num; i++)
l[i] = (i - ) * block + , r[i] = i * block;
r[num] = n;
for (int i = ; i <= n; i++)
belong[i] = (i - ) / block + ;
for (int i = ; i <= num; i++) {
imin[i] = INF;
for (int j = l[i]; j <= r[i]; j++)
v[i].push_back(a[j]);
sort(v[i].begin(), v[i].end());
}
} void reset(int x)
{
v[x].clear();
for (int i = l[x]; i <= r[x]; i++) {
a[i] = min(a[i], imin[x]);
v[x].push_back(a[i]);
}
sort(v[x].begin(), v[x].end());
} void update(int x, int y, int c)
{
int bl = belong[x], br = belong[y];
if (bl == br) {
for (int i = x; i <= y; i++)
a[i] = min(a[i], c);
reset(bl);
return;
}
for (int i = x; i <= r[bl]; i++)
a[i] = min(a[i], c);
reset(bl);
for (int i = l[br]; i <= y; i++)
a[i] = min(a[i], c);
reset(br);
for (int i = bl + ; i < br; i++)
imin[i] = min(imin[i], c);
} int query(int x, int y, int c)
{
int bl = belong[x], br = belong[y], cnt = ;
if (bl == br) {
for (int i = x; i <= y; i++)
if (a[i] <= c || imin[bl] <= c) cnt++;
return cnt;
}
for (int i = x; i <= r[bl]; i++)
if (a[i] <= c || imin[bl] <= c) cnt++;
for (int i = l[br]; i <= y; i++)
if (a[i] <= c || imin[br] <= c) cnt++;
for (int i = bl + ; i < br; i++)
if (imin[i] <= c) cnt = cnt + r[i] - l[i] + ;
else cnt = cnt + upper_bound(v[i].begin(), v[i].end(), c) - v[i].begin();
return cnt;
} int ask(int x, int y, int k)
{
int l = -, r = ;
while (l < r) {
int mid = (l + r) / ;
if (query(x, y, mid) >= k) r = mid;
else l = mid + ;
}
return l;
} int main()
{
scanf("%d%d", &n, &m);
for (int i = ; i <= n; i++)
scanf("%d", &a[i]);
build();
for (int i = ; i <= m; i++) {
int kd, x, y, c;
scanf("%d%d%d%d", &kd, &x, &y, &c);
if ( == kd) update(x, y, c);
else printf("%d\n", ask(x, y, c));
}
return ;
}

2020 CCPC Wannafly Winter Camp Day1 - I. K小数查询(分块)的更多相关文章

  1. 2020 CCPC Wannafly Winter Camp Day1 C&period; 染色图

    2020 CCPC Wannafly Winter Camp Day1 C. 染色图 定义一张无向图 G=⟨V,E⟩ 是 k 可染色的当且仅当存在函数 f:V↦{1,2,⋯,k} 满足对于 G 中的任 ...

  2. 2020 CCPC Wannafly Winter Camp Day1 Div&period;1&amp&semi;amp F

    #include<bits/stdc++.h> #define forn(i, n) for (int i = 0; i < int(n); i++) #define fore(i, ...

  3. 2020 CCPC Wannafly Winter Camp Day1-F-乘法

    题目传送门 sol:二分答案$K$,算大于$K$的乘积有多少个.关键在于怎么算这个个数,官方题解上给出的复杂度是$O(nlogn)$,那么计算个数的复杂度是$O(n)$的.感觉写着有点困难,自己写了一 ...

  4. 2020 CCPC Wannafly Winter Camp Day2-K-破忒头的匿名信

    题目传送门 sol:先通过AC自动机构建字典,用$dp[i]$表示长串前$i$位的最小代价,若有一个单词$s$是长串的前$i$项的后缀,那么可以用$dp[i - len(s)] + val(s)$转移 ...

  5. Wannafly Camp 2020 Day 1I K小数查询 - 分块

    给你一个长度为\(n\)序列\(A\),有\(m\)个操作,操作分为两种: 输入\(x,y,c\),表示对\(i\in[x,y]\),令\(A_{i}=min(A_{i},c)\) 输入\(x,y,k ...

  6. CCPC Wannafly Winter Camp Div2 部分题解

    Day 1, Div 2, Prob. B - 吃豆豆 题目大意 wls有一个\(n\)行\(m\)列的棋盘,对于第\(i\)行第\(j\)列的格子,每过\(T[i][j]\)秒会在上面出现一个糖果, ...

  7. 2019 wannafly winter camp

    2019 wannafly winter camp Name Rank Solved A B C D E F G H I J K day1 9 5/11 O O O O O day2 5 3/11 O ...

  8. 2019 wannafly winter camp day 3

    2019 wannafly winter camp day 3 J 操作S等价于将S串取反,然后依次遍历取反后的串,每次加入新字符a,当前的串是T,那么这次操作之后的串就是TaT.这是第一次转化. 涉 ...

  9. Wannafly Winter Camp 2020 Day 6J K重排列 - dp

    求 \(K\) 是多少个 \(n\) 元置换的周期.\(T\leq 100, n\leq 50, K \leq 10^{18}\) Solution 置换可以被试做若干个环组成的有向图,于是考虑 dp ...

随机推荐

  1. 高品质开源工具Chloe&period;ORM:支持存储过程与Oracle

    扯淡 这是一款高质量的.NET C#数据库访问框架(ORM).查询接口借鉴 Linq.借助 lambda 表达式,可以完全用面向对象的方式就能轻松执行多表连接查询.分组查询.聚合查询.插入数据.批量删 ...

  2. Selenium 面试题总结(乙醇Blog记录的面试题)

    ###selenium中如何判断元素是否存在? - isElementPresent   ###selenium中hidden或者是display = none的元素是否可以定位到? - 不能   # ...

  3. 【LeetCode】96 - Unique Binary Search Trees

    Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...

  4. Quartz集成springMVC 的方案一

    Quartz是一个开放源码项目,专注于任务调度器. springMVC 具体的搭建框架就不具体说明,接下来直接描述把Quartz集成到springMVC 框架中. 步骤: 1.引入所需要的jar包 2 ...

  5. &lbrack;JLOI 2015&rsqb;装备购买

    Description 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装备有 m 个属性,用向量zi(aj ,.....,am) 表示  (1 <= i <= n; 1 &lt ...

  6. 基于PLC1850平台的UDP报文接收与发送

    一.UDP报文格式 源端口(2个字节):发送报文的进程的16位端口号. 目的端口(2个字节):目的设备上的接收进程的16位端口号. 长度(2个字节):整个UDP数据报的长度,包括首都和数据字段. 校验 ...

  7. java访问mysql数据库

    package com.mysql.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.R ...

  8. php 无限极分类问题

  9. DataGridView基本操作

    1.获得某个(指定的)单元格的值:dataGridView1.Row[i].Cells[j].Value;2.获得选中的总行数:dataGridView1.SelectedRows.Count;3.获 ...

  10. PowerDesigner16 生成的备注脚本,在sql server 2008 中报&OpenCurlyDoubleQuote;对象名 &&num;39&semi;sysproperties&&num;39&semi; 无效”的错误的解决办法

    主要是在建模时我们对表.列增加了些说明注释,而Sql2005之后系统表sysproperties已废弃删除而改用sys.extended_properties所致. 1.修改Table TableCo ...