USACO 2017 FEB Platinum mincross 可持久化线段树
题意
上下有两个位置分别对应的序列A、B,长度为n,两序列为n的一个排列。当Ai == Bj时,上下会连一条边。你可以选择序列A或者序列B进行旋转任意K步,如 3 4 1 5 2 旋转两步为 5 2 3 4 1。求旋转后最小的相交的线段的对数。
很暴力的就做了这一题,当选择A进行旋转时,A序列翻倍,然后建一棵主席树,记录点Bi的度数,为了更新用(其实可以O(1)更新),然后长度为n的区间扫一遍。
B亦同。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream> using namespace std; typedef long long LL;
const int maxn = *;
int n, a[maxn], b[maxn], to[maxn];
struct Tree
{
int sum[maxn*], ls[maxn*], rs[maxn*], cnt;
Tree()
{
cnt = ;
}
void pushup(int rt)
{
sum[rt] = sum[ls[rt]]+sum[rs[rt]];
}
void update(int las_rt, int rt, int l, int r, int p, int d)
{
if (l == r)
{
sum[rt] = sum[las_rt]+d;
return ;
}
int mid = (l+r)>>;
if (p <= mid)
{
ls[rt] = ++cnt, rs[rt] = rs[las_rt];
update(ls[las_rt], ls[rt], l, mid, p, d);
}
else
{
ls[rt] = ls[las_rt], rs[rt] = ++cnt;
update(rs[las_rt], rs[rt], mid+, r, p, d);
}
pushup(rt);
}
int query(int rt_1, int rt_2, int l, int r, int L, int R)
{
if (L <= l && r <= R)
return sum[rt_2]-sum[rt_1];
int mid = (l+r)>>, ret = ;
if (L <= mid)
ret += query(ls[rt_1], ls[rt_2], l, mid, L, R);
if (R > mid)
ret += query(rs[rt_1], rs[rt_2], mid+, r, L, R);
return ret;
}
}T1, T2;
int root1[maxn], root2[maxn]; int main()
{
freopen("mincross.in", "r", stdin);
freopen("mincross.out", "w", stdout);
scanf("%d", &n);
for (int i = ; i <= n; ++i)
scanf("%d", &a[i]), a[n+i] = a[i];
for (int i = ; i <= n; ++i)
scanf("%d", &b[i]), b[n+i] = b[i];
//part 1
for (int i = ; i <= n; ++i)
to[b[i]] = i;
root1[] = ++T1.cnt;
T1.update(, root1[], , n, to[a[]], );
for (int i = ; i <= *n; ++i)
{
root1[i] = ++T1.cnt;
T1.update(root1[i-], root1[i], , n, to[a[i]], );
}
LL now_sum = , ans;
for (int i = ; i <= n; ++i)
if (to[a[i]]+ <= n)
now_sum += T1.query(, root1[i], , n, to[a[i]]+, n);
ans = now_sum;
for (int i = n+; i <= *n; ++i)
{
int temp = ;
if (to[a[i]]- >= )
temp = T1.query(root1[i-n], root1[i-], , n, , to[a[i]]-);
now_sum -= temp, now_sum += (n-temp-);
ans = min(ans, now_sum);
}
//part 2
for (int i = ; i <= n; ++i)
to[a[i]] = i;
root2[] = ++T2.cnt;
T2.update(, root2[], , n, to[b[]], );
for (int i = ; i <= *n; ++i)
{
root2[i] = ++T2.cnt;
T2.update(root2[i-], root2[i], , n, to[b[i]], );
}
now_sum = ;
for (int i = ; i <= n; ++i)
if (to[b[i]]+ <= n)
now_sum += T2.query(, root2[i], , n, to[b[i]]+, n);
for (int i = n+; i <= *n; ++i)
{
int temp = ;
if (to[b[i]]- >= )
temp = T2.query(root2[i-n], root2[i-], , n, , to[b[i]]-);
now_sum -= temp, now_sum += (n-temp-);
ans = min(ans, now_sum);
}
cout <<ans <<endl;
return ;
}
USACO 2017 FEB Platinum mincross 可持久化线段树的更多相关文章
- USACO 2017 FEB Platinum nocross DP
题目大意 上下有两个长度为n.位置对应的序列A.B,其中数的范围均为1~n.若abs(A[i]-B[j]) <= 4,则A[i]与B[j]间可以连一条边.现要求在边与边不相交的情况下的最大的连边 ...
- LOJ.6073.[2017山东一轮集训Day5]距离(可持久化线段树 树链剖分)
题目链接 就是恶心人的,简单写写了...(似乎就是[HNOI2015]开店?) 拆式子,记\(dis_i\)为\(i\)到根节点的路径权值和,\(Ans=\sum dis_{p_i}+\sum dis ...
- PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树
#44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...
- 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 1878 Solved: 846[Submit][Status ...
- 【BZOJ-2653】middle 可持久化线段树 + 二分
2653: middle Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1298 Solved: 734[Submit][Status][Discu ...
- HDU 4866 Shooting(持久化线段树)
view code//第二道持久化线段树,照着别人的代码慢慢敲,还是有点不理解 #include <iostream> #include <cstdio> #include & ...
- 【BZOJ-3653】谈笑风生 DFS序 + 可持久化线段树
3653: 谈笑风生 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 628 Solved: 245[Submit][Status][Discuss] ...
- 【BZOJ3673】&&【BZOJ3674】: 可持久化并查集 by zky 可持久化线段树
没什么好说的. 可持久化线段树,叶子节点存放父亲信息,注意可以规定编号小的为父亲. Q:不是很清楚空间开多大,每次询问父亲操作后修改的节点个数是不确定的.. #include<bits/stdc ...
- 【BZOJ3207】花神的嘲讽计划I 可持久化线段树/莫队
看到题目就可以想到hash 然后很自然的联想到可持久化权值线段树 WA:base取了偶数 这道题还可以用莫队做,比线段树快一些 可持久化线段树: #include<bits/stdc++.h&g ...
随机推荐
- 项目开发 -- ZFS容量分配
存储池 allocated 池中已实际分配的存储空间量.该属性也可通过其简短列名alloc来引用. capacity 已用的池空间百分比.此属性也可通过其简短列名cap来引用. dedupratio ...
- Machine Learning系列--深入理解拉格朗日乘子法(Lagrange Multiplier) 和KKT条件
在求取有约束条件的优化问题时,拉格朗日乘子法(Lagrange Multiplier) 和KKT条件是非常重要的两个求取方法,对于等式约束的优化问题,可以应用拉格朗日乘子法去求取最优值:如果含有不等式 ...
- 转:mysql日志(Windows下开启Mysql慢查询、通用日志)
一.Windows下开启Mysql慢查询详解 //show variables like '%quer%';查询是否开启了慢查询!! 第一步:修改my.ini(mysql配置文件) 在my.ini中 ...
- 转:google测试分享-问题和挑战
原文: http://blog.sina.com.cn/s/blog_6cf812be0102vxer.html 前言:这个系列分享的内容大部分都是出自于<google是如何测试的>的书, ...
- reverse和reverse_copy函数的应用
reverse函数的作用是:反转一个容器内元素的顺序.函数参数:reverse(first,last);//first为容器的首迭代器,last为容器的末迭代器.它没有任何返回值. 这个函数比较简单, ...
- HTML 禁止显示input默认提示信息
看问题 html代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...
- scala学习笔记4--scala的函数一
默认值: def sayMyName(name : String = "Jack"){ println(name) } 可变参数: def sumMoreParameters(el ...
- JavaScript 兼容性总结
请实现鼠标点击任意标签,alert该标签的名称(注意兼容性) function elementName(evt){ evt = evt|| window.event; var selected = ...
- 配置OpenCV+VS2013环境
配置OpenCV+VS2013环境 准备工作 win7系统 下载opencv的windows编译版 安装vs2013 express 设定环境变量 按windows窗键输入path,选择第二个结果编辑 ...
- cocos2d-x 开发中使用的一些工具
这些工具平常也用到,不过没有像这样整理出来,这是我在网上看到的.就记录一下. 位图字体工具Bitmap Font Tools BMFont (Windows)FonteditorGlyph Desig ...