Description

刁姹接到一个任务,为税务部门调查一位商人的账本,看看账本是不是伪造的。账本上记录了n个月以来的收入情况,其中第i 个月的收入额为Ai(i=1,2,3...n-1,n), 。当 Ai大于0时表示这个月盈利Ai 元,当 Ai小于0时表示这个月亏损Ai 元。所谓一段时间内的总收入,就是这段时间内每个月的收入额的总和。 刁姹的任务是秘密进行的,为了调查商人的账本,她只好跑到商人那里打工。她趁商人不在时去偷看账本,可是她无法将账本偷出来,每次偷看账本时她都只能看某段时间内账本上记录的收入情况,并且她只能记住这段时间内的总收入。 现在,刁姹总共偷看了m次账本,当然也就记住了m段时间内的总收入,你的任务是根据记住的这些信息来判断账本是不是假的。

Input

第一行为一个正整数w,其中w < 100,表示有w组数据,即w个账本,需要你判断。每组数据的第一行为两个正整数n和m,其中n < 100,m < 1000,分别表示对应的账本记录了多少个月的收入情况以及偷看了多少次账本。接下来的m行表示刁姹偷看m次账本后记住的m条信息,每条信息占一行,有三个整数s,t和v,表示从第s个月到第t个月(包含第t个月)的总收入为v,这里假设s总是小于等于t。

Output

包含w行,每行是true或false,其中第i行为true当且仅当第i组数据,即第i个账本不是假的;第i行为false当且仅当第i组数据,即第i个账本是假的。

Sample Input

2
3 3
1 2 10
1 3 -5
3 3 -15
5 3
1 5 100
3 5 50
1 2 51

Sample Output

true
false
 
这个题竟然有贪心做法……真的是非常妙啊
先按左端点为第一排序关键字,再排右端点。
之后就开始两两比较,如果左端点相等,就比较右端点,
如果相等,就比较值,如果值不同,就直接输出false,否则输出true,
如果右端点不等,就把相同的部分抵消掉,把新的区间再压入优先队列。
直到不能操作,就输出true。

我个人对这个贪心是这么理解的:
显然,这么分下去,序列里最大的l是在不断变大的
对于两个区间,除非他们左右端点相等,否则我们无法判断账本是否是假的
我们将序列按上述操作,一步一步往小里分割,总会到分不下去或者false
我一开始有点疑惑那些左端点不同的情况为什么直接不做……
因为左端点靠左的那个区间和后面的区间肯定不会重复的所以留着也没有用了啊

并查集做法https://www.cnblogs.com/thmyl/p/7804751.html
这篇题解码风还是很好读的……

 
  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. #include<queue>
  5. using namespace std;
  6.  
  7. struct node
  8. {
  9. int l,r,s;
  10. bool operator < (const node &h)const
  11. {
  12. return l==h.l?r>h.r:l>h.l;
  13. }
  14. }tmp;
  15. priority_queue<node>q;
  16.  
  17. int t,n,m;
  18.  
  19. int main()
  20. {
  21. scanf("%d",&t);
  22. while (t--)
  23. {
  24. bool flag=true;
  25. while (!q.empty()) q.pop();
  26.  
  27. scanf("%d%d",&n,&m);
  28. for (int i=;i<=m;++i)
  29. {
  30. scanf("%d%d%d",&tmp.l,&tmp.r,&tmp.s);
  31. q.push(tmp);
  32. }
  33.  
  34. tmp=q.top(); q.pop();
  35. while (!q.empty())
  36. {
  37. node tmp1=q.top(); q.pop();
  38. if (tmp.l==tmp1.l)
  39. {
  40. if (tmp.r==tmp1.r)
  41. {
  42. if (tmp.s!=tmp1.s)
  43. {
  44. flag=false;
  45. break;
  46. }
  47. }
  48. else
  49. q.push((node){tmp.r+,tmp1.r,tmp1.s-tmp.s});
  50.  
  51. }
  52. tmp=tmp1;
  53. }
  54. if (flag) printf("true\n");
  55. else printf("false\n");
  56. }
  57. }

