专题突破二之优先队列、st表——,Running Median,Sequence,Buy Low Sell High,数据备份,超级钢琴,ZQC的手办

文章目录

  • Running Median
  • Sequence
  • Buy Low Sell High
  • [APIO/CTSC 2007] 数据备份
  • [NOI2010] 超级钢琴
  • 「LibreOJ β Round」ZQC 的手办

Running Median

source

对顶栈

用大根堆和小根堆一起维护

  • 若元素小于等于大根堆栈顶,放入大根堆
  • 否则放入小根堆

大根堆维护的就是前一半较小的树,小根堆维护的就是后一半较大的树

最后调整两个堆的大小(大根堆比小根堆多一)

答案就是大根堆的栈顶

#include <cstdio>
#include <queue>
using namespace std;
#define maxn 10000
priority_queue < int > MS;
priority_queue < int, vector < int >, greater < int > > IS;
int x[maxn];int main() {int T, Case, n;scanf( "%d", &T );while( T -- ) {while( ! MS.empty() ) MS.pop();while( ! IS.empty() ) IS.pop();scanf( "%d %d", &Case, &n );for( int i = 1;i <= n;i ++ )scanf( "%d", &x[i] );int cnt = 0;printf( "%d %d\n", Case, ( n + 1 ) >> 1 );for( int i = 1;i <= n;i ++ ) {if( MS.empty() || x[i] < MS.top() ) MS.push( x[i] );else IS.push( x[i] );if( i & 1 ) {while( IS.size() < ( i >> 1 ) )IS.push( MS.top() ), MS.pop();while( MS.size() < ( ( i + 1 ) >> 1 ) )MS.push( IS.top() ), IS.pop();cnt ++, printf( "%d ", MS.top() );if( cnt == 10 ) printf( "\n"), cnt = 0;}}printf( "\n" );}return 0;
} 

Sequence

source

先把每行的mmm个元素排序

一层一层的往下叠加,仅保留前mmm小即可

#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define maxn 2005
priority_queue < int > q;
int T, n, m;
int now[maxn], nxt[maxn];int main() {scanf( "%d", &T );while( T -- ) {scanf( "%d %d", &n, &m );for( int i = 1;i <= m;i ++ )scanf( "%d", &now[i] );sort( now + 1, now + m + 1 );for( int k = 1;k < n;k ++ ) {for( int i = 1;i <= m;i ++ )scanf( "%d", &nxt[i] );sort( nxt + 1, nxt + m + 1 );for( int i = 1;i <= m;i ++ )for( int j = 1;j <= m;j ++ ) {int val = now[i] + nxt[j];if( q.size() == m && ! q.empty() && val >= q.top() ) break;else {q.push( val );while( q.size() > m ) q.pop();}}for( int i = 1;i <= m;i ++ )now[m - i + 1] = q.top(), q.pop();}for( int i = 1;i <= m;i ++ )printf( "%d ", now[i] );printf( "\n" );}return 0;
}

Buy Low Sell High

source

反悔贪心

如果第iii天的收益更好,那么弹出栈顶,选择第iii

e.g.

k→j→ik\rightarrow j\rightarrow ikji,最优选择为k→ik\rightarrow iki

在当前最优解的jjj时,选择k→jk\rightarrow jkj先记录临时答案,然后把jjj的股票价放进栈

iii的时候进行pi−pjp_i-p_jpipj,刚好抵消 pj−pk+pi−pj=pi−pkp_j-p_k+p_i-p_j=p_i-p_kpjpk+pipj=pipk

#include <cstdio>
#include <queue>
using namespace std;
#define int long long
#define maxn 300005
priority_queue < int, vector < int >, greater < int > > q;
int n, ans;
int p[maxn];signed main() {scanf( "%lld", &n );for( int i = 1;i <= n;i ++ )scanf( "%lld", &p[i] );for( int i = 1;i <= n;i ++ ) {if( ! q.empty() && q.top() < p[i] )ans += p[i] - q.top(), q.pop(), q.push( p[i] );q.push( p[i] );}printf( "%lld\n", ans );return 0;
}

