uva 12003 分块
大白上的原题,我就练练手。。。 #include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 3e5 + ;
const int SIZE = ;
ll block[N / SIZE + ][SIZE + ];
ll A[N]; int query(int L, int R, int v)
{
int k = ;
int lb = L / SIZE, rb = R / SIZE;
if(lb == rb) { for(int i = L; i <= R; ++i) if(A[i] < v) k++; }
else {
for(int i = L; i < (lb + ) * SIZE; ++i) if(A[i] < v) k++;
for(int i = rb * SIZE; i <= R; ++i) if(A[i] < v) k++;
for(int i = lb + ; i < rb; ++i) {
k += lower_bound(block[i], block[i] + SIZE, v) - block[i];
}
}
return k;
}
void change(int k, int u, int p, int L, int R)
{
ll x = (ll)u * k / (R - L + );
if(A[p] == x) return; int la = p / SIZE;
ll* B = &block[la][];
int pos = ;
ll old = A[p];
while(B[pos] < old) pos++;
A[p] = x; B[pos] = x;
if(x > old) {
while(pos < SIZE - && B[pos] > B[pos + ]) { swap(B[pos + ], B[pos]); pos++; }
}
else {
while(pos > && B[pos] < B[pos - ]) { swap(B[pos - ], B[pos]); pos--; }
}
}
int main()
{
int n, m, u;
while(~scanf("%d%d%d", &n, &m, &u))
{
int j = , k = ;
for(int i = ; i < n; ++i)
{
scanf("%lld", &A[i]);
block[k][j++] = A[i];
if(j == SIZE) { k++; j = ; }
}
for(int i = ; i < k; ++i) sort(block[i], block[i] + SIZE);
if(j) sort(block[k], block[k] + j);
int L, R, v, p;
while(m --)
{
int ans = ;
scanf("%d%d%d%d", &L, &R, &v, &p);
L--; R--; p--;
ans = query(L, R, v);
change(ans, u, p, L, R);
}
for(int i = ; i < n; ++i) printf("%lld\n", A[i]);
}
return ;
}
uva 12003 分块的更多相关文章
- UVa 12003 Array Transformer (分块)
题意:给定一个序列,然后有 m 个修改,问你最后的序列是什么,修改是这样的 l r v p 先算出从 l 到 r 这个区间内的 小于 v 的个数k,然后把第 p 个的值改成 k * u / (r - ...
- 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> ...
- Array Transformer UVA - 12003
题目:传送门 题意: 给你n个数,要进行m次操作 对于每次操作(l,r,v,p)代表:在区间[l,r]中有x(这个x是需要你自己找出来的)个数小于v,你需要把序列的第p个位置的值改成u∗k/(r−l ...
- UVA - 11754 Code Feat (分块+中国剩余定理)
对于一个正整数N,给出C组限制条件,每组限制条件为N%X[i]∈{Y1,Y2,Y3,...,Yk[i]},求满足条件的前S小的N. 这道题很容易想到用中国剩余定理,然后用求第k小集合的方法输出答案.但 ...
- UVa 1640 (计数) The Counting Problem
题意: 统计[a, b]或[b, a]中0~9这些数字各出现多少次. 分析: 这道题可以和UVa 11361比较来看. 同样是利用这样一个“模板”,进行区间的分块,加速运算. 因为这里没有前导0,所以 ...
- UVa 11526 H(n)
题意: long long H(int n){ long long res = 0; for( int i = 1; i <= n; i=i+1 ){ res = (res + n/i); } ...
- PHP搭建大文件切割分块上传功能
背景 在网站开发中,文件上传是很常见的一个功能.相信很多人都会遇到这种情况,想传一个文件上去,然后网页提示"该文件过大".因为一般情况下,我们都需要对上传的文件大小做限制,防止出现 ...
随机推荐
- 第一次点击Div1显示Div2,再次点击Div1的时候又隐藏Div2
要使用Jquery来实现,记得引用Jquery库哦,代码如下: $(document).ready(function(){ $("#ck1").click(function(){ ...
- September 9th 2016 Week 37th Friday
Within you, I lose myself. 有了你,我迷失了自我. I never had such feeling, maybe just because I never invested ...
- Tomcat在Linux上的安装与配置
以下使用的Linux版本为: Redhat Enterprise Linux 6.5 x86_64,Tomcat版本为tomcat-7.0.54. 1.下载JDK与Tomcat. jdk下载地址 ...
- js获取缓存数据
后台:request.setAttribute("type", type); 前台js获取:var type = "${type}";
- Android -- getQuantityString无效
原文:http://www.xuebuyuan.com/1510993.html 原因:中文没有复数语法.
- EasyUi – 4.datagrid
测试的时候用Json来测试就好啦. <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> ...
- WPF布局
1.Canvas 布局控件 Canvas面板是最轻量级的布局容器,它不会自动调整内部元素的排列和大小,不指定元素位置,元素将默认显示在画布的左上方.Canvas主要用来画图.Canvas默认不会自动裁 ...
- map find 是线程安全的吗
测试环境gcc4.8.2 iterator find ( const key_type& k ); const_iterator find ( const key_type& ...
- Delphi中的异常处理
转载:http://www.cnblogs.com/doit8791/archive/2012/05/08/2489471.html 以前写Delphi程序一直不注意异常处理,对其异常处理的机制总是一 ...
- struts标签<logic:iterate>的用法
<logic:iterate>主要用来处理在页面上输出集合类,集合一般来说是下列之一: 1. java对象的数组 2. ArrayList.Vector.HashMap等 具体用法请参考s ...