首页 > 其他分享 >Table Compression(思维)

Table Compression(思维)

时间:2024-02-27 19:11:56浏览次数:22  
标签:思维 Compression temp int 拓扑 元素 long Table define

Table Compression(思维)

题目链接

Problem - C - Codeforces

题目简述

给定一N*M的表格a,让你对其进行压缩,使得:

  • 每一行与每一列相对大小不变,即若\(a_{i,j}>a_{i,k}\),则压缩后的\(a'_{i,j}>a'_{i,k}\),对于小于及等于的情况和同列不同行的情况同理。
  • 压缩后表格中的最大值尽量小。

输出压缩后的表格。

数据范围

  • \(1<=n,m\)且\(n*m<=1000000\)(即\(1e6\))
  • \(a_{i,j}<=1e9\)

解题思路

思维题。首先贪心地把那个在自己所在行所在列最小的元素设为1,然后再去处理比他大1的那些元素。沿着这个思路,我们会发现这整就一个拓扑排序,一个元素可以进入拓扑排序的队列序列,当且仅当所在行所在列比自己小的元素均已经参加了拓扑排序。于是我们的每个元素都建单项边连向同行同列比自己大一点的那个元素,然后跑拓扑就完事了。还有一点是如何处理相等的元素呢?我们进行预处理,用并查集将同行同列相等的元素维护在一起。这些元素在最终的结果中的值一定相等,这是很显然的。

代码实现

#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
#include <iomanip>
#define fi first
#define se second
#define lowbit(x) (x&(-x))
#define ll long long
#define int long long
using namespace std;
typedef __int128 Int;
typedef pair<int,int> pii;
//const int mod=1e9+7;
const int mod=998244353;
void solve(){
    int n,m;cin>>n>>m;
    vector<vector<int>>a(n+1,vector<int>(m+1));
    for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>a[i][j];
    function<pii(int)>get=[&](int x){
        pii temp;temp.fi=(x-1)/m;temp.se=x-temp.fi*m;
        return temp;
    };
    function<int(int,int)>hash=[&](int a,int b){
        return (a-1)*m+b;
    };
    vector<int>p(n*m+1);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            p[hash(i,j)]=hash(i,j);
    function<int(int)>find=[&](int x){
        if(p[x]!=x)p[x]=find(p[x]);
        return p[x];
    };
    vector<vector<int>>e(n*m+1);
    vector<int>cnt(n*m+1+m);
    for(int i=1;i<=n;i++){
        vector<pii>temp;
        for(int j=1;j<=m;j++){
            temp.emplace_back(a[i][j],hash(i,j));
        }
        sort(temp.begin(),temp.end());
        for(int j=1;j<m;j++){
            if(temp[j].fi==temp[j-1].fi){
                if(find(temp[j].se)!=find(temp[j-1].se))
                p[p[temp[j].se]]=p[temp[j-1].se];
            }
        }
    }
    for(int i=1;i<=m;i++){
        vector<pii>temp;
        for(int j=1;j<=n;j++){
            temp.emplace_back(a[j][i],hash(j,i));
        }
        sort(temp.begin(),temp.end());
        for(int j=1;j<n;j++){
            if(temp[j].fi==temp[j-1].fi){
                if(find(temp[j].se)!=find(temp[j-1].se))
                p[p[temp[j].se]]=p[temp[j-1].se];
            }
        }
    }
    for(int i=1;i<=n;i++){
        vector<pii>temp;
        for(int j=1;j<=m;j++){
            temp.emplace_back(a[i][j],hash(i,j));
        }
        sort(temp.begin(),temp.end());
        e[0].push_back(find(temp[0].se));
        cnt[p[temp[0].se]]++;
        for(int j=1;j<m;j++){
            if(temp[j].fi!=temp[j-1].fi){
                e[find(temp[j-1].se)].push_back(find(temp[j].se));
                cnt[p[temp[j].se]]++;
            }
        }
    }
    for(int i=1;i<=m;i++){
        vector<pii>temp;
        for(int j=1;j<=n;j++){
            temp.emplace_back(a[j][i],hash(j,i));
        }
        sort(temp.begin(),temp.end());
        for(int j=1;j<n;j++){
            if(temp[j].fi!=temp[j-1].fi){
                e[find(temp[j-1].se)].push_back(find(temp[j].se));
                cnt[p[temp[j].se]]++;
            }
        }
    }
    vector<int>ans(n*m+1);
    stack<int>t;t.push(0);
    while(!t.empty()){
        int temp=t.top();t.pop();
        for(auto i:e[temp]){
            ans[i]=max(ans[i],ans[temp]+1);
            cnt[i]--;
            if(cnt[i]==0){
                t.push(i);
            }
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cout<<ans[find(hash(i,j))]<<" ";
        }
        cout<<"\n";
    }
}
signed main(){
    std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);
    //srand((unsigned)time(NULL));
    //int t;std::cin>>t;while(t--)
    solve();
}

