1367: [Baltic2004]sequence

Time Limit: 20 Sec   Memory Limit: 64 MB

Submit: 521  
Solved: 159

[
Submit][
Status]

Description

Input

Output

一个整数R

Sample Input

7
9
4
8
20
14
15
18

Sample Output

13

HINT

所求的Z序列为6,7,8,13,14,15,18.
R=13

左偏树+1

这题裸裸的左偏树,我却各种WA。。。。

结果发现 左偏树合并 a*b==0 会乘爆掉。。。掉节操。。。。。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<functional>
#include<iostream>
#include<cmath>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Lson (x<<1)
#define Rson ((x<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (100000007)
#define MAXN (1300000+10)
long long mul(long long a,long long b){return (a*b)%F;}
long long add(long long a,long long b){return (a+b)%F;}
long long sub(long long a,long long b){return (a-b+(a-b)/F*F+F)%F;}
typedef long long ll;
int father[MAXN];
int getfather(int x)
{
if (father[x]==x) return x;
father[x]=getfather(father[x]);
return father[x];
}
struct node
{
ll v;
int dis,ch[2];
node():v(0),dis(0){ch[0]=ch[1]=0;}
node(ll _v):v(_v),dis(0){ch[0]=ch[1]=0;}
}q[MAXN];
int merge(int a,int b)
{
if (a==0||b==0) return a+b;
if (q[a].v<q[b].v) swap(a,b);
q[a].ch[1]=merge(q[a].ch[1],b);
if (q[q[a].ch[0]].dis<q[q[a].ch[1]].dis) swap(q[a].ch[0],q[a].ch[1]);
if (q[a].ch[1]) q[a].dis=q[q[a].ch[1]].dis+1;else q[a].dis=0;
return a;
}
int root[MAXN],tot=0;
int pop(int a)
{
int p=merge(q[a].ch[0],q[a].ch[1]);
return p;
}
int n,siz[MAXN],l[MAXN],r[MAXN];
ll a[MAXN];
ll abs2(ll a,ll b){return a-b>0?a-b:b-a;}
int main()
{
// freopen("bzoj1367.in","r",stdin);
scanf("%d",&n);
For(i,n) scanf("%lld",&a[i]),a[i]-=(long long)i,father[i]=i,q[i].v=a[i];
For(i,n)
{
siz[++tot]=1;root[tot]=i;l[tot]=r[tot]=i;
while (tot>1&&q[root[tot]].v<=q[root[tot-1]].v)
{
int ru=root[tot-1],rv=root[tot];
Fork(j,l[tot],r[tot])
{
q[j]=node(a[j]);
ru=merge(ru,j);
}
siz[tot-1]+=r[tot]-l[tot]+1;r[tot-1]=r[tot];tot--;
while (siz[tot]>(r[tot]-l[tot]+2)/2) ru=pop(ru),siz[tot]--;
root[tot]=ru;
}
// For(i,tot) cout<<l[i]<<' '<<r[i]<<' '<<q[root[i]].v<<endl; cout<<endl;
}
//For(i,n) cout<<a[i]<<' ';cout<<endl;
//For(i,tot) cout<<siz[i]<<' ';cout<<endl; //For(i,tot) cout<<l[i]<<' '<<r[i]<<' '<<q[root[i]].v<<endl; ll ans=0;
For(i,tot)
{
Fork(j,l[i],r[i]) ans+=abs2(q[root[i]].v,a[j]);
}
printf("%lld\n",ans);
return 0;
}

第二Sol-贪心:

假想有2数列A,B

A的中位数<B的中位数

A的中位数>(B+C)的中位数

则(A+B+C)的中位数≤A的中位数<B的中位数

所以A中位数,B中位数往上的部分去掉,不影响结果

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<functional>
#include<iostream>
#include<cmath>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Lson (x<<1)
#define Rson ((x<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define MAXN (1000000+10)
typedef long long ll;
struct node
{
int v,dis,ch[2];
node():v(0),dis(0){ch[0]=ch[1]=0;}
node(int _v):v(_v),dis(0){ch[0]=ch[1]=0;}
}q[MAXN];
int merge(int a,int b)
{
if (a==0||b==0) return a+b;
if (q[a].v<q[b].v) swap(a,b);
q[a].ch[1]=merge(q[a].ch[1],b);
if (q[q[a].ch[0]].dis<q[q[a].ch[1]].dis) swap(q[a].ch[0],q[a].ch[1]);
q[a].dis=q[q[a].ch[1]].dis+1;
return a;
}
int root[MAXN],tot=0;
int pop(int a)
{
int p=merge(q[a].ch[0],q[a].ch[1]);
return p;
}
int n,siz[MAXN]={0},l[MAXN]={0},r[MAXN]={0};
int a[MAXN]={0};
ll abs2(ll a,ll b){return a-b>0?a-b:b-a;}
int main()
{
freopen("bzoj1367.in","r",stdin);
scanf("%d",&n);
For(i,n)
{
scanf("%d",&a[i]),a[i]-=i;q[i].v=a[i];
}
For(i,n)
{
siz[++tot]=1;root[tot]=i;l[tot]=r[tot]=i;
while (tot>1&&q[root[tot-1]].v>q[root[tot]].v)
{
int ru=root[tot-1],rv=root[tot];
/*
Fork(j,l[tot],r[tot])
{
q[j]=node(a[j]);
ru=merge(ru,j);
}*/
ru=merge(ru,rv);int b=((r[tot-1]-l[tot-1]+1)%2)+((r[tot]-l[tot]+1)%2);
siz[tot-1]+=siz[tot];r[tot-1]=r[tot];tot--;
if (b==2) ru=pop(ru),siz[tot]--;
root[tot]=ru;
// For(i,tot) cout<<l[i]<<' '<<r[i]<<' '<<q[root[i]].v<<endl; cout<<endl;
}
}
// For(i,n) cout<<a[i]<<' ';cout<<endl;
// For(i,tot) cout<<siz[i]<<' ';cout<<endl; // For(i,tot) cout<<l[i]<<' '<<r[i]<<' '<<q[root[i]].v<<endl; ll ans=0;
For(i,tot)
{
Fork(j,l[i],r[i]) ans+=abs2(q[root[i]].v,a[j]);
}
cout<<ans<<endl;
return 0;
}

