题目:https://www.luogu.org/record/show?rid=12702916

https://www.lydsy.com/JudgeOnline/problem.php?id=1168

一眼不可做...即使数据范围很小...

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. typedef long long ll;
  7. int const xn=;
  8. int n;
  9. ll a[xn],b[xn],inf=1e17;
  10. bool cmp(int x,int y){return b[x]>b[y];}
  11. int main()
  12. {
  13. scanf("%d",&n);
  14. for(int i=;i<=n;i++)scanf("%lld",&a[i]);
  15. for(int i=;i<=n;i++)scanf("%lld",&b[i]);
  16. ll ansa=,ansb=; int tot=;
  17. for(int i=;i<=n;i++)
  18. {
  19. if(a[i]&&!b[i])ansa+=a[i];
  20. else if(!a[i]&&b[i])ansb+=b[i];
  21. else if(a[i]&&b[i])a[++tot]=a[i],b[tot]=b[i];
  22. }
  23. int mx=(<<tot); ll pa=inf,pb=inf;
  24. for(int s=;s<mx;s++)
  25. {
  26. ll tmpa=,tmpb=,mxa=inf,mxb=inf; int cnta=;
  27. for(int i=;i<=tot;i++)
  28. {
  29. if(s&(<<(i-)))tmpa+=a[i],mxa=min(mxa,a[i]-),cnta++;
  30. else tmpb+=b[i],mxb=min(mxb,b[i]-);
  31. }
  32. if(cnta==tot)tmpa-=mxa; if(cnta==)tmpb-=mxb;
  33. if(!cnta)tmpa++; else tmpb++;
  34. // if(cnta==tot)tmpa-=mxa,tmpb++;
  35. // else if(cnta==0)tmpb-=mxb,tmpa++;
  36. // else tmpa-=mxa,tmpb++;
  37. if(tmpa+tmpb<pa+pb)pa=tmpa,pb=tmpb;
  38. }
  39. printf("%lld\n%lld\n",pa+ansa,pb+ansb);
  40. return ;
  41. }

还写过10分的错误思路

首先,设每种颜色左右手套个数为 l[i],r[i],如果有 l[i]=0 或 r[i]=0,显然最劣情况要选,所以提前处理好;

设一个状态 ans(L),表示左手套取 L 个时的答案;

显然,这个答案是唯一的而且最劣的,现在要找到这个答案;

取 L 个左手套,根据取法的不同,可以取出许多种颜色集合,把每一个可能的集合记作 T;

而这些颜色集合又组成了一个集合,记作 A(L),表示选 L 个左手套会产生的颜色集合的集合;

考虑每个集合 T,在右边都对应一种最劣的选法,就是把不在 T 中的颜色都选了,最后再+1;

设这个为 R(T),即 R(T) = (∑r[i]) + 1,其中 i 不在集合 T 中;

所以,ans(L) = max{ R(T) },其中 T 是 A(L) 中的一个集合,这样做很妙地没有限制什么而找到了最劣答案,保证了正确性;

现在,考虑 A(L) 中有哪些 T,发现:

A(L) = { T | |T| <= L <= S(T) },其中 |T| 是 T 这个集合包含的颜色数量,S(T) 是 T 这个集合包含的那些颜色的手套个数的和;

由于我们找的是 max{ R(T) },而 |T| 越小,R(T) 越大,所以最终 ans(L) 的取值会是合法范围内某个 |T| 最小的,所以可以暂时忽略 |T| <= L 这个条件!!

所以,现在就变成若 S(T) >= L,则 R(T) 可以更新 ans(L);

然后,可以发现,会成为最终答案的 L,应该是某些颜色的手套全选,最后再+1,否则...应该不是最优的(感性理解...);

所以处理出这种 L,找 S(T) >= L 中 R(T) 最大的,可以用单调栈实现;

用结构体存一种集合的 S(T) 和 R(T),S(T) 同时也是上面所说的 L,按 S(T) 从小到大排序,不断弹栈令栈内 R(T) 是单调递减的,就能找到一个结构体后面(S(T) >= L)的 R(T) 最大值,对于一个 R(T) 也能去更新前面同等条件最小的 L;

还有些疑惑之处...就是一些 L 相同的结构体,排序时按 r<y.r 或 r>y.r 都可以过...但是感觉应该是 r<y.r 才对!后面就可以把前面都弹掉,则栈里后面元素的 S(T) 一定 >= L+1;

但如果栈里最后只留下一个值...难道因为这样构造所以不会出现这种情况?

总之勉强A了,思路还是很妙的。

代码如下:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. int const xn=;
  7. int n,a[xn],b[xn],ansl,ansr,sta[<<],top;
  8. struct N{
  9. int l,r;
  10. bool operator < (const N &y) const
  11. {return l==y.l?r<y.r:l<y.l;}//
  12. }f[<<];
  13. int rd()
  14. {
  15. int ret=,f=; char ch=getchar();
  16. while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
  17. while(ch>=''&&ch<='')ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
  18. return f?ret:-ret;
  19. }
  20. void update(int x,int y)
  21. {
  22. if(ansl+ansr>x+y||(ansl+ansr==x+y&&ansl>x))
  23. ansl=x,ansr=y;
  24. }
  25. int main()
  26. {
  27. n=rd(); int pl=,pr=,tot=;
  28. for(int i=;i<=n;i++)a[i]=rd();
  29. for(int i=;i<=n;i++)b[i]=rd();
  30. for(int i=;i<=n;i++)
  31. {
  32. if(a[i]&&!b[i])pl+=a[i];
  33. else if(!a[i]&&b[i])pr+=b[i];
  34. else if(a[i]&&b[i])a[++tot]=a[i],b[tot]=b[i];
  35. }
  36. int mx=(<<tot);
  37. for(int i=;i<mx;i++)
  38. for(int j=;j<=tot;j++)
  39. {
  40. if(i&(<<(j-)))f[i].l+=a[j];
  41. else f[i].r+=b[j];
  42. }
  43. sort(f,f+mx);
  44. for(int i=;i<mx;i++)
  45. {
  46. while(top&&f[sta[top]].r<f[i].r)top--;
  47. sta[++top]=i;
  48. }
  49. ansl=1e9; ansr=1e9;
  50. for(int i=;i<top;i++)update(f[sta[i]].l+,f[sta[i+]].r+);
  51. printf("%d\n%d\n",ansl+pl,ansr+pr);
  52. return ;
  53. }

