整体二分(SP3946 K-th Number ZOJ 2112 Dynamic Rankings)

时间:2022-01-30 23:43:34

SP3946 K-th Number

(/2和>>1不一样!!)

#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector> #if __cplusplus >= 201103L
#include <array>
#include <atomic>
#include <chrono>
#include <condition_variable>
#include <forward_list>
#include <future>
#include <initializer_list>
#include <mutex>
#include <random>
#include <ratio>
#include <regex>
#include <scoped_allocator>
#include <system_error>
#include <thread>
#include <tuple>
#include <typeindex>
#include <type_traits>
#include <unordered_map>
#include <unordered_set>
#endif
#define INF 1000000007
#define MAXN 200010
using namespace std;
struct Node {
int x,y,a,b,c;
}q[MAXN],a[MAXN],b[MAXN];
int t[MAXN],ans[MAXN],n,m,x,y,z,cnt,k;
inline int read() {
char ch;
bool f=false;
int res=0;
while (((ch=getchar())<'0'||ch>'9')&&ch!='-');
if (ch=='-')
f=true;
else
res=ch-'0';
while ((ch=getchar())>='0'&&ch<='9')
res=(res<<3)+(res<<1)+ch-'0';
return f?~res+1:res;
}
inline int lowbit(int x) {
return x&(-x);
}
inline void add(int x,int y) {
while (x<=n) {
t[x]+=y,x+=lowbit(x);
}
}
inline int sum(int x) {
int summ=0;
while (x>0) {
summ+=t[x],x-=lowbit(x);
}
return summ;
}
inline void Build(int x,int i){
cnt++;
q[cnt].x=x,q[cnt].b=1,q[cnt].c=i;
}
inline void Build1(int x,int y,int k,int i){
cnt++;
q[cnt].x=x,q[cnt].y=y,q[cnt].a=k,q[cnt].b=2,q[cnt].c=i;
}
void sc(int t,int w,int l,int r) {
if (t>=w)
return;
if (l==r) {
for (int i=t;i<=w;++i)
if (q[i].b==2)
ans[q[i].c]=l;
return;
}
int mid=(l+r)>>1,t1=0,w1=0;
for (int i=t;i<=w;++i)
if (q[i].b==1) {
if (q[i].x<=mid)
add(q[i].c,1),a[++t1]=q[i];
else
b[++w1]=q[i];
}
else {
int tw=sum(q[i].y)-sum(q[i].x-1);
if (tw>=q[i].a)
a[++t1]=q[i];
else {
q[i].a=q[i].a-tw;
b[++w1]=q[i];
}
}
for (int i=1;i<=t1;++i)
if (a[i].b==1)
add(a[i].c,-1);
for (int i=1;i<=t1;++i)
q[t+i-1]=a[i];
for (int i=1;i<=w1;++i)
q[t+t1+i-1]=b[i];
sc(t,t+t1-1,l,mid);
sc(t+t1,w,mid+1,r);
}
int main() {
n=read(),m=read();
for (int i=1;i<=n;++i) {
x=read();
Build(x,i);
}
for (int i=1;i<=m;++i) {
x=read(),y=read(),k=read();
Build1(x,y,k,i);
}
sc(1,cnt,-INF,INF);
for (int i=1;i<=m;++i)
printf("%d\n",ans[i]);
return 0;
}

ZOJ 2112 Dynamic Rankings

