• 原题链接https://codeforces.com/problemset/problem/2036/E
  • (暂时不会弄翻译,所以不上原题了)

说一下我对题意的理解吧

  1. 有n个国家,每个国家有k个区域,用a_ij表示第i个国家的第j个地区。
  2. 这n个国家所处地势呈斜坡状,也就是编号为1的国家所处地势比编号为2的国家要高,编号为2的国家所处地势比编号为3的国家要高,于是水就会往下流,这n个国家的水会满足或规则,例如:(由a数组变成b数组)

     

    (https://img2024.cnblogs.com/blog/3466055/202412/3466055-20241215111342004-545958007.png)
  3. 现给出m条规则, 比如:2<3。也就是说要找到满足b_i2<3的最小i。先要找到有一个i使b_i满这m条规则,若没有则输出-1。

     

    题意大致是这样。
  • 上思路

    变成b数组后,b数组每一列(从第1行到第n行)都是单调不递减。(这句话其实重点,但刚刚打题意打了太久,有点写不动了,可以看看|这个运算的规则);

    看到这,这个题的重点也就出来了,就是二分查找。然后上两个二分数组。
  • 上代码
#include <bits/stdc++.h>
#define int long long using namespace std;
const int xmmm=1e5+1000;
vector<int>s[xmmm];
struct p{
int x, y;
char c;
}k[xmmm]; bool cmp(p t1, p t2){
if(t1.c!=t2.c)return t1.c<t2.c;
else if(t1.x!=t2.x)return t1.x<t2.x;
else return t1.y<t2.y;
}
int n, k1, q; int check1(int l, int r, int i, int pos){//">"
if(s[r][i]<=pos)return -1;
while(l<r){
int mid=(l+r)/2;
if(s[mid][i]>pos)r=mid;
else l=mid+1;
}
return l;
} int check2(int l, int r, int i, int pos){//"<"
if(s[l][i]>=pos)return -1;
while(l<r){
int mid=(l+r+1)/2;
if(s[mid][i]<pos)l=mid;
else r=mid-1;
}
return l;
} signed main()
{
int T;T=1;
while(T--){
cin>>n>>k1>>q;
for(int i=0;i<n;i++){
for(int j=0;j<k1;j++){
int t;cin>>t;
s[i].push_back(t);
}
}
for(int i=0;i<k1;i++){
for(int j=1;j<n;j++)s[j][i]=s[j-1][i]|s[j][i];
}
while(q--){
int m;cin>>m;
for(int i=0;i<m;i++){
cin>>k[i].x>>k[i].c>>k[i].y;
k[i].x--;
}
int l=0, r=n-1;
for(int j=0;j<m;j++){
if(k[j].c=='>'){
l=check1(l, r, k[j].x, k[j].y);
}
else {
r=check2(l, r, k[j].x, k[j].y);
}
if(l>r||l==-1||r==-1)break;
}
if(l==-1||r==-1||l>r)cout<<-1<<'\n';
else cout<<l+1<<'\n';
}
}
return 0;
}

已经放好代码了,我觉得最重要的就是那两个二分查找吧,不过也可以用现成的函数实现。

 

题解写到这已经告一段落了,后面就是我的碎碎念了。

 

 

*** 自我总结**

为什么我上这道题的题解, 因为最近写了这个题,还因为这题写了很久。

 

开始的时候读了个假题,以为要输出多少个国家满足这些要求,意识到读错题以后,结合每一列具有单调性的性质用了两个指针试图锁定满足条件国家的范围,然后超时了, 之后发现其实二分就够了。

调试的时候还扯到了一个很扯的错误。哈哈哈哈哈哈哈哈哈

 

放一张好看的图片。

Reverse the Rivers 题解的更多相关文章

  1. C++版 - 剑指offer 面试题16:反转链表(Leetcode 206: Reverse Linked List) 题解

    面试题16:反转链表 提交网址: http://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca?tpId=13&tqId= ...

  2. LeetCode:二叉树的锯齿形层次遍历【103】

    LeetCode:二叉树的锯齿形层次遍历[103] 题目描述 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如:给定二叉树 ...

  3. 算法与数据结构基础 - 堆栈(Stack)

    堆栈基础 堆栈(stack)具有“后进先出”的特性,利用这个特性我们可以用堆栈来解决这样一类问题:后续的输入会影响到前面的阶段性结果.线性地遍历输入并用stack处理,这类问题较简单,求解时间复杂度一 ...

  4. 算法与数据结构基础 - 链表(Linked List)

    链表基础 链表(Linked List)相比数组(Array),物理存储上非连续.不支持O(1)时间按索引存取:但链表也有其优点,灵活的内存管理.允许在链表任意位置上插入和删除节点.单向链表结构一般如 ...

  5. Educational Codeforces Round 97 (Rated for Div. 2)【ABCD】

    比赛链接:https://codeforces.com/contest/1437 A. Marketing Scheme 题解 令 \(l = \frac{a}{2}\),那么如果 \(r < ...

  6. [LeetCode 题解]: Reverse Nodes in K-Groups

    前言   [LeetCode 题解]系列传送门:  http://www.cnblogs.com/double-win/category/573499.html   1.题目描述 Given a li ...

  7. [LeetCode]题解(python):092 Reverse Linked List II

    题目来源 https://leetcode.com/problems/reverse-linked-list-ii/ Reverse a linked list from position m to  ...

  8. LeetCode题解——Reverse Integer

    题目: 数字翻转,即输入123,返回321:输入-123,返回-321. 代码: class Solution { public: int reverse(int x) { , sign = ; ) ...

  9. leetcode题解||Reverse Integer 问题

    problem: Reverse digits of an integer. Example1: x = 123, return 321 Example2: x = -123, return -321 ...

  10. leetcode题解 7.Reverse Integer

    题目: Given a 32-bit signed integer, reverse digits of an integer. Example 1: Input: 123 Output: 321 E ...

随机推荐

  1. C++ STL(标准模版库)—— vector 与 迭代器

    STL 基本概念 STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称. STL 从广义上讲分为三类:algorithm(算法).containe ...

  2. 图解YUV420、YUV420(YUY2)、YUV422(YVYU)

    Y:亮度分量    UV:色度分量 1.  标准yuv指的是yuv420 一般看文章,会出现下面的公式,但不涉及具体的yuv格式,其实这一定指的是yuv420 Y与RGB的演算关系为:Y = 0.21 ...

  3. .Net Core 的 using 作用

    // using 的使用 // 1. 引用命名空间 using namespace // 2. 自动释放资源 执行结束自动调用 IDispose 接口释放资源 // using (var contex ...

  4. 检查 .net 的版本号和所有的dotnet 的sdk

    查看版本号: dotnet --version 查看所有的 sdks dotnet --list-sdks

  5. apisix~kafka-logger插件

    作用 将http请求与响应的内容发到kafka的topic,以json的形式发送存储 配置相关 log_format为自定义配置字段,添加后,默认的请求响应消息将被覆盖 { "_meta&q ...

  6. 我在大厂做 CR——为什么建议使用枚举来替换布尔值

    使用枚举替换布尔值主要基于以下几个原因 ● 可读性 ● 可拓展性 ● 安全防控 可读性 我们会定义 boolean 类型(true 或 false)作为方法参数,虽然比较简洁,但有时候参数的含义往往不 ...

  7. linux 配置apache的虚拟主机

    基于web的开发,若没有配置虚拟主机,一直在浏览器输入localhost/projectname有点复杂 特别是类似thinkphp框架的,一大串:localhost/php/tp5/public.. ...

  8. Python 潮流周刊#73:让我们对 PyPI 温柔一点,好吗?(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  9. NIO聊天室

    SocketChannel 和 ServerSocketChannel ServerSocketChannel 用于创建服务器端套接字,而 SocketChannel 用于创建客户端套接字.它们都支持 ...

  10. 每日学学Java开发规范,集合处理(附阿里巴巴Java开发手册(终极版))

    前言 每次去不同的公司,码不同的代码,适应不同的规范,经常被老大教育规范问题,我都有点走火入魔的感觉,还是要去看看阿里巴巴Java开发规范,从中熟悉一下,纠正自己,码出高效,码出质量. 想细看的可以去 ...