洛谷 P4660 & bzoj 1168 [ Baltic OI 2008 ] 手套 —— 分析+单调栈的更多相关文章

  1. 洛谷10月月赛Round.1| P3400 仓鼠窝[单调栈]

    题目描述 萌萌哒的Created equal是一只小仓鼠,小仓鼠自然有仓鼠窝啦. 仓鼠窝是一个由n*m个格子组成的行数为n.列数为m的矩阵.小仓鼠现在想要知道,这个矩阵中有多少个子矩阵!(实际上就是有 ...

  2. 洛谷P2178 品酒大会【后缀数组】【单调栈】

    题目描述 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战 两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个奖项,吸引了众多品酒师参加. 在大会的晚餐上,调酒师 Rainb ...

  3. 【洛谷5294】[HNOI2019] 序列(主席树维护单调栈+二分)

    点此看题面 大致题意: 给你一个长度为\(n\)的序列\(A\),每次询问修改一个元素(只对当前询问有效),然后让你找到一个不下降序列\(B\),使得这两个序列相应位置之差的平方和最小,并输出这个最小 ...

  4. 洛谷 P4198 楼房重建 线段树维护单调栈

    P4198 楼房重建 题目链接 https://www.luogu.org/problemnew/show/P4198 题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上 ...

  5. 洛谷P2178 [NOI2015]品酒大会 后缀数组+单调栈

    P2178 [NOI2015]品酒大会 题目链接 https://www.luogu.org/problemnew/show/P2178 题目描述 一年一度的"幻影阁夏日品酒大会" ...

  6. 洛谷 P2587 BZOJ 1034 [ZJOI2008]泡泡堂

    题目描述 //不知道为什么BZOJ和洛谷都没有这幅图了,大牛们几年前的博客上都有这幅图的,把它贴上来吧 第XXXX届NOI期间,为了加强各省选手之间的交流,组委会决定组织一场省际电子竞技大赛,每一个省 ...

  7. 洛谷 P3307: bzoj 3202: [SDOI2013] 项链

    题目传送门:洛谷P3307.这题在bzoj上是权限题. 题意简述: 这题分为两个部分: ① 有一些珠子,每个珠子可以看成一个无序三元组.三元组要满足三个数都在$1$到$m$之间,并且三个数互质,两个珠 ...

  8. 洛谷 4106 / bzoj 3614 [HEOI2014]逻辑翻译——思路+类似FWT

    题目:https://www.luogu.org/problemnew/show/P4106 https://www.lydsy.com/JudgeOnline/problem.php?id=3614 ...

  9. 洛谷 P3332 BZOJ 3110 [ZJOI2013]K大数查询

    题目链接 洛谷 bzoj 题解 整体二分 Code #include<bits/stdc++.h> #define LL long long #define RG register usi ...

随机推荐

  1. Cursor类用法:

      Cursor类用法:   http://www.2cto.com/kf/201109/103163.html   Ctrl+Shift+G 查找类.方法和属性的引用.这是一个非常实用的快捷键,例如 ...

  2. Android相关工具下载(ADT、NDK等等)

    一个非常牛掰的网站,可以下载很多Android相关的工具等 网址为: http://www.androiddevtools.cn/

  3. python(22)- 递归和函数式编程

    递归: 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 1. 必须有一个明确的结束条件: 2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少: 3.递 ...

  4. 关于mysql engine(引擎)的疑问

    http://bbs.chinaunix.net/thread-989698-1-1.html

  5. windows下检验caffe是否配置正确

    windows下检验caffe是否配置正确:(注:不考虑搭建caffe的编译环境,而是直接使用caffe官网提供的二进制文件) windows版本源码以及二进制库文件下载地址:https://gith ...

  6. FFmpeg编码详细流程

    FFmpeg在编码一个视频的时候的函数调用流程.为了保证结构清晰,其中仅列出了最关键的函数,剔除了其它不是特别重要的函数. 函数背景色 函数在图中以方框的形式表现出来.不同的背景色标志了该函数不同的作 ...

  7. OpenCV 的四大模块

    前言 我们都知道 OpenCV 是一个开源的计算机视觉库,那么里面到底有哪些东西?本文将为你解答这个问题. 模块一:CV 这个模块是 OpenCV 的核心,它包含了基本的图像处理函数和高级的计算机视觉 ...

  8. 升级到Scriptcase 8.0的注意事项

    Scriptcase的最新版本号v8.0已经正式公布了,因为国外下载较慢,我们在百度云盘创建了下载地址: http://pan.baidu.com/s/1qWwh6bi (Windows可运行文件)大 ...

  9. HDU 4622 Reincarnation 后缀自动机 // BKDRHash(最优hash)

    Reincarnation Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) P ...

  10. 【BZOJ3218】a + b Problem 可持久化线段树优化建图

    [BZOJ3218]a + b Problem 题解:思路很简单,直接最小割.S->i,容量为Bi:i->T,容量为Wi:所有符合条件的j->new,容量inf:new->i, ...