好题.
搬运一下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. oracle非常量不能用于privot_Oracle 行转列(pivot、wm_concat、decode)使用总结(转载)...
  2. Corona按钮只能让点击一次
  3. C语言函数手册:c语言库函数大全|C语言标准函数库|c语言常用函数查询
  4. 002---tcp/ip五层详解
  5. apache karaf_未来是Apache Karaf上的微服务架构
  6. 金融行业 | 电子银行系统性能优化解决方案
  7. RMAN深入解析之--内存中的RMAN
  8. lesson - 1 - IP /DNS /cat !$ /putty 知识扩充
  9. 深圳大学计算机与软件学院李志,李志彬
  10. Unity之IL2CPP
  11. RTKLIB源码解析(三)、 Rinex文件读取(rinex.c)——2
  12. 已解决:Torch not compiled with CUDA enabled
  13. 软件测试之因果图法(P24——P26)
  14. 去除字符串中的特殊符号及表情
  15. 【ICPC 2018 Malaysia】UPC-9302 ELI'S CURIOUS MIND(递推)
  16. Cannot get a STRING value from a NUMERIC cell
  17. vxe-table 如何用回车键替换 Tab 键功能,回车切换到右侧单元格,回车切换下一个单元格
  18. html css 悬浮切换效果,CSS3悬浮动画效果_html/css_WEB-ITnose
  19. SCM供应链系统有什么价值?
  20. 阿里云云栖大会2020----云游戏平台发布(记录)

热门文章

  1. svn上传时显示database is locked
  2. mysql,php和js根据经纬度计算距离
  3. 微信公共开发人员文档 阅读笔记
  4. 008_MAC 终端使用技巧
  5. javascript性能
  6. ssh 免密码登录---问题
  7. Netscaler 10.5 VPX与XenApp XenDesktop 集成配置系列之三enable StoreFront Remote Access
  8. 开源中国翻译频道链接收藏
  9. zend studio和dreamweaver使用小笔记
  10. 做bionic(mips)的人犯错,sigsuspend 死锁