1202. [HNOI2005]狡猾的商人【贪心 或 并查集】的更多相关文章

  1. BZOJ 1202: [HNOI2005]狡猾的商人 [带权并查集]

    题意: 给出m个区间和,询问是否有区间和和之前给出的矛盾 NOIp之前做过hdu3038..... 带权并查集维护到根的权值和,向左合并 #include <iostream> #incl ...

  2. 【bzoj1202】[HNOI2005]狡猾的商人 带权并查集

    题目描述 刁姹接到一个任务,为税务部门调查一位商人的账本,看看账本是不是伪造的.账本上记录了n个月以来的收入情况,其中第i 个月的收入额为Ai(i=1,2,3...n-1,n), .当 Ai大于0时表 ...

  3. BZOJ1202: [HNOI2005]狡猾的商人(带权并查集)

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4577  Solved: 2249[Submit][Status][Discuss] Descript ...

  4. bzoj 1202: [HNOI2005]狡猾的商人 并查集好题

    1202: [HNOI2005]狡猾的商人 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2946  Solved: 1384[Submit][Sta ...

  5. BZOJ 1202: [HNOI2005]狡猾的商人( 差分约束 )

    好像很多人用并查集写的... 前缀和, 则 sumt - sums-1 = v, 拆成2条 : sumt ≤ sums-1 + v, sums-1 ≤ sumt - v 就是一个差分约束, 建图跑SP ...

  6. 1202: [HNOI2005]狡猾的商人

    1202: [HNOI2005]狡猾的商人 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1554  Solved: 745[Submit][Stat ...

  7. bzoj 1201[HNOI2005]数三角形 1202 [HNOI2005]狡猾的商人 暴力 权值并查集

    [HNOI2005]数三角形 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 349  Solved: 234[Submit][Status][Disc ...

  8. 【BZOJ】1202: [HNOI2005]狡猾的商人(并查集+前缀和)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1202 用并查集+前缀和. 前缀和从后向前维护和,并查集从前往后合并 对于询问l, r 如果l-1和r ...

  9. BZOJ——1202: [HNOI2005]狡猾的商人

    http://www.lydsy.com/JudgeOnline/problem.php?id=1202 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: ...

随机推荐

  1. IT农民的开发人员工具清单(2013年)

    IT行业日新月异,每天都不断变化着.作为一名混迹IT行业小有几个年头码农来说,不仅要时刻提高自身技术,也要不断更新自己开发工具.这些工具都是我吃饭的饭碗.饭碗旧了也是需要买个新的.转眼之间,已到201 ...

  2. 阿里云搭建hadoop集群服务器,内网、外网访问问题(详解。。。)

    这个问题花费了我将近两天的时间,经过多次试错和尝试,现在想分享给大家来解决此问题避免大家入坑,以前都是在局域网上搭建的hadoop集群,并且是局域网访问的,没遇见此问题. 因为阿里云上搭建的hadoo ...

  3. 【原】Redis实现生成自增流水号

    场景: 公司内部有个业务场景是后台审核之后需要生成一个流水号,规则是: 201807280001,201807280002,201807280003,后面四位依次递增,前面年月日取当前时间并且转换成y ...

  4. Java Swing实战(二)下拉菜单组件JComboBox及其事件监听

    接下来给"数据源配置"面板添加下拉框. /** * @author: lishuai * @date: 2018/11/26 13:51 */ public class Weimi ...

  5. hdu 3295 模拟过程。数据很水

    An interesting mobile game Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Ja ...

  6. java 之DelayQueue实际运用示例

    在学习Java 多线程并发开发过程中,了解到DelayQueue类的主要作用:是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走. ...

  7. 《css揭秘》下(伪元素,文字背景,垂直居中技巧,文字环绕)

    本篇主要记录<CSS3揭秘>一书中后面几章的常用技巧. 1.伪元素换行 先看下HTML代码,如下 <div class="demo1"> <div c ...

  8. 【代码笔记】iOS-archive保存图片到本地

    一,工程图: 二,代码: RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController : UIVi ...

  9. springboot 文件上传和下载

    文件的上传和下载 1.文件上传 html页面代码如下 <form method="post" action="/file/upload1" enctype ...

  10. C# 一个方法如何返回多个值

    通常一个方法只能返回一个值,但是如果在某些时候,我们想要返回多个值,例如某个方法将一个浮点数分割成一个整数和一个小数返回.这个时候我们就要用到out关键字. using System; namespa ...