BZOJ 3180 coci2012 ograda
2013-10-30 20:07
375 查看
题目描述
给出长度为N的序列和N个数字,要求把给出的N个数重新排成一个数列,使新数列与原数列相似且相邻两个数的差的和最大。相似的定义:B数列中第i个数与相邻的数的大小关系与A数列中的第i个数与相邻的数的大小关系一样。
输入
第一行N代表数列的长度
第二行N个数,代表给出的序列
第三行N个数,代表给出的数
输出
输出共两行。第一行为相邻的数的差的和,第二行N个数,代表新数列
数据规模与约定
N<=300000,数列中的数<=10^9
思路
这题看起来较复杂,其实比较简单。把这个数列用点表示出来(单调上升或下降区间视为一个点),则整个数列画出来的样子大概是这样的(一凹一凸):
我们可以发现答案至于这些虚线的顶点有关,相邻两个顶点之间的点是不会影响答案的,所以只要保证两个顶点间的差值最大即可。所以我们把给出的数字排序,记录两个端点L,R代表数组两端下一个取出来的是多少。先找出所有顶点,再按大小插入即可,注意边界情况。
CODE:
给出长度为N的序列和N个数字,要求把给出的N个数重新排成一个数列,使新数列与原数列相似且相邻两个数的差的和最大。相似的定义:B数列中第i个数与相邻的数的大小关系与A数列中的第i个数与相邻的数的大小关系一样。
输入
第一行N代表数列的长度
第二行N个数,代表给出的序列
第三行N个数,代表给出的数
输出
输出共两行。第一行为相邻的数的差的和,第二行N个数,代表新数列
数据规模与约定
N<=300000,数列中的数<=10^9
思路
这题看起来较复杂,其实比较简单。把这个数列用点表示出来(单调上升或下降区间视为一个点),则整个数列画出来的样子大概是这样的(一凹一凸):
我们可以发现答案至于这些虚线的顶点有关,相邻两个顶点之间的点是不会影响答案的,所以只要保证两个顶点间的差值最大即可。所以我们把给出的数字排序,记录两个端点L,R代表数组两端下一个取出来的是多少。先找出所有顶点,再按大小插入即可,注意边界情况。
CODE:
#include<cstdio> #include<algorithm> using namespace std; class Dread{ public: int Int() { int x;read(x);return x; } private: bool isdigit(char ch){ return ('0'<=ch && ch<='9'); } void read(int &x){ char ch;x=0; while (ch=getchar()) if (isdigit(ch)) break; for (; isdigit(ch); ch=getchar()) x=x*10+ch-'0'; } }READ; const int N_MAX=300000+10; int a[N_MAX],b[N_MAX],ans[N_MAX]; inline int abs(int x){ return x<0?-x:x; } int main(){ int N=READ.Int(); for (int i=1; i<=N; ++i) a[i]=READ.Int(); for (int i=1; i<=N; ++i) b[i]=READ.Int(); sort(b+1,b+N+1); int L=1,R=N; for (int i=2; i<N; ++i){ if (a[i-1]<a[i] && a[i]>a[i+1]) ans[i]=b[R--]; if (a[i-1]>a[i] && a[i]<a[i+1]) ans[i]=b[L++]; } ans[1]=a[1]<a[2]?b[L++]:b[R--]; ans =a <a[N-1]?b[L++]:b[R--]; for (int i=2; i<N; ++i){ if (a[i-1]<a[i] && a[i]<a[i+1]) ans[i]=b[L++]; if (a[i-1]>a[i] && a[i]>a[i+1]) ans[i]=b[R--]; } long long res=0; for (int i=2; i<=N; ++i) res+=abs(ans[i]-ans[i-1]); printf("%lld\n", res); for (int i=1; i<=N; ++i) printf("%d ", ans[i]); return 0; }
相关文章推荐
- 3180: [Coci2012]ograda 贪心
- BZOJ 3181: [Coci2012]BROJ 【数据分治(暴力+(二分&&容斥))
- BZOJ 3181([Coci2012]BROJ-最小质因子为p的第k小素数)
- BZOJ 3181([Coci2012]BROJ-最小质因子为p的第k小素数)
- [BZOJ3179][Coci2012][线段树][贪心]RASPORED
- BZOJ3463 : [COCI2012] Inspector
- 【bzoj3463】[COCI2012] Inspector
- 2329: [HNOI2011]括号修复 - BZOJ
- [BZOJ 1207] [HNOI 2004] 打鼹鼠 【DP】
- BZOJ 1045 糖果传递
- BZOJ2843: 极地旅行社
- bzoj 1691: [Usaco2007 Dec]挑剔的美食家(splay)
- BZOJ1907: 树的路径覆盖 树形DP
- Bzoj1076 [SCOI2008]奖励关
- bzoj2005 [Noi2010]能量采集
- BZOJ3563/3569 DZY Loves Chinese II/DZY Loves Chinese
- [bzoj4550] 小奇的博弈
- bzoj 2038 小z的袜子
- bzoj3564 信号增幅仪【最小圆覆盖+坐标变换】
- 【BZOJ3110】K大数查询(整体二分)