[APIO/CTSC 2007] 数据备份

source

反悔贪心

选了iii就不能选i−1,i+1i-1,i+1i1,i+1

弥补的代价为di−1+di+1−did_{i-1}+d_{i+1}-d_idi1+di+1di

双向链表维护

#include <queue>
#include <cstdio>
#include <iostream>
using namespace std;
#define maxn 100005
#define int long long
struct node {int id, l, r, val;node(){}node( int ID, int L, int R, int Val ) {id = ID, l = L, r = R, val = Val;}
}it[maxn];
struct Node {int id, val;Node(){}Node( int ID, int Val ) {id = ID, val = Val;}bool operator < ( Node t ) const {return val > t.val;}
};
priority_queue < Node > q;
int n, k, ans;
bool vis[maxn];void Delete( int x ) {it[x].l = it[it[x].l].l;it[x].r = it[it[x].r].r;it[it[x].l].r = x;it[it[x].r].l = x;
}signed main() {int last;scanf( "%lld %lld %lld", &n, &k, &last );for( int i = 1, d;i < n;i ++ ) {scanf( "%lld", &d );it[i] = node( i, i - 1, i + 1, d - last );q.push( Node( i, d - last ) );last = d;}it[0].val = it[n].val = 1e15;for( int i = 1;i <= k;i ++ ) {while( vis[q.top().id] ) q.pop(); int val = q.top().val, x = q.top().id;q.pop(), ans += val;vis[it[x].l] = vis[it[x].r] = 1;it[x].val = it[it[x].l].val + it[it[x].r].val - it[x].val;q.push( Node( x, it[x].val ) );Delete( x );}printf( "%lld\n", ans );return 0;
} 

[NOI2010] 超级钢琴

source

对于每个iii,将其符合要求的区间扔进队列,确定最大值的位置pospospos

可以使用ststst表预处理最大值位置

然后大根堆,开始选择

一段区间最大值知晓了,次大值一定是在最大值的左边或者右边(刨除最大值位置)

所以直接将区间划成两部分扔进大根堆,要保证区间存在

#include <iostream>
#include <cstdio>
#include <queue>
#include <cmath>
using namespace std;
#define maxn 500005
int n, k, L, R;
int sum[maxn];
int st[maxn][20];void init() {for( int i = 1;i <= n;i ++ ) st[i][0] = i;for( int j = 1;j < 20;j ++ )for( int i = 1;i + ( 1 << j ) - 1 <= n;i ++ )if( sum[st[i + ( 1 << j - 1 )][j - 1]] > sum[st[i][j - 1]] )st[i][j] = st[i + ( 1 << j - 1 )][j - 1];elsest[i][j] = st[i][j - 1];
}int query( int l, int r ) {int i = log2( r - l + 1 );if( sum[st[l][i]] >= sum[st[r - ( 1 << i ) + 1][i]] )return st[l][i];elsereturn st[r - ( 1 << i ) + 1][i];
}struct node {int s, l, r, t;node( int S, int L, int R ) { s = S, l = L, r = R, t = query( l, r ); }bool operator < ( node MS ) const { return sum[t] - sum[s - 1] < sum[MS.t] - sum[MS.s - 1]; }
};
priority_queue < node > q;int main() {scanf( "%d %d %d %d", &n, &k, &L, &R );for( int i = 1;i <= n;i ++ ) {scanf( "%d", &sum[i] );sum[i] += sum[i - 1];}init();for( int i = 1;i <= n - L + 1;i ++ )q.push( node( i, i + L - 1, min( i + R - 1, n ) ) );long long ans = 0;while( k -- ) {node now = q.top(); q.pop();ans += sum[now.t] - sum[now.s - 1];if( now.t != now.l ) q.push( node( now.s, now.l, now.t - 1 ) );if( now.t != now.r ) q.push( node( now.s, now.t + 1, now.r ) );}printf( "%lld\n", ans );return 0;
}

「LibreOJ β Round」ZQC 的手办

source

