• 原题链接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. 阿里邮箱网页正常登陆,outlook报错

    事件起因: 某客户使用阿里邮箱办公,然又使用outlook绑定阿里邮箱:在网页端可以登录阿里邮箱,但是在outlook的登录的时候,服务器.端口均设置无误,但是就是登录不上去,死活都等登录不上去,总是 ...

  2. Codeforces Round 977 (Div. 2)

    手速局,因为水平不够三题遗憾离场. A. Meaning Mean 题意 你一个序列,你每次可以选择两个数删掉,并把他们的平均数加入到序列的末尾.当序列长度为 \(1\) 的时候,剩下的数最大值是多少 ...

  3. 冒泡排序和一点优化(php)

    function maopao($arr){ $len = count($arr);//获取数组的长度 //有多少个数组元素就最多就要排n-1次 for ($j=0;$j<$len-1;$j++ ...

  4. Trace32 simulator调试以及简单实用命令介绍

    目录 Trace32 Simulator debug Trace32工具配置 Trace32命令简介 memory class 常见命令索引 v.v使用实例 不同CPU运行信息查看 Trace32 S ...

  5. sklearn分类模块

    学习数据酷客做的笔记,懒得自己打字,就截屏记录一下,方便以后回顾.

  6. Excel读写之xlrd模块

    1.1.xlrd模块介绍 xlrd:用于读取Excle数据文件将返回的数据对象放到内存中,然后查询数据文件对象的相关信息. xlwt:用于在内存中生成新的数据文件对象,处理完成后写入到Excel数据文 ...

  7. 74.数组map能干什么,会改变原数组吗

    map是处理数据的方法,不会改变原数组,会返回一个新数组 : filter 也不会改变原数组,会返回新数组 : forEach 也不会改变原数组,不会返回新数组 : reduce不会改变原数组 : 是 ...

  8. Nmap信息命令详解

    常用命令 nmap 192.168.0.100(简单扫描) nmap 192.168.0.100/24(扫描目标地址所在的某个网段) nmap 192.168.0.0/24(扫描整个子网中的网络主机信 ...

  9. 如何在Windows 11系统中将任意文件(如bat/log等)固定在开始菜单?

    在Windows 11系统中,默认只支持将.exe/文件夹/.zip固定在开始菜单,如果想将其他文件如.bat/.log等文件固定在开始菜单将在右键菜单中找不到选项. 一个更简单的办法: 对任意文件右 ...

  10. Java跳出当前的多重嵌套循环的3种解决方法

    Java跳出当前的多重嵌套循环的3种解决方法(以双重嵌套为例) 方法一:使用一个布尔型的标记变量flag 1 public static void method1() { 2 boolean flag ...