Reverse the Rivers 题解
- 原题链接https://codeforces.com/problemset/problem/2036/E
- (暂时不会弄翻译,所以不上原题了)
说一下我对题意的理解吧
- 有n个国家,每个国家有k个区域,用a_ij表示第i个国家的第j个地区。
- 这n个国家所处地势呈斜坡状,也就是编号为1的国家所处地势比编号为2的国家要高,编号为2的国家所处地势比编号为3的国家要高,于是水就会往下流,这n个国家的水会满足或规则,例如:(由a数组变成b数组)
(https://img2024.cnblogs.com/blog/3466055/202412/3466055-20241215111342004-545958007.png) - 现给出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 题解的更多相关文章
- C++版 - 剑指offer 面试题16:反转链表(Leetcode 206: Reverse Linked List) 题解
面试题16:反转链表 提交网址: http://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca?tpId=13&tqId= ...
- LeetCode:二叉树的锯齿形层次遍历【103】
LeetCode:二叉树的锯齿形层次遍历[103] 题目描述 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如:给定二叉树 ...
- 算法与数据结构基础 - 堆栈(Stack)
堆栈基础 堆栈(stack)具有“后进先出”的特性,利用这个特性我们可以用堆栈来解决这样一类问题:后续的输入会影响到前面的阶段性结果.线性地遍历输入并用stack处理,这类问题较简单,求解时间复杂度一 ...
- 算法与数据结构基础 - 链表(Linked List)
链表基础 链表(Linked List)相比数组(Array),物理存储上非连续.不支持O(1)时间按索引存取:但链表也有其优点,灵活的内存管理.允许在链表任意位置上插入和删除节点.单向链表结构一般如 ...
- Educational Codeforces Round 97 (Rated for Div. 2)【ABCD】
比赛链接:https://codeforces.com/contest/1437 A. Marketing Scheme 题解 令 \(l = \frac{a}{2}\),那么如果 \(r < ...
- [LeetCode 题解]: Reverse Nodes in K-Groups
前言 [LeetCode 题解]系列传送门: http://www.cnblogs.com/double-win/category/573499.html 1.题目描述 Given a li ...
- [LeetCode]题解(python):092 Reverse Linked List II
题目来源 https://leetcode.com/problems/reverse-linked-list-ii/ Reverse a linked list from position m to ...
- LeetCode题解——Reverse Integer
题目: 数字翻转,即输入123,返回321:输入-123,返回-321. 代码: class Solution { public: int reverse(int x) { , sign = ; ) ...
- leetcode题解||Reverse Integer 问题
problem: Reverse digits of an integer. Example1: x = 123, return 321 Example2: x = -123, return -321 ...
- leetcode题解 7.Reverse Integer
题目: Given a 32-bit signed integer, reverse digits of an integer. Example 1: Input: 123 Output: 321 E ...
随机推荐
- markdown公式关系符
- Shell分析服务器日志命令
1.查看有多少个IP访问: awk '{print $1}' log_file|sort|uniq|wc -l 2.查看某一个页面被访问的次数: grep "/index.php" ...
- Android10.0系统启动之Launcher(桌面)启动流程-[Android取经之路]
Launcher的启动经过了三个阶段: 第一个阶段:SystemServer完成启动Launcher Activity的调用 第二个阶段:Zygote()进行Launcher进程的Fork操作 第三个 ...
- ssr屏幕空间射线追踪
本轮作业中,我们需要在一个光源为方向光,材质为漫反射 (Diffuse) 的场景 中,完成屏幕空间下的全局光照效果(两次反射). 为了在作业框架中实现上述效果,基于我们需要的信息不同我们会分三阶段 着 ...
- Vue3中的新的内置组件
在vue2中的内置组件: 动态路由中的 component :作用:动态显示路由的挂载点,使用 is 属性动态显示组件 : keep-alive :作用:使被包裹的组件保留状态,避免被重新渲染 : 路 ...
- 34.vue响应式
响应式就是 数据发生变化,ui界面自动更新内容 : vue响应式的实现是在 创建vue实例的时候,遍历data数据,通过 Object.defineProperty给每个数据添加 getter 和 s ...
- KubeSphere 社区双周报 | KubeSphere 3.4.0 已发布 | 2023.7.7-7.20
KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...
- RPC框架JMH测试-chatgpt自动生成
本文将介绍如何使用Java的JMH测试框架来测试RPC框架的性能.我们选择了Apache Dubbo作为目标RPC框架,Dubbo是一种高效的远程调用框架,它支持多种传输协议和序列化协议,并且具有很好 ...
- VS2019插件更新慢的解决办法
VS2019更新巨慢,可以尝试通过以下几个方法解决: 1. 关闭IPV6 关闭IPV6:Win10怎么样禁用IPV6 如何关闭IPV6协议-百度经验 (baidu.com) 2. 选择最快的DNS 百 ...
- vue axios的使用及操作
引入axios 并设置原型 Vue.prototype.$axios = axios; 在其他地方就可以this.$axios使用了 let param = _this.$qs.string ...