超级钢琴的父版

操作111直接线段树标记维护

操作222因为保证xxx总和不会很大,那么类似超级钢琴一样将区间切成两部分那种

用线段树查区间最小值以及最小值位置

#include <queue>
#include <cstdio>
#include <iostream>
using namespace std;
#define maxn 500005
#define inf 0x7f7f7f7f
#define lson num << 1
#define rson num << 1 | 1
#define Pair pair < int, int >
void read(int &x) {x = 0;char s = getchar();while (s < '0' || s > '9')s = getchar();while ('0' <= s && s <= '9') {x = (x << 1) + (x << 3) + (s ^ 48);s = getchar();}
}
struct node {int l, r;Pair ret;node() {}node(int L, int R, Pair p) {l = L, r = R, ret = p;}bool operator < (const node &t) const {return ret.first > t.ret.first;}
};
priority_queue < node > q;
int a[maxn], ans[maxn];
int t[maxn << 2], pos[maxn << 2], tag[maxn << 2];void pushup(int num) {if (t[lson] <= t[rson])t[num] = t[lson], pos[num] = pos[lson];elset[num] = t[rson], pos[num] = pos[rson];
}void build(int num, int l, int r) {if (l == r) {t[num] = a[l];pos[num] = l;return;}int mid = (l + r) >> 1;build(lson, l, mid);build(rson, mid + 1, r);pushup(num);
}void pushdown(int num) {t[lson] = max(t[lson], tag[num]);t[rson] = max(t[rson], tag[num]);tag[lson] = max(tag[lson], tag[num]);tag[rson] = max(tag[rson], tag[num]);tag[num] = 0;
}void modify(int num, int l, int r, int L, int R, int k) {if (t[num] >= k)return;if (R < l || r < L)return;if (L <= l && r <= R) {t[num] = max(t[num], k);tag[num] = max(tag[num], k);return;}pushdown(num);int mid = (l + r) >> 1;modify(lson, l, mid, L, R, k);modify(rson, mid + 1, r, L, R, k);pushup(num);
}Pair query(int num, int l, int r, int L, int R) {if (r < L || R < l)return make_pair(inf, inf);if (L <= l && r <= R)return make_pair(t[num], pos[num]);pushdown(num);int mid = (l + r) >> 1;Pair ans1 = query(lson, l, mid, L, R);Pair ans2 = query(rson, mid + 1, r, L, R);if (ans1.first <= ans2.first)return ans1;elsereturn ans2;
}int main() {int n, m;read(n);for (int i = 1; i <= n; i ++)read(a[i]);build(1, 1, n);read(m);for (int i = 1, opt, a, b, k, x; i <= m; i ++) {read(opt), read(a), read(b), read(k);if (opt & 1)modify(1, 1, n, a, b, k);else {read(x);while (! q.empty())q.pop();int cnt = 0;q.push(node(a, b, query(1, 1, n, a, b)));while (! q.empty() && cnt < x) {node now = q.top();q.pop();int val = now.ret.first, pos = now.ret.second;if (val >= k)break;elseans[++ cnt] = val;if (pos != now.l)q.push(node(now.l, pos - 1, query(1, 1, n, now.l, pos - 1)));if (pos != now.r)q.push(node(pos + 1, now.r, query(1, 1, n, pos + 1, now.r)));}if (cnt < x)printf("-1\n");else {for (int i = 1; i <= x; i ++)printf("%d ", ans[i]);printf("\n");}}}return 0;
}

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

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

相关文章

G - Eating Plan

G - Eating Plan 题意&#xff1a; 一个1到n组成的排列&#xff0c;每个数的价值为其阶乘&#xff0c;有m个询问ki&#xff0c;要求你在排列中选取连续的一块&#xff0c;使得价值和mod 998857459 后&#xff0c;大于ki&#xff0c;问最短区间长度&#xff0c;如果不存在输出…

P4770:你的名字(SAM、线段树合并)

