【LOJ】#2265. 「CTSC2017」最长上升子序列
题解
点了一个新技能叫杨表(事实上集训的时候听过,但是一直不会
这道题就是让我们找到k个不上升子序列,要求长度加和最大
我们用杨表去维护,但是由于杨表的行数可能是n的,复杂度会炸
我们只维护前\(\sqrt{n}\)行
有个结论是把杨表排序方式改过来那么我们会得到杨表的转置,我们发现我们只需要求一些列的和就好了,这个转置后的也只需要维护到\(\sqrt{n}\)行即可
二分找每行的插入位置即可\(O(n\sqrt{n} \log n + k \sqrt{n})\)
代码
#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define space putchar(' ')
#define enter putchar('\n')
#define MAXN 50005
//#define ivorysi
using namespace std;
typedef long long int64;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) out(x / 10);
putchar('0' + x % 10);
}
int N,Q,S;
int b[MAXN],ans[200005],tr[MAXN];
struct qry_node {
int pos,id,k;
friend bool operator < (const qry_node &a,const qry_node &b) {return a.pos < b.pos;}
}qry[200005];
int lowbit(int x) {return x & (-x);}
void Ins(int x,int v) {
while(x <= N) {
tr[x] += v;
x += lowbit(x);
}
}
int Query(int x) {
int res = 0;
while(x > 0) {
res += tr[x];
x -= lowbit(x);
}
return res;
}
struct YoungTable {
int a[245][MAXN];
int findA(int x,int y,int v) {
if(y == 0) return 0;
int L = 0,R = y;
while(L < R) {
int mid = (L + R + 1) >> 1;
if(a[x][mid] >= v) L = mid;
else R = mid - 1;
}
return L;
}
int findB(int x,int y,int v) {
if(y == 0) return 0;
int L = 0,R = y;
while(L < R) {
int mid = (L + R + 1) >> 1;
if(a[x][mid] < v) L = mid;
else R = mid - 1;
}
return L;
}
void Insert(int x,int y,int v,bool on) {
if(x > S) return;
y = min(a[x][0],y);
if(!on) y = findA(x,y,v);
else y = findB(x,y,v);
++y;
if(a[x][y] == 0) {
a[x][y] = v;++a[x][0];
if(on) Ins(y,1);
}
else {
int t = a[x][y];a[x][y] = v;
Insert(x + 1,y,t,on);
}
}
}A,B;
int Calc(int k) {
int res = 0;
if(k <= S) {
for(int i = 1 ; i <= k ; ++i) res += A.a[i][0];
}
else {
for(int i = 1 ; i <= S ; ++i) res += A.a[i][0];
res += Query(k) - Query(S);
}
return res;
}
void Solve() {
read(N);read(Q);
S = sqrt(N);
for(int i = 1 ; i <= N ; ++i) read(b[i]);
for(int i = 1 ; i <= Q ; ++i) {
qry[i].id = i;read(qry[i].pos);read(qry[i].k);
}
sort(qry + 1,qry + Q + 1);
int p = 1;
for(int i = 1 ; i <= N ; ++i) {
A.Insert(1,N + 1,b[i],0);B.Insert(1,N + 1,b[i],1);
while(p <= Q && qry[p].pos == i) {
ans[qry[p].id] = Calc(qry[p].k);
++p;
}
}
for(int i = 1 ; i <= Q ; ++i) {out(ans[i]);enter;}
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
}
【LOJ】#2265. 「CTSC2017」最长上升子序列的更多相关文章
- LOJ2265. 「CTSC2017」最长上升子序列
题意:中文题意很清楚 LOJ2263 分析: 根据Dilworth定理,最小链覆盖=最长反链. 问题转化为求 $k$ 个最小不上升序列能覆盖的最大数的个数. 参考链接: 1. https://blog ...
- 「TJOI2013」最长上升子序列
「TJOI2013」最长上升子序列 传送门 这个 \(\text{DP}\) 应该都会撒: \[dp_i = \max_{j < i,a_j < a_i}\left\{dp_j\right ...
- Loj #3096. 「SNOI2019」数论
Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...
- Loj #3055. 「HNOI2019」JOJO
Loj #3055. 「HNOI2019」JOJO JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 ...
- LOJ #6436. 「PKUSC2018」神仙的游戏(字符串+NTT)
题面 LOJ #6436. 「PKUSC2018」神仙的游戏 题解 参考 yyb 的口中的长郡最强选手 租酥雨大佬的博客 ... 一开始以为 通配符匹配 就是类似于 BZOJ 4259: 残缺的字符串 ...
- Libre 6005 「网络流 24 题」最长递增子序列 / Luogu 2766 最长递增子序列问题(网络流,最大流)
Libre 6005 「网络流 24 题」最长递增子序列 / Luogu 2766 最长递增子序列问题(网络流,最大流) Description 问题描述: 给定正整数序列x1,...,xn . (1 ...
- Loj #2554. 「CTSC2018」青蕈领主
Loj #2554. 「CTSC2018」青蕈领主 题目描述 "也许,我的生命也已经如同风中残烛了吧."小绿如是说. 小绿同学因为微积分这门课,对"连续"这一概 ...
- Loj #2553. 「CTSC2018」暴力写挂
Loj #2553. 「CTSC2018」暴力写挂 题目描述 temporaryDO 是一个很菜的 OIer .在 4 月,他在省队选拔赛的考场上见到了<林克卡特树>一题,其中 \(k = ...
- Loj #2570. 「ZJOI2017」线段树
Loj #2570. 「ZJOI2017」线段树 题目描述 线段树是九条可怜很喜欢的一个数据结构,它拥有着简单的结构.优秀的复杂度与强大的功能,因此可怜曾经花了很长时间研究线段树的一些性质. 最近可怜 ...
随机推荐
- oracle 创建表空间 与创建用户与分配用户权限
创建一个表空间名为ABC create tablespace "ABC" //貌似要大写 datafile 'D:\oracle\TBSPACES\ABC.dbf' / ...
- AtCoder Grand Contest 010
AtCoder Grand Contest 010 A - Addition 翻译 黑板上写了\(n\)个正整数,每次会擦去两个奇偶性相同的数,然后把他们的和写会到黑板上,问最终能否只剩下一个数. 题 ...
- 【转】I²C总线上拉电阻阻值如何选择?
I2C总线为何需要上拉电阻? I2C(Inter-Intergrated Circuit)总线是微电子通信控制领域中常用的一种总线标准,具有接线少,控制方式简单,通信速率高等优点. I2C总线的内部结 ...
- 【bzoj1492】 NOI2007—货币兑换Cash
http://www.lydsy.com/JudgeOnline/problem.php?id=1492 (题目链接) 题意 两种金券,金券按照比例交易:买入时,将投入的资金购买比例为$rate[i] ...
- 【POJ3171】Cleaning Shifts 带权区间最小覆盖
题目大意:给定一个长度为 N 的序列,求带权区间最小覆盖. 题解:设 \(dp[i]\) 表示从左端点到 i 的最小权值是多少,则状态转移为:\(dp[e[i].ed]=min\{dp[j],j\in ...
- 【codevs1297】硬币 完全背包
题目大意:给定 N 种不同种类的硬币,每种硬币的重量范围在一个可变区间内,但是价值恒定,求给定一个重量 W,求有多少种面值不同的组合方式. 题解:如果硬币的重量恒定,那么就是一道裸的完全背包问题.因此 ...
- 【CSS】float属性
float浮动属性1.作用: 将页面元素浮动起来,使其能够向左或者向右排列 2.应用: 实现页面中布局的左右排版 实现图文环绕的版式效果 3.值: 4.原理: 浮动元素将脱离默认的文档流,漂浮在默认文 ...
- node.js浅谈
相信大家对node.js也很不陌生吧,现在我来总结一下常用的吧~ 我们Web全栈工程师最多的就是用Node作为后台了,Node.js虽然可以作为后台语言,但是相对于Java那些老牌后台语言真是一点优势 ...
- Hadoop生态圈-Flume的组件之自定义Sink
Hadoop生态圈-Flume的组件之自定义Sink 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客主要介绍sink相关的API使用两个小案例,想要了解更多关于API的小技 ...
- java注解 @SuppressWarnings注解用法
@SuppressWarnings注解用法 @SuppressWarnings注解主要用在取消一些编译器产生的警告对代码工具左侧行列提示,但这种警告可以通过注释类型声明来取消 @SuppressWar ...