Codeforces Round #227 (Div. 2) E. George and Cards 线段树+set
题目链接:
题目
E. George and Cards
time limit per test:2 seconds
memory limit per test:256 megabytes
问题描述
George is a cat, so he loves playing very much.
Vitaly put n cards in a row in front of George. Each card has one integer written on it. All cards had distinct numbers written on them. Let's number the cards from the left to the right with integers from 1 to n. Then the i-th card from the left contains number pi (1 ≤ pi ≤ n).
Vitaly wants the row to have exactly k cards left. He also wants the i-th card from left to have number bi written on it. Vitaly gave a task to George, to get the required sequence of cards using the remove operation n - k times.
In one remove operation George can choose w (1 ≤ w; w is not greater than the current number of cards in the row) contiguous cards (contiguous subsegment of cards). Let's denote the numbers written on these card as x1, x2, ..., xw (from the left to the right). After that, George can remove the card xi, such that xi ≤ xj for each j (1 ≤ j ≤ w). After the described operation George gets w pieces of sausage.
George wondered: what maximum number of pieces of sausage will he get in total if he reaches his goal and acts optimally well? Help George, find an answer to his question!
输入
The first line contains integers n and k (1 ≤ k ≤ n ≤ 106) — the initial and the final number of cards.
The second line contains n distinct space-separated integers p1, p2, ..., pn (1 ≤ pi ≤ n) — the initial row of cards.
The third line contains k space-separated integers b1, b2, ..., bk — the row of cards that you need to get. It is guaranteed that it's possible to obtain the given row by using the remove operation for n - k times.
输出
Print a single integer — the maximum number of pieces of sausage that George can get if he acts optimally well.
样例
input
3 2
2 1 3
1 3
output
1
input
10 5
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10
output
30
题意
给你一个长度为n的原始序列和一个长度为k子序列,要你把不属于这个子序列的数都删了,你可以选择的操作是每次选连续的w个数,然后删除最小的那个,并且你能够获得w的贡献值,问你如何操作n-k次使贡献值的和最大。
题解
只要我们按序列的值递增来做,并且每次贪心取最大的区间,就能得到最优,一开始我用线段树维护sum和min,在每次操作时用二分+区间min找到左右界,用sum统计区间内还存在的数的和。复杂度O(nlogn+n(logn)^2)第八组数据就t了。(orz)
正解是一开始就用一个set只维护那些比当前数小的并且最后一定会保留下来的数(不会保留下来的,比当前数小的数都已经删除了,所以根本不要放到set里面,这样子做的话每次找x的前驱后继就可以做完了,再加一个线段树或树状数组维护一下区间和就可以了,时间复杂度只有O(nlogn)。
代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<set>
#define X first
#define Y second
#define M l+(r-l)/2
#define lson (o<<1)
#define rson ((o<<1)|1)
using namespace std;
const int maxn = 1e6+10;
const int INF = 0x3f3f3f3f;
typedef __int64 LL;
int minv[maxn << 2];
LL sumv[maxn << 2];
int used[maxn],id[maxn];
int n, k;
set<int> st;
int _p, _v;
void update(int o, int l, int r) {
if (l == r) {
sumv[o] = _v;
}
else {
if (_p <= M) update(lson, l, M);
else update(rson, M + 1, r);
minv[o] = min(minv[lson], minv[rson]);
sumv[o] = sumv[lson] + sumv[rson];
}
}
int ql, qr;
LL _sum;
void query(int o, int l, int r) {
if (ql <= l&&r <= qr) {
_sum += sumv[o];
}
else {
if (ql <= M) query(lson, l, M);
if (qr > M) query(rson, M + 1, r);
}
}
int main() {
memset(used, 0, sizeof(used));
scanf("%d%d", &n, &k);
for (int i = 1; i <= n; i++) {
int x; scanf("%d", &x);
id[x] = i;
_p = i; _v = 1;
update(1, 1, n);
}
for (int i = 1; i <= k; i++) {
int x; scanf("%d",&x);
used[x] = 1;
}
LL ans = 0;
st.insert(0);
st.insert(n + 1);
for (int i = 1; i <= n; i++) {
if (!used[i]) {
set<int>::iterator it = st.upper_bound(id[i]);
qr = *it - 1; ql = *(--it) + 1;
_sum = 0;
query(1, 1, n);
ans += _sum;
_p = id[i], _v = 0;
update(1, 1, n);
}
else {
st.insert(id[i]);
}
}
printf("%I64d\n", ans);
return 0;
}
乱七八糟:
这道题和之前做过的用线段树来维护一个元素的名次的动态查询点这里有异曲同工之妙,都利用了数本身的有序性来排除其他干扰的元素。 这道题也体现了离线处理的巧妙,比如说排个序啥的是吧。
Codeforces Round #227 (Div. 2) E. George and Cards 线段树+set的更多相关文章
- Codeforces Round #227 (Div. 2) E. George and Cards set内二分+树状数组
E. George and Cards George is a cat, so he loves playing very much. Vitaly put n cards in a row in ...
- Codeforces Round #292 (Div. 1) C. Drazil and Park 线段树
C. Drazil and Park 题目连接: http://codeforces.com/contest/516/problem/C Description Drazil is a monkey. ...
- Codeforces Round #254 (Div. 1) C. DZY Loves Colors 线段树
题目链接: http://codeforces.com/problemset/problem/444/C J. DZY Loves Colors time limit per test:2 secon ...
- Codeforces Round #337 (Div. 2) D. Vika and Segments 线段树扫描线
D. Vika and Segments 题目连接: http://www.codeforces.com/contest/610/problem/D Description Vika has an i ...
- Codeforces Round #337 (Div. 2) D. Vika and Segments (线段树+扫描线+离散化)
题目链接:http://codeforces.com/contest/610/problem/D 就是给你宽度为1的n个线段,然你求总共有多少单位的长度. 相当于用线段树求面积并,只不过宽为1,注意y ...
- Codeforces Round #149 (Div. 2) E. XOR on Segment (线段树成段更新+二进制)
题目链接:http://codeforces.com/problemset/problem/242/E 给你n个数,m个操作,操作1是查询l到r之间的和,操作2是将l到r之间的每个数xor与x. 这题 ...
- Codeforces Round #321 (Div. 2) E. Kefa and Watch 线段树hash
E. Kefa and Watch Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/580/prob ...
- Codeforces Round #271 (Div. 2) E题 Pillars(线段树维护DP)
题目地址:http://codeforces.com/contest/474/problem/E 第一次遇到这样的用线段树来维护DP的题目.ASC中也遇到过,当时也非常自然的想到了线段树维护DP,可是 ...
- Codeforces Round #207 (Div. 1) A. Knight Tournament (线段树离线)
题目:http://codeforces.com/problemset/problem/356/A 题意:首先给你n,m,代表有n个人还有m次描述,下面m行,每行l,r,x,代表l到r这个区间都被x所 ...
随机推荐
- Mapper映射器
在两个独立的对象之间建立通信的对象 需要在两个必须相互隔离的子系统间建立通信. 可能是因为无法修改已有的子系统,或者不愿意在两者之间建立依赖关系.甚至不愿意这两个子系统与另一个部件间建立依赖关系. 运 ...
- ubuntu 12.04 安装 codeblock 12.11
原文地址:http://qtlinux.blog.51cto.com/3052744/1136779 参考文章:http://blog.csdn.net/dszsy1990/article/det ...
- JavaScript写选项卡
方法一: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...
- 华丽的HTML5/jQuery动画和应用 前端必备
在网页应用中,我们经常会使用jQuery来实现一些简单的动画效果,比如菜单下拉时的渐变特效,图片滑动时的淡入淡出效果等.现在我们将jQuery和HTML5互相结合,让HTML5/CSS3强大的页面渲染 ...
- mysql中按string字段排序
如: Sql代码SELECT * FROM Student WHERE 1 = 1 ORDER BY -ID DESC或者: Sql代码SELECT * FROM Student WHERE 1 = ...
- Mac支付宝插件风波
1.前言 首先我喜欢看一些创业的书,很多书里都会有马云的身影,马云也算是对我有一定的影响,从而我对淘宝也产生了一定的好感.但是关于这次插件事情,我对阿里产生了一些排斥的心里作用.我并不想吐槽淘宝,也不 ...
- 运行yum报错Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again
今天给Centos通过rpm -Uvh装了个epel的扩展后,执行yum就开始报错: Error: Cannot retrieve metalink for repository: epel. Ple ...
- 【Qt】Qt之自定义界面(添加自定义标题栏)【转】
简述 通过上节内容,我们实现了自定义窗体的移动,但是我们缺少一个标题栏来显示窗体的图标.标题,以及控制窗体最小化.最大化.关闭的按钮. 自定义标题栏后,所有的控件我们都可以定制,比如:在标题栏中添加换 ...
- DOS命令之----Netstat+Task以及相关使用
作为一个初步接触电脑的人,在学习Android的过程中,遇到各种问题,今天遇到了.这样一个错误提示: The connection to adb is down, and a severe error ...
- Delphi 中的全局快捷键+给指定窗体发送按键
[背景] 公司做视频影像采集,平时采集图像的时候都需要打开采集窗口,然后需要开着采集窗口来进行图像采集.同事问我能不能做一个全局快捷键,哪怕我没有操作也可以采集图像.说干就干,一直想做全局快捷键了,网 ...