标签:思维,Compression,temp,int,拓扑,元素,long,Table,define
From: https://www.cnblogs.com/shi5/p/18037604

相关文章

  • el-table分页时实现切换分页多选选中效果并且编辑回显默认选中
    <el-tableref="table":data="tableData"borderheight="100%":row-key="getRowKeys"@selection-change="handleSelectionChange"></el-table>关键代码:1::row-key="getRowKeys&quo......
  • 平面向量|思维导图
    前言使用方法:如果想得到更好的显示效果,可以点击全屏按钮,已经实现电脑端、手机端的适配,效果很好;电视端没有实现适配,Ipad端的适配没有测试;思维导图全屏......
  • 关于Hash Table
    >>哈希表的应用哈希表是一种非常通用且灵活的数据结构,因此在计算机科学和软件工程中有许多应用。以下是哈希表的一些主要应用:1.字典和集合:哈希表常用于实现字典和集合等数据结构。在这些数据结构中,键-值对被存储在哈希表中,可以快速地进行查找、插入和删除操作。2.数据库索引:......
  • react ProTable树默认只展示第一层和第二层
    要在AntDesignPro中的ProTable组件中默认展开第一层和第二层,您可以使用expandable的defaultExpandAllRows选项结合expandedRowKeys来实现。以下是一个示例代码,演示如何在AntDesignPro中的ProTable组件中默认展示第一层和第二层:import{ProTable}from'@an......
  • antd proTable 默认展开所有层
    antdproTable默认展开所有层expandable={{defaultExpandAllRows:true}}importReactfrom'react';import{ProTable}from'@ant-design/pro-table';constcolumns=[{title:'Name',dataIndex:'name',ke......
  • 并查集+建图 同样是逆向思维 和星球大战类似
    L2-013红色警报分数25作者 陈越单位 浙江大学战争中保持各个城市间的连通性非常重要。本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报。注意:若该国本来就不完全连通,是分裂的k个区域,而失去一个城市并不改......
  • LightDB-X 24.1 支持 Oracle DBMS_STATS.GATHER_TABLE_STATS 存储过程
    LightDB-X24.1支持OracleDBMS_STATS.GATHER_TABLE_STATS存储过程背景LightDB-X一直在不断提升对Oralce的兼容性,降低基于Oracle的业务系统迁移到LightDB-X的门槛。在24.1版本中支持了Oracle的DBMS_STATS.GATHER_TABLE_STATS存储过程,提高了对Oracle管理功能......
  • Lua学习笔记之迭代器、table、模块和包、元表和协程
    迭代器迭代器是一种对象,它能够来遍历标准库模板容器中的部分或全部元素,每个迭代器对象代表容器中确定的地址,在Lua中迭代器是一种支持指针类型的结构,他可以遍历集合的每一个元素。泛型for迭代器泛型for自己内部保存迭代函数,实际上保存三个值:迭代函数、状态常量、控制变量。泛型......
  • mysql access denied for root ... mysqld –skip-grant-tables 命令失效 ... Failed
    <!--密码突然登录不上MySQL了,久了也不晓得是不是密码不正确...只能改密码...一年难得碰一次,感觉每次总有莫名其妙的问题--><!--修改方案只找到一个,就是无密码验证开启mysql服务,然后登录,设置新密码--><!--mysql版本不同有些命令无效,大概分高低两版本--><!--低版命令我......
  • 全能代码生成器,自动生成前后端代码、生成项目框架、生成JavaBean、生成数据库文档、自
    TableGo_20240224v8.4.0正式版发布,此次版本累计更新如下: 1、TableGo专属LOGO上线 2、生成数据库文档ER图新增备注+字段名的生成配置 3、生成自定义文件功能新增临时参数配置,用于使用临时数据生成自定义文件 4、新增基于Excel数据生成自定义文件,可导入Excel数据生成程序代码......