• 原题链接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. Dart 2.14 版现已发布

    支持 Apple Silicon,增加了默认的 lint.更好的工具和新的语言功能提高生产力. 本月,我们发布了 Dart SDK 2.14 的正式版,新的版本旨在通过独特的可移植性.生产力和稳健性组 ...

  2. C#上位机与PLC通信心跳的实现方法

    -Begin- 大家好!我是付工.众所周知,在工业自动化控制系统中,上位机与下位机之间的通信是实现自动化生产的关键环节之一.为了确保通信的稳定性和可靠性,我们通用会采用一种被称为[心跳机制]的方法,它 ...

  3. [OI] 二项式期望 DP

    OSU OSU yet Another OSU yet yet Another OSU OSU 的题目是这样的:有一些相邻的块,给定每一个块的联通概率,每个连通块对答案有 \(size^{3}\) 的 ...

  4. 第41天:WEB攻防-ASP应用&HTTP.SYS&短文件&文件解析&Access注入&数据库泄漏

    #ASP-中间件-CVE&短文件&解析&写权限 -HTTP.SYS(CVE-2015-1635) 1.漏洞描述 远程执行代码漏洞存在于 HTTP 协议堆栈 (HTTP.sys) ...

  5. Java远程连接服务器实现文件上传下载及目录操作

    详情请阅读原文 在其基础之上做了进一步的封装 <!-- https://mvnrepository.com/artifact/com.jcraft/jsch --> <depende ...

  6. constexpr声明 常量表达式

      constexpr 是 C++ 中用于声明 常量表达式 的关键字,表示一个变量或函数的值在编译时就可以确定,而不是在运行时计算. 这对优化非常有用,因为编译器可以直接将结果嵌入到程序中,减少运行时 ...

  7. 2023年5月中国数据库排行榜:OTO组合回归育新机,华为高斯蓄势待发展雄心

    路漫漫其修远兮,吾将上下而求索. 2023年5月的 墨天轮中国数据库流行度排行 火热出炉,本月共有262个数据库参与排名.本月排行榜前十变动较大,可以用一句话概括为:openGauss 立足创新夺探花 ...

  8. 什么是SQL注入并解决

    ' or ' 1 ' = ' 1 原理:通过违规的字符串改变原来的SQL语句 :[将敏感字符进行转义] // 包名 package com.zhulx.JDBC; // 导入实例类 import co ...

  9. Android复习(三)清单文件中的元素——> provider、receiver、service

    <provider> 语法:   <provider android:authorities="list" android:directBootAware=[&q ...

  10. Java高并发,ArrayList、HashSet、HashMap不安全的集合类

    首先是我们的ArrayList: 这次我们讲解的是集合的不安全,首先我们都知道ArrayList吧! List<String> list=new ArrayList<>(); ...