#include <algorithm>
#include <bitset>
#include <complex>
#include<cstring>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector> #if __cplusplus >= 201103L
#include <array>
#include <atomic>
#include <chrono>
#include <condition_variable>
#include <forward_list>
#include <future>
#include <initializer_list>
#include <mutex>
#include <random>
#include <ratio>
#include <regex>
#include <scoped_allocator>
#include <system_error>
#include <thread>
#include <tuple>
#include <typeindex>
#include <type_traits>
#include <unordered_map>
#include <unordered_set>
#endif
#define INF 1000000007
#define MAXN 2000010
using namespace std;
struct Node {
int x,y,a,b,c;
}q[MAXN],a[MAXN],b[MAXN];
int t[MAXN],ans[MAXN],n,m,x,y,z,cnt,k;
int aa[MAXN];
char ch;
int ansn;
inline int read() {
char ch;
bool f=false;
int res=0;
while (((ch=getchar())<'0'||ch>'9')&&ch!='-');
if (ch=='-')
f=true;
else
res=ch-'0';
while ((ch=getchar())>='0'&&ch<='9')
res=(res<<3)+(res<<1)+ch-'0';
return f?~res+1:res;
}
inline int lowbit(int x) {
return x&(-x);
}
inline void add(int x,int y) {
while (x<=n) {
t[x]+=y,x+=lowbit(x);
}
}
inline int sum(int x) {
int summ=0;
while (x>0) {
summ+=t[x],x-=lowbit(x);
}
return summ;
}
inline void Build(int x,int i) {
cnt++;
q[cnt].x=x,q[cnt].b=1,q[cnt].c=i;
}
inline void Build1(int x,int y,int k,int i) {
cnt++,ansn++;
q[cnt].x=x,q[cnt].y=y,q[cnt].a=k,q[cnt].b=0,q[cnt].c=ansn;
}
inline void Build2(int x,int y,int i) {
cnt++;
q[cnt].x=aa[x],q[cnt].b=-1,q[cnt].c=x;
}
inline void Build3(int x,int y,int i) {
cnt++;
q[cnt].x=aa[x],q[cnt].b=1,q[cnt].c=x;
}
void sc(int t,int w,int l,int r) {
if (t>w)
return;
if (l==r) {
for (int i=t;i<=w;++i)
if (q[i].b==0)
ans[q[i].c]=l;
return;
}
int mid=(l+r)>>1,t1=0,w1=0;
for (int i=t;i<=w;++i)
if (q[i].b) {
if (q[i].x<=mid)
/*add(q[i].c,1),*/add(q[i].c,q[i].b),a[++t1]=q[i];
else
b[++w1]=q[i];
}
else {
int tw=sum(q[i].y)-sum(q[i].x-1);
if (tw>=q[i].a)
a[++t1]=q[i];
else {
q[i].a=q[i].a-tw;
b[++w1]=q[i];
}
}
for (int i=1;i<=t1;++i)
if (a[i].b)
add(a[i].c,-a[i].b);
for (int i=1;i<=t1;++i)
q[t+i-1]=a[i];
/*for (int i=1;i<=t1;++i)
printf("%d %d %d %d %d ",a[i].x,a[i].y,a[i].a,a[i].b,a[i].c);
printf("\n");*/
for (int i=1;i<=w1;++i)
q[t+t1+i-1]=b[i];
sc(t,t+t1-1,l,mid);
sc(t+t1,w,mid+1,r);
}
int main() {
int T=read();
while (T--){
memset(q,0,sizeof q);
memset(a,0,sizeof a);
memset(b,0,sizeof b);
memset(ans,0,sizeof ans);
n=read(),m=read(),cnt=0,ansn=0;
for (int i=1;i<=n;++i) {
aa[i]=read();
Build(aa[i],i);
}
for (int i=1;i<=m;++i) {
/*scanf("%c",&ch);*/cin>>ch;x=read(),y=read();
if (ch=='Q'){
k=read();
Build1(x,y,k,i);
}
else {
Build2(x,y,i);
aa[x]=y;
Build3(x,y,i);
}
}
//for (int i=1;i<=cnt;++i)
// printf("%d %d %d %d %d\n",q[i].x,q[i].y,q[i].a,q[i].b,q[i].c);
sc(1,cnt,-INF,INF);
for (int i=1;i<=ansn;++i)
printf("%d\n",ans[i]);
}
return 0;
}

  