BZOJ 1367([Baltic2004]sequence-左偏树+中位数贪心)的更多相关文章

  1. BZOJ 1367: [Baltic2004]sequence [可并堆 中位数]

    1367: [Baltic2004]sequence Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 1111  Solved: 439[Submit][ ...

  2. bzoj1367 [Baltic2004]sequence 左偏树+贪心

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=1367 题解 先考虑条件为要求不下降序列(不是递增)的情况. 那么考虑一段数值相同的子段,这一段 ...

  3. 【BZOJ1367】[Baltic2004]sequence 左偏树

    [BZOJ1367][Baltic2004]sequence Description Input Output 一个整数R Sample Input 7 9 4 8 20 14 15 18 Sampl ...

  4. BZOJ1367: [Baltic2004]sequence(左偏树)

    Description Input Output 一个整数R Sample Input 7 9 4 8 20 14 15 18 Sample Output 13 解题思路: 有趣的数学题. 首先确定序 ...

  5. BZOJ 1367 [Baltic2004]sequence 解题报告

    BZOJ 1367 [Baltic2004]sequence Description 给定一个序列\(t_1,t_2,\dots,t_N\),求一个递增序列\(z_1<z_2<\dots& ...

  6. BZOJ 1367 [Baltic2004]sequence (可并堆)

    题面:BZOJ传送门 题目大意:给你一个序列$a$,让你构造一个递增序列$b$,使得$\sum |a_{i}-b_{i}|$最小,$a_{i},b_{i}$均为整数 神仙题.. 我们先考虑b不递减的情 ...

  7. bzoj 1367: [Baltic2004]sequence

    1367: [Baltic2004]sequence Time Limit: 20 Sec  Memory Limit: 64 MB Description Input Output 一个整数R Sa ...

  8. BZOJ 1455 罗马游戏 ——左偏树

    [题目分析] 左偏树的模板题目,大概就是尽量维护树的深度保持平衡,以及尽可能的快速合并的一种堆. 感觉和启发式合并基本相同. 其实并没有快很多. 本人的左偏树代码自带大常数,借鉴请慎重 [代码] #i ...

  9. bzoj 1455: 罗马游戏 左偏树+并查集

    1455: 罗马游戏 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 668  Solved: 247[Submit][Status] Descriptio ...

随机推荐

  1. Mnesia基本用法

    查看表结构 查看mnesia表的结构: mnesia:info(). 查看此表的基本信息: mnesia:table_info(<tableName>, all). Mnesia初使化 m ...

  2. c++,为什么要引入虚拟继承

      虚拟基类是为解决多重继承而出现的.   以下面的一个例子为例: #include <iostream.h> #include <memory.h> class CA { i ...

  3. C#_事件

    C#_事件 概述 今天用来演示事件的例子是模拟实现一个文件下载类,在这个类中我将定义一个DownLoad事件,这个事件用来在文件下载的过程中,向订阅这个事件的用户发出消息,而这个消息将用DownLoa ...

  4. <转载>DIV+CSS position定位方法总结

    如何学习DIV+CSS布局之position属性 如果用position来布局页面,父级元素的position属性必须为relative,而定位于父级内部某个位置的元素,最好用 absolute. 任 ...

  5. timesetevent与timekillevent的用法

    unit Unit1; interface uses  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs ...

  6. GreenDAO数据库版本升级

    GreenDAO是一款非要流行的android平台上的数据库框架,性能优秀,代码简洁. 初始化数据库模型代码的时候需要使用java项目生成代码,依赖的jar包已经上传到我的资源里了,下载地址如下:ht ...

  7. Android JNI 编译正确 但是提示程序有错误无法运行 而且还看不到任何错误提示 的解决方法

    前几篇中一直在通过Android做JNI调用,关于JNI的配置请见:http://blog.csdn.net/watkinsong/article/details/9849973 但是前一段时间就遇到 ...

  8. 显示器 Linux 性能 18 (一个命令行工具传递)

    对于系统和网络管理员来说每天监控和调试Linux系统的性能问题是一项繁重的工作.在IT领域作为一名Linux系统的管理员工作5年后,我逐渐认识到监控和保持系统启动并执行是多么的不easy.基于此原因. ...

  9. CPU 球迷助威清理灰尘图形的全过程

    主机因为使用时间长的电源风扇,风扇轴承石油枯竭,导致拒绝或不转的风扇转速,热量使电源不能得到有效排除,往往会造成电脑死机,有几种方法来解决. 单省钱的办法例如以下: 1.把电源从主机上拆下,例如以下图 ...

  10. ListCtrl控件着色

    最近在写一款山寨的反病毒软件,大致功能已经实现,还有一些细小的环节需要细化. 其中,在界面编程中,就用到了给ListCtrl控件着色,查看了网上一些文章,终于实现了. 其实说白了,原理很简单,就是Li ...