文章目录前言解析前言 1000A快乐&#xff01;&#xff01;&#xff01;awa 没有想象中的那么恶心。 解析 先考虑每次都询问 [1,n][1,n][1,n] 如何做。 正难则反&#xff0c;用T所有本质不同串数量减去是S串子串又是T的子串的数量 前者很好求&#xff0c;关键是后者 首先可以…

DotNetty 实现 Modbus TCP 系列 (一) 报文类

Modbus TCP/IP 报文报文最大长度为 260 byte (ADU 7 byte MBAP Header 253 byte PDU)Length Unit Identifier 长度 PDU 长度MBAP HeaderPDUPDU 由两部分构成&#xff1a;Function Code(功能码) 和 Data 组成Function Code部分功能码&#xff1a;报文类ModbusHeaderModbusHe…

AT2377-[AGC014E]Blue and Red Tree【启发式合并】

正题 题目链接:https://www.luogu.com.cn/problem/AT2377 题目大意 有两棵树T1,T2T_1,T_2T1​,T2​。T1T_1T1​树上的边开始时都是蓝色的&#xff0c;我们每次选择一条蓝色边路径(x,y)(x,y)(x,y)&#xff0c;然后删掉路径上一条边&#xff0c;连接一条xxx到yyy的红色边。 要…

B - A Funny Bipartite Graph

B - A Funny Bipartite Graph 题意&#xff1a; 一个二分图&#xff0c;左右各有n个点&#xff0c;左边第i个点有一个属性mi&#xff0c;它在一个图中的价值为midi,其中di为它在图中的度数(特殊的&#xff0c;如果度数为0&#xff0c;则价值为0)&#xff0c;求一个该二分图的…

专题突破三之并查集Ⅰ——Portal,parity,食物链,程序自动分析,Almost Union-Find,洞穴勘测

