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。

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. #include<algorithm>
  5. using namespace std;
  6. #define MAXN 110000
  7. #define INF 0x3f3f3f3f
  8. #define INFL 0x3f3f3f3f3f3f3f3fLL
  9. typedef long long qword;
  10. int a[MAXN];
  11. pair<int,int> b[MAXN];
  12. int c[MAXN];
  13. int n,m;
  14. qword v1[MAXN],v2[MAXN];
  15. int uf[MAXN];
  16. int get_fa(int now)
  17. {
  18. return uf[now]==now ? now : uf[now]=get_fa(uf[now]);
  19. }
  20. int comb(int x,int y)
  21. {
  22. x=get_fa(x);
  23. y=get_fa(y);
  24. if (x==y)return false;
  25. uf[x]=y;
  26. return true;
  27. }
  28. int main()
  29. {
  30. freopen("input.txt","r",stdin);
  31. scanf("%d",&n);
  32. int i,j,k;
  33. for (i=;i<n;i++)
  34. {
  35. scanf("%d",a+i);
  36. b[i].first=a[i];
  37. b[i].second=i;
  38. c[i]=a[i];
  39. }
  40. sort(c,c+n);
  41. m=unique(c,c+n)-c;
  42. sort(b,&b[n]);
  43. int nowc=;
  44. qword tot=;
  45. int x,y;
  46. for (i=;i<n;i++)uf[i]=i;
  47. for (i=;i<n;i++)
  48. {
  49. x=b[i].second;
  50. tot++;
  51. if (x && a[x-]<=a[x])
  52. tot-=comb(x-,x);
  53. if (x<n- && a[x+]<a[x])
  54. tot-=comb(x+,x);
  55. if (i!=n- && b[i+].first!=b[i].first)
  56. {
  57. v1[nowc+]=v1[nowc]+tot*(c[nowc+]-c[nowc]);
  58. nowc++;
  59. }
  60. }
  61. nowc=m-;
  62. tot=;
  63. for (i=;i<n;i++)uf[i]=i;
  64. for (i=n-;i>=;i--)
  65. {
  66. x=b[i].second;
  67. tot++;
  68. if (x<n- && a[x+]>=a[x])
  69. tot-=comb(x+,x);
  70. if (x && a[x-]>a[x])
  71. tot-=comb(x-,x);
  72. if (i && b[i-].first!=b[i].first)
  73. {
  74. v2[nowc-]=v2[nowc]+tot*(c[nowc]-c[nowc-]);
  75. nowc--;
  76. }
  77. }
  78. qword ans=INFL;
  79. int mina=INF,maxa=-INF;
  80. for (i=;i<m;i++)
  81. {
  82. if (v1[i]+v2[i]<ans)
  83. {
  84. ans=v1[i]+v2[i];
  85. mina=INF,maxa=-INF;
  86. }
  87. if (v1[i]+v2[i]==ans)
  88. mina=min(mina,c[i]),maxa=c[i];
  89. }
  90. printf("%lld\n%d\n",ans,maxa-mina+);
  91. }

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. 神奇的 BlocksKit(1):源码分析(上)

    高能预警:本篇文章非常长,因为 BlocksKit 的实现还是比较复杂和有意的.这篇文章不是为了剖析 iOS 开发中的 block 的实现以及它是如何组成甚至使用的,如果你想通过这篇文章来了解 blo ...

  2. 判断URL是否存在

    判断URL是否存在   判断网址是否存在,可以使用下面方面处理.如果HttpStatusCode为OK,说明网址存在.

  3. Android Studio快捷键指南(本文持续更新)

    这是我在使用Android Studio过程中接触到的一些快捷键,和大家分享,后面会继续完善此文,也欢迎大家踊跃补充,一起完善. 快捷键 删除并剪贴行:Ctrl+X 复制一行:Ctrl+D 代码格式整 ...

  4. 【腾讯Bugly干货分享】RecyclerView 必知必会

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/CzrKotyupXbYY6EY2HP_dA 导语 Re ...

  5. Click ListView Item跳转Activity

    今天学习了ListView点击Item跳转,修改上一篇代码bindData方法 lv.setOnItemClickListener(new OnItemClickListener() { public ...

  6. 编码、解码Html代码

    引用 Base64-80.js 文件 做网页的时候有时候需要把富文本框的html代码保存到数据库,那么就需要编码后保存到数据库.浏览器端或后台再解码作绑定 *编码:encode64(str) *解码: ...

  7. Android应用程序消息处理机制笔记

    看老罗的Android源码情景分析学习的时候,边抄边理解再总结.希望能为面试提供点帮助吧. 1.Android应用程序是通过消息来驱动,Android应用程序每一个线程在启动时,都可以首先在内部创建一 ...

  8. LiangNa Resum

    LiangNa AnShan Street, YangPu, NY @.com OBJECTIVE: Seeking a position to contribute my skills and ed ...

  9. react native android 开发,基础配置笔记。

    一.React-native-device-info https://github.com/rebeccahughes/react-native-device-info 二.修改App名称 三.定位权 ...

  10. weblogic 12c 配置jvm的内存大小

    每个weblogic server 都是运行在一个java虚拟机上 ,对weblogic的内存设置也就是对java虚拟机的内存设置. MEM_ARGS=-Xms512m -Xmx1024m -XX:M ...