整体二分(SP3946 K-th Number ZOJ 2112 Dynamic Rankings)的更多相关文章

  1. 整体二分&amp&semi;cdq分治 ZOJ 2112 Dynamic Rankings

    题目:单点更新查询区间第k大 按照主席树的思想,要主席树套树状数组.即按照每个节点建立主席树,然后利用树状数组的方法来更新维护前缀和.然而,这样的做法在实际中并不能AC,原因即卡空间. 因此我们采用一 ...

  2. 主席树&lbrack;可持久化线段树&rsqb;&lpar;hdu 2665 Kth number、SP 10628 Count on a tree、ZOJ 2112 Dynamic Rankings、codeforces 813E Army Creation、codeforces960F&colon;Pathwalks &rpar;

    在今天三黑(恶意评分刷上去的那种)两紫的智推中,突然出现了P3834 [模板]可持久化线段树 1(主席树)就突然有了不详的预感2333 果然...然后我gg了!被大佬虐了! hdu 2665 Kth ...

  3. ZOJ 2112 Dynamic Rankings(动态区间第 k 大&plus;块状链表)

    题目大意 给定一个数列,编号从 1 到 n,现在有 m 个操作,操作分两类: 1. 修改数列中某个位置的数的值为 val 2. 询问 [L, R] 这个区间中第 k 大的是多少 n<=50,00 ...

  4. ZOJ 2112 Dynamic Rankings(带修改的区间第K大,分块&plus;二分搜索&plus;二分答案)

    Dynamic Rankings Time Limit: 10 Seconds      Memory Limit: 32768 KB The Company Dynamic Rankings has ...

  5. zoj 2112 Dynamic Rankings 动态第k大 线段树套Treap

    Dynamic Rankings Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.zju.edu.cn/onlinejudge/show ...

  6. ZOJ 2112 Dynamic Rankings (动态第 K 大)(树状数组套主席树)

    Dynamic Rankings Time Limit: 10 Seconds      Memory Limit: 32768 KB The Company Dynamic Rankings has ...

  7. ZOJ -2112 Dynamic Rankings 主席树 待修改的区间第K大

    Dynamic Rankings 带修改的区间第K大其实就是先和静态区间第K大的操作一样.先建立一颗主席树, 然后再在树状数组的每一个节点开线段树(其实也是主席树,共用节点), 每次修改的时候都按照树 ...

  8. zoj 2112 Dynamic Rankings&lpar;主席树&amp&semi;amp&semi;动态第k大&rpar;

    Dynamic Rankings Time Limit: 10 Seconds      Memory Limit: 32768 KB The Company Dynamic Rankings has ...

  9. ZOJ 2112 Dynamic Rankings (动态第k大,树状数组套主席树)

    Dynamic Rankings Time Limit: 10 Seconds      Memory Limit: 32768 KB The Company Dynamic Rankings has ...

随机推荐

  1. 本周PSP流程进度

    一计划 (1)估计这个任务需要多少时间:8天 二开发 (1)需求分析:作为一名观众,我希望了解每一场的比赛成绩,以便加深对自己喜爱球队的了解,以及赛况. (2)生成设计文档: (3)设计复审(和同学交 ...

  2. 解决h5的video标签,android、ipad客户端播放正常,iphone客户端无法播放

    在做html5时插入一个视频播放标签video后,测试时android.ipad客户端播放正常,唯独iphone自带浏览器无法播放. 解决办法: 判断用户所使用客户端访问h5页面时是iphone时,点 ...

  3. Ubuntu编译安装PHP7

    参数配置 ./configure --prefix=/usr/local/php7 \ --with-config-file-path=/usr/local/php7/etc \ --with-apx ...

  4. WPF 自定义RadioButton样式

    一.RadioButton基本样式 RadioButton基本样式包含两种状态,这里也是使用两张图片来代替两种状态,当然你也可以通过IconFont或Path来替换这两种状态. 效果如下: 样式代码如 ...

  5. 嵌入式linux——汇编、C语言基础(一)

    一.汇编语言基础 (断断续续的记录自己的笔记...2018-10-11) 1. mov指令 基本用法: mov r0, #0 mov指令是赋值指令,用法如上,把立即数0放入到寄存器r0中. 2. bl ...

  6. ajax 跨域----好用的解决方案

    一.前言 跨域这个词就一直以很高的频率在身边重复出现,一直到现在,已经调试过N个跨域相关的问题了! 但是感觉还是差了点什么,于是现在重新梳理了一下.个人见识有限,如有差错,请多多见谅 二.前言 关于跨 ...

  7. style-loader、css-loader、mini-css-extract-plugin 区别

    项目 区别 css-loader 处理 css 文件 style-loader 把 js 中 import 导入的样式文件代码,打包到 js 文件中,运行 js 文件时,将样式自动插入到<sty ...

  8. table中强制不换行

    总是一些文章说要强制换行,很少提到说如何不换行. 一般都会使用word-break: keep-all;使得强制不换行. HTML <!DOCTYPE html PUBLIC "-// ...

  9. vs2012 连接oracle11g 及数据的insert及select 的总结

    下载链接Oracle 11g所需的驱动ODTwithODAC1120320_32bit,下载链接为http://www.oracle.com/technetwork/topics/dotnet/uti ...

  10. POJ 2513 Colored Sticks(Tire&plus;欧拉回(通)路判断)

    题目链接:http://poj.org/problem?id=2513 题目大意:你有好多根棍子,这些棍子的两端分都别涂了一种颜色.请问你手中的这些棍子能否互相拼接,从而形成一条直线呢? 两根棍子只有 ...