文章目录Portalparity[NOI2001] 食物链程序自动分析UVA11987 Almost Union-Find[SDOI2008] 洞穴勘测Portal source 百度翻译简直就是个鬼…(((m -__-)m 离线 将边和询问按权值排序&#xff0c;指针&#xff0c;将所有权值不超过当前询问iii的边全加进去 答案路径自然是不连…

C# 未来新特性:静态委托和函数指针

C# 每发布一次新版本&#xff0c;都会增加一些底层相关的新特性&#xff0c; 这些特性对大多数商业程序来说并没什么实际用处&#xff0c;主要用于那些对性能有很高要求的代码&#xff0c;如图形处理、机器学习以及数学工具包&#xff0c;等等。接下来的两个提案&#xff0c;主…

CF700E Cool Slogans(SAM,dp)

解析 好题。 首先&#xff0c;我们每次都令 sis_isi​ 是 si1s_{i1}si1​ 的后缀&#xff0c;肯定是不劣的 问题就可以转化到 fail 树上了 首先肯定要线段树合并处理出endpos集合 朴素想法&#xff1a;设父亲 fafafa 的结束位置为 posfapos_{fa}posfa​&#xff0c;若 [posfa−…

pjudge#21651-[PR #4]猜猜看【交互】

正题 题目链接:http://pjudge.ac/problem/21651 题目大意 有一个1∼n1\sim n1∼n的排列&#xff0c;每次你可以询问 iii和jjj的大小关系i,j,ki,j,ki,j,k的中位数 现在要求在222次111操作和2n2n2n次222操作内得到这个排列。 50≤n≤510550\leq n\leq 5\times 10^550≤n≤5105…

JavaWeb --第一章Web基本概念

JavaWeb --第一章Web基本概念 文章目录基本概念前言web开发&#xff1a;web应用程序静态web动态webweb服务器技术讲解web服务器基本概念 前言 web开发&#xff1a; web&#xff0c;网页的意思静态web a. html&#xff0c;css b. 提供给所有人看的数据始终不会发生改变动态we…

DotNetty 实现 Modbus TCP 系列 (二) ModbusFunction 类图及继承举例

DotNetty 实现 Modbus TCP 系列 (一) 报文类ModbusFunction 类图如下&#xff1a;如前文所述&#xff0c;所有请求/相应的 PDU 均继承自 ModbusFunction&#xff0c;其子类传入对应的 Function Code 并实现三个方法&#xff1a;CalculateLength&#xff1a;Data 部分的长度(该方…

AT2366-[AGC012F]Prefix Median【dp】

正题 题目链接:https://www.luogu.com.cn/problem/AT2366 题目大意 有一个长度为2n−12n-12n−1的序列aaa&#xff0c;你可以将其重新排列&#xff0c;定义bib_ibi​为a1∼2i−1a_{1\sim 2i-1}a1∼2i−1​的中位数。 询问有多少种不同的可能的bbb序列。 1≤n≤501\leq n\leq…

专题突破三之并查集Ⅱ——星球大战,In Touch,方格染色,Junk-Mail Filter,关押罪犯,Silver Woods,Must Be Rectangular!

文章目录[JSOI2008]星球大战In Touch方格染色Junk-Mail Filter[NOIP2010 提高组] 关押罪犯Silver WoodsMust Be Rectangular![JSOI2008]星球大战 source 非常套路的&#xff0c;正着打击星球&#xff0c;逆着就是添加星球以及关系&#xff0c;并查集维护此时连通块个数 就是…

模板:整体二分

所谓整体二分&#xff0c;就是对整体进行二分 &#xff08;逃&#xff09; 前言 又是一个狂艹树套树的小清新分治算法 但是树套树不需要动脑啊 整体二分有一些比较重要的条件&#xff1a; 修改对判定答案的贡献互相独立&#xff0c;修改之间互不影响效果修改如果对判定答案有…

JavaWeb --第二章 Tomact详情

JavaWeb --第二章 Tomact详情 文章目录Tomcat安装TomcatTomcat启动和配置配置发布一个web网站Tomcat 安装Tomcat 去官方下载 https://tomcat.apache.org Tomcat启动和配置 文件夹作用&#xff1a; 启动/关闭 Tomcat&#xff1a; 文件夹bin/startup.bat 开启 网址&#x…

P8352-[SDOI/SXOI2022]小N的独立集【dp套dp】

正题 题目链接:https://www.luogu.com.cn/problem/P8352 题目大意 给出一棵树&#xff0c;每个点的权值是[1,k][1,k][1,k]之间的一个数&#xff0c;对于i∈[1,nk]i\in[1,nk]i∈[1,nk]求令这棵树的最大独立集权值为iii的方案数。 1≤n≤1000,1≤k≤51\leq n\leq 1000,1\leq k\…

开源的类似于Apache ab的压力测试命令行工具SuperBenchmarker

SuperBenchmarker 是ㄧ个开源的类似于Apache ab的压力测试命令行工具。可以在 .NET 4.52 或者 .NET Core 2.0 平台上运行。可支持Get、Post、Put、Delete这些调用方式&#xff0c;调用时能指定Concurrent user、Request数、Header template…等。可以从Github、Chocolatey这两种…

CodeForces:643(VK cup)

文章目录前言CF643A Bear and ColorsDescription\text{Description}DescriptionSolution\text{Solution}SolutionDescription\text{Description}DescriptionCF643B Bear and Two PathsDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}…

一二三系列之优先队列、st表——Battle,Heapsort,A Magic Lamp

文章目录BattleHeapsortA Magic LampBattle source 如果怪兽先死&#xff0c;那么英雄血量不足也没关系 反悔贪心 每次都先杀怪兽再说&#xff0c;如果血量不够了&#xff0c;就倒回去从怪兽打出伤害由高到低反悔&#xff0c;选择抵御或者加血&#xff0c;肯定哪个加的更多…

JavaWeb --第三章 HTTP协议详解

JavaWeb --第三章 HTTP协议详解 Http 什么是HTTP HTTP&#xff1a; 超文本传输协议&#xff08;Hypertext Transfer Protocol&#xff0c;HTTP&#xff09;是一个简单的请求-响应协议&#xff0c;它通常运行在TCP之上。 文本&#xff1a;html&#xff0c;字符串&#xff0c…