好题.
搬运一下luogu的题解, 讲的挺清楚的.

题意:给出一些区间的最小值 求问 最早哪个问题会产生矛盾 输出
我们可以二分判断 哪个地方最早出现矛盾
然后每次针对二分的一个值 我去判断一下是否成立 我首先针对权值排序
然后从大到小去覆盖 出现第一个无法覆盖的区域我就返回false

当然, 此处无法覆盖的区域其实有两种情况 :

  1. 多个区间最小值相同却没有一个共同包含的区间;
  2. 多个区间最小值相同且有一个共同包含的区间, 但是这个区间被一个最小值更大的区间包含.

为了处理这两种不合法的情况, 我们先二分不合法端点所在位置, 然后按照所给的最小值从大到小排序.
对于情况一, 我们记录下相同权值的区间中左端点的最大值右端点的最小值. 假如左端点的最大值 \(>\) 右端点的最小值, 就说明这之间没有被这些区间完全覆盖, 显然不合法.
情况二用线段树或者并查集都可以.
假如遇见了这两种情况, 就缩小二分的右端点即可.
这里我用的线段树.

#include <cstdio>
#include <cstring>
#include <cassert>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 1e6 + 10;
const int MAXQ = 25000 + 10;
inline int read(){char ch = getchar(); int x = 0;while(!isdigit(ch)) ch = getchar();while(isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();return x;
}int N, Q;
struct Query
{int l, r, v;bool operator >(const Query &rhs) const {return v > rhs.v;}
}que[MAXQ], q[MAXQ];namespace stree
{#define mid ((l + r) >> 1)#define ls (o << 1)#define rs ((o << 1) | 1)struct Node{int val, tag;}node[MAXN << 2];inline void pushup(int o) {node[o].val = node[ls].val + node[rs].val;}inline void givetag(int o, int l, int r, int v) {node[o].val = (r - l + 1) * v;node[o].tag = v;}inline void pushdown(int o, int l, int r) {int &v = node[o].tag;if(v == 0) return;givetag(ls, l, mid, v), givetag(rs, mid + 1, r, v);v = 0;} void modify(int o, int l, int r, int a, int b, int v) {if(l > b || r < a) return ;if(a <= l && r <= b) return givetag(o, l, r, v);pushdown(o, l, r);modify(ls, l, mid, a, b, v), modify(rs, mid + 1, r, a, b, v); return pushup(o);}int query(int o, int l, int r, int a, int b) {if(l > b || r < a) return 0;if(a <= l && r <= b) return node[o].val;pushdown(o, l, r);return query(ls, l, mid, a, b) + query(rs, mid + 1, r, a, b);}#undef mid#undef ls#undef rs
}inline bool check(int x) {using namespace stree;memcpy(q, que, (x + 1) * sizeof(Query));sort(q + 1, q + x + 1, greater<Query>());memset(node, 0, ((N + 1) << 2) * sizeof(Node));for(int i = 1; i <= x; i++) {int lmin = q[i].l, rmin = q[i].r, lmax = q[i].l, rmax = q[i].r;while(i + 1 <= x && q[i].v == q[i + 1].v) {++i;lmin = min(lmin, q[i].l), rmin = min(rmin, q[i].r);lmax = max(lmax, q[i].l), rmax = max(rmax, q[i].r);}if(lmax > rmin || query(1, 1, N, lmax, rmin) == (rmin - lmax + 1)) return false;modify(1, 1, N, lmin, rmax, 1);}return true;
}int main(){// freopen("p2898.in", "r", stdin);cin>>N>>Q;for(int i = 1; i <= Q; i++)que[i].l = read(), que[i].r = read(), que[i].v = read();int l = 1, r = Q + 1;while(l < r) {int mid = (l + r) >> 1;if(check(mid)) l = mid + 1;else r = mid;}if(r == Q + 1) puts("0");else printf("%d\n", l);return 0;
}

转载于:https://www.cnblogs.com/wsmrxc/p/9811949.html

P2898 [USACO08JAN]haybale猜测Haybale Guessing相关推荐

  1. 线段树 + 二分答案:Haybale Guessing G

    参考文献:题解 P2898 [[USACO08JAN]haybale猜测Haybale Guessing] - レムの小屋 - 洛谷博客 题目链接:[USACO08JAN]Haybale Guessi ...

  2. 开源Python小项目

    原文地址:开源Python小项目贡献! (github.com) 自述文件模板 项目 SR 否 项目 描述 作者 1 掷骰子刺激器Dice rolling Stimulator 这是一个使用Pytho ...

  3. MixMatch:半监督学习

    MixMatch:半监督学习 1 摘要 2 介绍 3 已有相关工作 3.1 Consistency Regularization 一致性正则化 3.2 Entropy Minimization/ En ...

  4. 七种不同类型的游戏测试技术

    游戏测试是协助确保最终产品具有最佳性能和质量的关键步骤之一.不同的测试技术,能够使游戏的品控人员更加集中精力发现诸如:缺陷.完整性.错误.瓶颈.不一致性.以及流 根据GlobalData(译者注:是全 ...

  5. [USACO 08JAN]Haybale Guessing

    Description The cows, who always have an inferiority complex about their intelligence, have a new gu ...

  6. Haybale Guessing (POJ-3657)

    Problem Description The cows, who always have an inferiority complex about their intelligence, have ...

  7. POJ Haybale Guessing

    Description The cows, who always have an inferiority complex about their intelligence, have a new gu ...

  8. luogu P4085 [USACO17DEC]Haybale Feast(尺取法 + 线段树)

    C.luogu P4085 [USACO17DEC]Haybale Feast 题目链接 直接开一个线段树维护即可. 注意开ll 线段树维护最大值.注意下标别写错了,比如tr[r] #include& ...

  9. 洛谷P3051 [USACO12MAR]Haybale Restacking

    [USACO12MAR]Haybale Restacking 源题目传送门  大意: 给出n块土地,现有泥土A[i],需要改造成B[i],但这次土地排列成环,且不可买进买出,只能运,且∑A[i]=∑B ...

最新文章

  1. 自己实现 koa 中间件的 app.use 和 next 函数
  2. 妹纸这套路玩的好深,吹泡泡能吹出气球来
  3. 宝塔挂载linux硬盘,宝塔移动硬盘挂载Linux服务器挂载ntfs移动硬盘
  4. SharePoint Framework 构建你的第一个web部件(三)
  5. openpyxl 绘制饼形图_好享学丨快速上手Pythonmatplotlib 箱线图绘制,学术人必备
  6. java安卓原生影视APP源码 对接苹果cms后台
  7. C#如何获取物理网卡,虚拟网卡,以及无线网卡
  8. 一生不要瞎忙,只要做对三件事
  9. PIXHAWK飞行模式
  10. 华硕服务器 u盘安装系统,华硕电脑u盘安装系统教程
  11. G - Numbers ZOJ - 3987 (大数+贪心)
  12. 【网络实验箱02】-odl-neutron北向抓包分析
  13. 自己碰到的一个control +鼠标左键无效问题。
  14. android涟漪效果,在5.0以上手机上用系统原生方式实现波纹涟漪效果
  15. 【原创整理】软件测试自我记录(目前携程+招银网络科技)
  16. 调用个人微信的API接口实现微信收发消息
  17. Skype for Business Server 2015-07-边缘服务器-1-安装-先决条件
  18. RSTP配置_思科模拟器
  19. html5禁止浏览器缩放网页大小 (实用)
  20. Hbuilder开发移动新闻客户端(二)

热门文章

  1. asp.net mvc(九)
  2. Oracle随机函数的取法
  3. Javascript二进制运算符的一些运用场景
  4. mysql 8.0 ~ 安装
  5. Linux 下配置 node + mongodb 环境
  6. Ionic Cordova实现软键盘的监听 以及操作大全
  7. 《从问题到程序:用Python学编程和计算》——2.4 字符串
  8. 制作可以 SSH 登录的 Docker 镜像
  9. 文件查找工具Everything使用笔记
  10. 开源云平台 CloudStack 4.1.0 安装详解 - 3、vCenter