牛客暑假多校第二场 K carpet

牛客暑假多校第二场 K carpet

题意:给你一个n*m的矩阵 ,每个位置都有一个字符并且都有一个值,现在需要找到一个p*q的子矩阵, 原来的矩阵可以由现在这个矩阵无限复制然后截取其中的一部分得到,并且要求 子矩阵里最大的值 * (p+1)*(q+1)的值最小。

题解:对于每一行处理出可能的循环节长度, 然后找到一个长度是所有行的循环节, 对于列同样处理。然后问题就变成了对n*m所有的p*q的子矩阵的找到最小的最大值。这个操作用单调队列维护。

代码:

牛客暑假多校第二场 K carpet
牛客暑假多校第二场 K carpet

 1 #include<bits/stdc++.h>  2 using namespace std;  3 #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);  4 #define LL long long  5 #define ULL unsigned LL  6 #define fi first  7 #define se second  8 #define pb push_back  9 #define lson l,m,rt<<1  10 #define rson m+1,r,rt<<1|1  11 #define max3(a,b,c) max(a,max(b,c))  12 #define min3(a,b,c) min(a,min(b,c))  13 typedef pair<int,int> pll;  14 const int inf = 0x3f3f3f3f;  15 const LL INF = 0x3f3f3f3f3f3f3f3f;  16 const LL mod = (int)1e9+7;  17 const int N = 1e6 + 100;  18 string s, ss;  19 int val[N];  20 int nx[N];  21 int n, m;  22 inline int id(int x, int y){  23 return m * x + y;  24 }  25 int cnt[N];  26 void get_nt(int u){  27 nx[0] = -1;  28 int j = 0, k = -1;  29 while(j < m){  30 if(k == -1 || s[id(u,j)] == s[id(u,k)]) nx[++j] = ++k;  31 else k = nx[k];  32  }  33 int pos = m;  34 while(pos != -1){  35 cnt[m-pos]++;  36 pos = nx[pos];  37  }  38 }  39 void get_nt_(int u){  40 nx[0] = -1;  41 int j = 0, k = -1;  42 while(j < n){  43 if(k == -1 || s[id(j,u)] == s[id(k,u)]) nx[++j] = ++k;  44 else k = nx[k];  45  }  46 int pos = n;  47 while(pos != -1){  48 cnt[n-pos]++;  49 pos = nx[pos];  50  }  51 }  52 int a[N];  53 LL mx[N];  54 int main(){  55 scanf("%d%d", &n, &m);  56 for(int i = 1; i <= n; i++){  57 cin >> ss;  58 s += ss;  59  }  60 for(int i = 0; i < n*m; i++)  61 scanf("%d", &val[i]);  62 int p = 1, q = 1;  63 memset(cnt, 0, sizeof(cnt));  64 for(int i = 0; i < n; i++) get_nt(i);  65 for(int i = 1; i <= m; i++){  66 if(cnt[i] == n) {  67 p = i;  68 break;  69  }  70  }  71 memset(cnt, 0, sizeof(cnt));  72 for(int i = 0; i < m; i++) get_nt_(i);  73 for(int i = 1; i <= n; i++){  74 if(cnt[i] == m) {  75 q = i;  76 break;  77  }  78  }  79 /// q*p  80 for(int i = 0; i < n; i++){  81 int l = 0 , r = -1;  82 for(int j = 0; j < m; j++){  83 while(r >= l && val[id(i,a[r])] <= val[id(i,j)]) r--;  84 a[++r] = j;  85 while(r >= l && a[l] <= j-p) l++;  86 mx[id(i,j)] = val[id(i,a[l])];  87  }  88  }  89 LL ans = INF;  90 for(int j = p-1; j < m; j++){  91 int l = 0 , r = -1;  92 for(int i = 0; i < n; i++){  93 while(r >= l && mx[id(a[r],j)] <= mx[id(i,j)]) r--;  94 a[++r] = i;  95 while(r >= l && a[l] <= i-q) l++;  96 if(i >= q-1) ans = min(ans, mx[id(a[l],j)]);  97  }  98  }  99 printf("%lld\n",1ll*ans*(p+1)*(q+1)); 100 return 0; 101 }

View Code

 

转载于:https://www.cnblogs.com/MingSD/p/9360604.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/101527.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • ajax怎么整理,ajax请求的五个步骤是什么?五个步骤整理

    ajax怎么整理,ajax请求的五个步骤是什么?五个步骤整理每掌握一个技术,自然要了解该技术是什么?该技术的塬理又是什么?这样我们才能更深刻的掌握改技术。今天所描述的是ajax请求的五个步骤,希望能让大家对ajax有个更深入的记忆网图在脑海中。首先,我们来回顾下ajax是什么?Ajax=异步JavaScript和XML。Ajax是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不重新…

  • sqlserver2000数据库置疑_sql2008数据库置疑

    sqlserver2000数据库置疑_sql2008数据库置疑解决由于sql2000日志文件引起的“置疑”。日志有错误——–重新附加提示日志有错误。日志文件丢失—–丢失了.ldf文件,只有.mdf文件的数据库重建。 步骤:一、备份“置疑”数据库的数据文件,因为日志文件.ldf出错,可以只备份.mdf文件。 二、打开企业管理器(SQL Server Enterprise Manager),删除“置疑”数据库,如果提示删除错误,可以重启数据库服务…

  • Win10自动更新永久关闭,有效的Win10强制更新关闭方法,禁止windows10自动更新,禁止update medic service ,win10显示更新并关机没有单独的关机按钮[通俗易懂]

    Win10自动更新永久关闭,有效的Win10强制更新关闭方法,禁止windows10自动更新,禁止update medic service ,win10显示更新并关机没有单独的关机按钮[通俗易懂]禁用update服务,光这个不行,下边还有windowsupdatemedicservice禁止流程鼠标右键此电脑–>管理–>服务和应用程序–>服务–>windowsupdate–>选择禁用,如果该服务已经启动,记得点击停止,然后点击右下角的应用再确定,确定,就禁止了update服务,但是这个貌似有时候就又启动了,再往下看禁用windowsup…

  • ajax长轮询 spring mvc,springmvc ajax 长轮询

    ajax长轮询 spring mvc,springmvc ajax 长轮询前台代码:$(function(){functionpoll(){varparam={“searchType”:”1″,”key”:”0100008″,”timestamp”:”1409382910″,”sign”:”123″};$.ajax({type:”POST”,contentType:”application/json;charset=utf-8″,url:”xxxx”,da…

    2022年10月10日
  • 酒店管理系统源码_客户管理系统源码

    酒店管理系统源码_客户管理系统源码(1)资源完全开放型:系统所有的资源,功能交由用户管理,权限控制到按钮,针对不同的用户,组装不同的界面,分配不同的使用功能.不放心再加权限到按钮。(2)系统突出以营销、预订、房源、房价等对营销具有影响力的信息处理。房价码可按年,季,月,周,日设定。(3)强化以客源为中心的信息完整性、长久性、可操作性。建立了客档为中心的用户信息管理系统。(4)使用数据穿透查询技术,对数据进行多元,多层次的查询.从汇中数据到明细发生,紧密联系在一起,灵活实用。(5)客档、角色、佣金、房价方案、授权折扣、操作权

  • hvie hbase各自的使用场景

    hvie hbase各自的使用场景hvie hbase各自的使用场景

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号