Array Transformer UVA - 12003
题目:传送门
题意:
给你n个数,要进行m次操作
对于每次操作(l,r,v,p)代表:在区间[l,r]中有x(这个x是需要你自己找出来的)个数小于v,你需要把序列的第p个位置的值改成u∗k/(r−l + 1)
最后输出序列就完了
题解:
因为他要找出来区间中有多少数小于v,所以我们就要维护一个数组a,在这个a数组里面要放置每一块排序后的结束(我的代码是从小到大排序)。为什么要排序,因为对于一个序列排完序之后我们可以通过二分找出来小于v的那个数的位置,然后我们又知道每一个块的左区间位置和右区间位置,所以可以很简单求出来x的值
具体操作见代码:
1 #include <iostream>
2 #include<stdio.h>
3 #include<string.h>
4 #include<algorithm>
5 #include<math.h>
6 using namespace std;
7 const int maxn=300005;
8 int a[maxn],L[maxn],R[maxn],belong[maxn],b[maxn];
9 int l,r,v,p,n,m,u;
10 void build()
11 {
12 int len=sqrt(n);
13 int ci=n/len;
14 for(int i=1; i<=ci; ++i)
15 {
16 L[i]=len*(i-1)+1;
17 R[i]=len*i;
18 }
19 R[ci]=n;
20
21 for(int i=1; i<=ci; ++i)
22 {
23 for(int j=L[i]; j<=R[i]; ++j)
24 {
25 belong[j]=i;
26 }
27 sort(a+L[i],a+R[i]+1);
28 }
29 }
30 int query()
31 {
32 int ans=0;
33 if(belong[l]==belong[r])
34 {
35 for(int i=l; i<=r; ++i)
36 {
37 if(b[i]<v) ans++;
38 }
39 }
40 else
41 {
42 for(int i=l; i<=R[belong[l]]; i++) ans+=b[i]<v;
43 for(int i=belong[l]+1; i<belong[r]; i++)
44 ans+=lower_bound(a+L[i],a+R[i]+1,v)-a-L[i];
45 for(int i=L[belong[r]]; i<=r; i++) ans+=b[i]<v;
46 }
47 return ans;
48 }
49 void update(int x)
50 {
51 int pos=lower_bound(a+L[belong[p]],a+R[belong[p]]+1,b[p])-a;
52 x=(long long)u*x/(r-l+1);
53 a[pos]=x;
54 if(b[p]>x)
55 {
56
57 for(int i=pos; i>L[belong[p]]; i--)
58 {
59 if(a[i]<a[i-1]) swap(a[i],a[i-1]);
60 else break;
61 }
62 }
63 else if(b[p]<x)
64 {
65
66 for(int i=pos; i<R[belong[p]]; i++)
67 {
68 if(a[i]>a[i+1]) swap(a[i],a[i+1]);
69 else break;
70 }
71 }
72 b[p]=x;
73 }
74 int main()
75 {
76
77 while(~scanf("%d%d%d",&n,&m,&u))
78 {
79 for(int i=1; i<=n; ++i)
80 scanf("%d",&a[i]),b[i]=a[i];
81 build();
82 while(m--)
83 {
84 scanf("%d%d%d%d",&l,&r,&v,&p);
85 update(query());
86 }
87 for(int i=1; i<=n; ++i)
88 {
89 printf("%d\n",b[i]);
90 }
91 }
92 return 0;
93 }
94 /*
95 10 1 11
96 1
97 2
98 3
99 4
100 5
101 6
102 7
103 8
104 9
105 10
106 2 8 6 10
107 */
Array Transformer UVA - 12003的更多相关文章
- UVA 12003 Array Transformer
Array Transformer Time Limit: 5000ms Memory Limit: 131072KB This problem will be judged on UVA. Orig ...
- uva 12003 Array Transformer (线段树套平衡树)
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- uva 12003 Array Transformer (大规模阵列)
白皮书393页面. 乱搞了原始数组中.其实用另一种阵列块记录. 你不能改变原始数组. 请注意,与原来的阵列和阵列块的良好关系,稍微细心处理边境.这是不难. #include <cstdio> ...
- UVa 12003 Array Transformer (分块)
题意:给定一个序列,然后有 m 个修改,问你最后的序列是什么,修改是这样的 l r v p 先算出从 l 到 r 这个区间内的 小于 v 的个数k,然后把第 p 个的值改成 k * u / (r - ...
- uva 12003 分块
大白上的原题,我就练练手... #include <bits/stdc++.h> using namespace std; typedef long long ll; ; ; ll blo ...
- 题解【UVA12003】Array Transformer
题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例#1 10 1 11 1 2 3 4 5 6 7 8 9 10 2 8 6 10 输出样例#1 1 2 3 4 5 6 7 8 9 6 ...
- Spark Mllib框架1
1. 概述 1.1 功能 MLlib是Spark的机器学习(machine learing)库,其目标是使得机器学习的使用更加方便和简单,其具有如下功能: ML算法:常用的学习算法,包括分类.回归.聚 ...
- Spark MLlib框架详解
1. 概述 1.1 功能 MLlib是Spark的机器学习(machine learing)库,其目标是使得机器学习的使用更加方便和简单,其具有如下功能: ML算法:常用的学习算法,包括分类.回归.聚 ...
- UVA - 348Optimal Array Multiplication Sequence(递推)
id=19208">题目:Optimal Array Multiplication Sequence 题目大意:给出N个矩阵相乘.求这些矩阵相乘乘法次数最少的顺序. 解题思路:矩阵相乘 ...
随机推荐
- JavaScript入门-函数function(二)
JavaScript入门-函数function(二) 递归函数 什么是递归函数? 递归简单理解就是,在函数体里,调用自己. //我们在求一个10的阶乘的时候,可能会这么做 //写一个循环 var to ...
- CTFshow萌新赛-密码学签到
查看密码信息 猜测为base家族 存在"^"符号,所以应该是在base64以上 使用base85解密 成功拿到flag
- Array.of使用实例
Array.of是es6新增的API,其实粗暴点理解,光看of,就可以猜到它是数组的意思,所以猜测可以用来把字符串转换成数组. 像这样的table,有批量删除和单个删除的功能,,但是又不想写两个方法, ...
- 1.2V转3.3V芯片电路图,超简电路
镍氢可充电电池1.2V转成3.3V的电路和电子产品很多,在实际适用中,即使是两节镍氢电池串联供电也是会有供电电压下降和不稳定的影响,这是因为电池电量减少,而导致电池的电压也是会随着降低. 一般情况下, ...
- Python入门之修改jupyter启动目录
[导读]在给大家分享知识的过程中,我们也会分享一些小技巧,能够帮助大家在学习过程中有更好的体验.之前我们给大家分享了anaconda安装教程以及jupyter notebook使用方法,今天我们为大家 ...
- Android 代码规范大全
前言 虽然我们项目的代码时间并不长,也没经过太多人手,但代码的规范性依然堪忧,目前存在较多的比较自由的「代码规范」,这非常不利于项目的维护,代码可读性也不够高, 此外,客户端和后端的研发模式也完全不同 ...
- Vue之优化封装请求方法
Vue之优化封装请求方法 对于代码中的请求操作 1.接口请求可能需要重用 2.实际工作中,接口非常容易变动, 改起来很麻烦! 我们建议的做法是把所有的请求都封装成函数然后统一的>###组织到模块 ...
- KDB调试 — ARM
1 寄存器 1.1 通用寄存器 A64指令集可以看到31个64位通用(整数)寄存器,分别是R0-R30. 在64位上下文中,这些寄存器通常使用名称x0-x30来表示; 在 ...
- P5689 多叉堆
写在前面 OI 生涯中 AC 的首道组合数学应用题. 开题 5min 发现规律,写了半下午代码,调了两天,然而甚至没过样例,心态崩了.几天之后重新写了一份代码才 AC. 虽然思维难度不大,但毕竟是联赛 ...
- CF 板刷总结
CF 板刷总结 这件事的开始要从万圣节那一天说起.当然,万圣节只用于描述时间,我显然是不参加任何万圣节活动的对吧. 以下是一些我觉得有必要拿出来讲的,有技术含量的题.会持续更新,断更了记得来催更. C ...