3043: IncDec Sequence

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 248  Solved: 139
[Submit][Status]

Description

给定一个长度为n的数列{a1,a2...an},每次可以选择一个区间[l,r],使这个区间内的数都加一或者都减一。
问至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最少次数的前提下,最终得到的数列有多少种。

Input

第一行一个正整数n 
接下来n行,每行一个整数,第i+1行的整数表示ai。

Output

第一行输出最少操作次数
第二行输出最终能得到多少种结果

Sample Input

4
1
1
2
2

Sample Output

1
2

HINT

对于100%的数据,n=100000,0<=ai<2147483648

  正解传送门:http://blog.csdn.net/willinglive/article/details/38419573

  我看到这道题时并没有想到正解,但是很容易yy出来修改策略,每次填满最低的那一段区间,像涨水一样一直涨到顶端,离散处理将低于x的所有值提升到x的增加次数,然后倒着在做一遍,如果暴力做的话肯定会TLE,我们观察每次增加的区间数量即为低于x的区间联通块数量,这不是涨水求联通数的裸题?。。。。

  最后,因为我先离散化了所有点,所以如果我想回答询问2的话,需要回答离散之前的位置个数,这一点很容易wa。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define MAXN 110000
#define INF 0x3f3f3f3f
#define INFL 0x3f3f3f3f3f3f3f3fLL
typedef long long qword;
int a[MAXN];
pair<int,int> b[MAXN];
int c[MAXN];
int n,m;
qword v1[MAXN],v2[MAXN];
int uf[MAXN];
int get_fa(int now)
{
return uf[now]==now ? now : uf[now]=get_fa(uf[now]);
}
int comb(int x,int y)
{
x=get_fa(x);
y=get_fa(y);
if (x==y)return false;
uf[x]=y;
return true;
}
int main()
{
freopen("input.txt","r",stdin);
scanf("%d",&n);
int i,j,k;
for (i=;i<n;i++)
{
scanf("%d",a+i);
b[i].first=a[i];
b[i].second=i;
c[i]=a[i];
}
sort(c,c+n);
m=unique(c,c+n)-c;
sort(b,&b[n]);
int nowc=;
qword tot=;
int x,y;
for (i=;i<n;i++)uf[i]=i;
for (i=;i<n;i++)
{
x=b[i].second;
tot++;
if (x && a[x-]<=a[x])
tot-=comb(x-,x);
if (x<n- && a[x+]<a[x])
tot-=comb(x+,x);
if (i!=n- && b[i+].first!=b[i].first)
{
v1[nowc+]=v1[nowc]+tot*(c[nowc+]-c[nowc]);
nowc++;
}
}
nowc=m-;
tot=;
for (i=;i<n;i++)uf[i]=i;
for (i=n-;i>=;i--)
{
x=b[i].second;
tot++;
if (x<n- && a[x+]>=a[x])
tot-=comb(x+,x);
if (x && a[x-]>a[x])
tot-=comb(x-,x);
if (i && b[i-].first!=b[i].first)
{
v2[nowc-]=v2[nowc]+tot*(c[nowc]-c[nowc-]);
nowc--;
}
}
qword ans=INFL;
int mina=INF,maxa=-INF;
for (i=;i<m;i++)
{
if (v1[i]+v2[i]<ans)
{
ans=v1[i]+v2[i];
mina=INF,maxa=-INF;
}
if (v1[i]+v2[i]==ans)
mina=min(mina,c[i]),maxa=c[i];
}
printf("%lld\n%d\n",ans,maxa-mina+);
}

bzoj 3043: IncDec Sequence 模拟的更多相关文章

  1. BZOJ 3043: IncDec Sequence

    3043: IncDec Sequence Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 578  Solved: 325[Submit][Statu ...

  2. BZOJ 3043 IncDec Sequence:反向差分

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3043 题意: 给定一个长度为n的数列a[i],每次可以选择一个区间[l,r],使这个区间内 ...

  3. BZOJ 3043: IncDec Sequence 差分 + 思维

    Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) ...

  4. 【BZOJ 3043】 3043: IncDec Sequence (差分)

    3043: IncDec Sequence Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 589  Solved: 332 Description 给 ...

  5. Poetize6: IncDec Sequence

    3043: IncDec Sequence Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 233  Solved: 132[Submit][Statu ...

  6. CH-0304 IncDec Sequence

    0304 IncDec Sequence 0x00「基本算法」例题 描述 给定一个长度为 n(n≤10^5 ) 的数列 {a_1,a_2,…,a_n},每次可以选择一个区间 [l,r],使下标在这个区 ...

  7. 前缀和与差分之IncDec sequence

    参考链接:https://blog.csdn.net/hzk_cpp/article/details/80407014 题目链接:https://www.acwing.com/problem/cont ...

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

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

  9. 【BZOJ3043】IncDec Sequence 乱搞

    [BZOJ3043]IncDec Sequence Description 给定一个长度为n的数列{a1,a2...an},每次可以选择一个区间[l,r],使这个区间内的数都加一或者都减一.问至少需要 ...

随机推荐

  1. java注解研究

    注解作用 常见的作用有以下几种: 生成文档.这是最常见的,也是java 最早提供的注解.常用的有@see @param @return @author等. 跟踪代码依赖性,实现替代配置文件功能.比较常 ...

  2. 关于Fragment与Fragment、Activity通信的四种方式

    一直想总结一下Fragment与Fragment.Activity通信的问题,今天有时间一共总结了三种,权当抛砖引玉,如果大家还有更好的方式来实现Fragment和Fragment.Activity的 ...

  3. C# Obsolete

    Obsolete 属性将某个程序实体标记为一个建议不再使用的实体.每次使用被标记为已过时的实体时,随后将生成警告或错误,这取决于属性是如何配置的 如果把false 改成 true 的话那么GetNam ...

  4. EasilyUI的一个简单的拖拽功能

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Main.aspx.cs&quo ...

  5. javascript进击(三)简介

    JavaScript 表单验证(可用来在数据被送往服务器前对 HTML 表单中的这些输入数据进行验证) 被 JavaScript 验证的这些典型的表单数据有: 用户是否已填写表单中的必填项目? 用户输 ...

  6. 你不知道的javascript 上卷 读书笔记

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. String filePath = request.getSession().getServletContext().getRealPath("/");这句话返回的路径是什么,解释下getRealPath("/")函数中的"/"表示什么意思

    request.getSession().getServletContext() 获取的是Servlet容器对象,相当于tomcat容器了.getRealPath("/") 获取实 ...

  8. Spring、struts、webwork2三者MVC的比较

    http://blog.sina.com.cn/s/blog_4a69fa43010005il.html 在web应用方面,Spring有独立的MVC实现,与struts和webwork2相比毫不逊色 ...

  9. javascript 内置对象 第17节

    <html> <head> <title>内置对象</title> </head> <body> <div>内置对象 ...

  10. sublime_2014-11-19

    http://xionggang163.blog.163.com/blog/static/376538322013930104310297/ 直接输入注册码就可以了 ----- BEGIN LICEN ...