首页 > 其他分享 >云斗 E. 开上我心爱的新能源车

云斗 E. 开上我心爱的新能源车

时间:2024-11-28 21:22:44浏览次数:8  
标签:ch 云斗 开上 int flag 心爱 include 单调

芙芙的超级矩阵蛋糕 - 云斗补题域 - 题目详情 - 云斗学院 (yundouxueyuan.com)

给出一种思路。我觉得T2贪心就可以吧,完了T1反悔贪就可以。
T2:首先对于一行来说,在忽略0的情况下,如果他是单调不降的,那么这一行就一定可以变成单调不降的(因为单调不降,0可以直接等于其两边的值)。同理如果在忽略下不行,那就一定不行。因为尽量选A,所以行能变,就变。

对于能变A行里的0,因为要保证单调,所以它的范围就是左右两个非0值。而对于不能变A的行的0,就把范围扩到 1~INF,好给后面凑列。

先扫一遍行确定单调。再扫一遍给对应0加上范围即可。

对于列,如果一个列里面有两个不同常数,那么一定统计不了。对于可能能统计的情况,如果是常数列(无0,全相同),直接统计入 B;

如果是全0列,设 \(l = 0,r = inf\),用这一列的 0 的范围去缩小 \(l,r\) 范围,如果可以使 l > r 说明没法得到一个共同的数,形成常数列。

如果是含0也含同一个常数。看看常数是否在每个0范围之内即可。

注意,0的范围是已经保证了A最大了。只要在这个范围内得到的最大的B就是答案。

这题就是调起来麻烦。像个模拟。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <map>
#include <unordered_map>
#include <vector>
#include <chrono>

#define x first
#define y second

using namespace std;

typedef pair<int, int> PII;

const int N = 100010, M = 1000010, INF = 0x3f3f3f3f;

int n, m;
unordered_map<int, unordered_map<int, int>> id;

vector<PII> e[N];
vector<int> res, g[N];


int st_h[N], st_l[N];
int cnt1, cnt2, cnt;
int lss[M], rss[M];

int read()
{
    int x = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9') 
    {
       if (ch == '-') f = -1;
       ch = getchar();
    }
    while (ch >= '0' && ch <= '9')   
        x = 10 * x + ch - '0', ch = getchar();
   return x * f;
}

int main()
{
//   	freopen("2.in", "r", stdin);
//   	freopen("2.ans", "w", stdout);
    cin >> n >> m;
    
    for (int i = 1; i <= n; i ++ )
    {
        bool flag = 0;
        int last = 0;
        g[i].push_back(1);
        for (int j = 1; j <= m; j ++ )
        {
            g[i].push_back(read());
            id[i][j] = ++ cnt;
            if (g[i][j] && g[i][j] < last) flag = 1;
            last = max(g[i][j], last);
        }
        if (flag == 0) 
        {
            cnt1 ++ ;
            st_h[i] = true;
        }
        int lasts = 0;
        for (int j = 1; j <= m; j ++ )
        {
        	if (g[i][j]) lasts = g[i][j];
        	else lss[id[i][j]] = lasts;
    			if (g[i][j]) lasts = g[i][j];
    			else rss[id[i][j]] = lasts;
        }
        lasts = INF;
        for (int j = m; j; j -- )
        {
    		if (g[i][j]) lasts = g[i][j];
    		else rss[id[i][j]] = lasts;
        }
    }
    
    for (int j = 1; j <= m; j ++ )
    {
        bool flag = 0, flag2 = 0;
        int last = 0, ls = g[1][j];
        
        for (int i = 1; i <= n; i ++ )
        {
            if (g[i][j] == 0) 
            {
                if (st_h[i]) e[j].push_back({lss[id[i][j]], rss[id[i][j]]});
                else e[j].push_back({0, INF}); 
            }
            else 
            {
                if (last == 0) last = g[i][j];
                if (last != g[i][j]) flag = 1;
            }
            
            if (ls != g[i][j] || g[i][j] == 0) flag2 = true;
        }
        //
        if (flag2 == 0) cnt2 ++ ;
        else if (flag == 0)
        {
            if (last) 
            {
                st_l[j] = 1; // 有限制
                // cout << j << ' ' << last << endl;
                e[j].push_back({-INF, last});
            }
            res.push_back(j);
        }
    }
    
    for (int i : res)
    {
        auto res = e[i];
        
        sort(res.begin(), res.end());
        
        if (st_l[i]) // 有常限制
        {
            bool flag = true;
            int k = res[0].y;
            int len = res.size();
//            cout << k << endl;
            for (int i = 1; i < len; i ++ )
            {
                // cout << res[i].x << ' ' << res[i].y << endl;
                if (res[i].x > k) flag = false;
                if (res[i].y < k) flag = false;
            }
            if (flag) cnt2 ++ ;
        }
        else // 无限制
        {
            int l = 0, r = INF;
            bool flag = true;
            for (auto i : res)
            {
                l = max(l, i.x);
                r = min(r, i.y);
                if (r < l) flag = false;
            }
            if (flag) cnt2 ++ ;
        }
    }
    
    cout << cnt1 << ' ' << cnt2 << endl;
    
    return 0;
}

/*
4 3 
3 0 0
1 0 2
2 1 0
1 0 2

3 0
*/

标签:ch,云斗,开上,int,flag,心爱,include,单调
From: https://www.cnblogs.com/blind5883/p/18575212

相关文章

  • 昱合昇|PGC1圆拱型(侧开上悬窗)天窗
    PGC1圆拱型(侧开上悬窗)天窗是新国标参考图集21J621-1《天窗》中比较典型的一款通风排烟设备,圆拱型的外观设计,视觉上更为美观、大方、整洁,在通风排烟效果上,因其大喉口的设计,排烟量更大,效果更好。一、设计要点PGC1圆拱型(侧开上悬窗)天窗选用拱形设计,整体线条流畅,造型优美,可以与建......
  • Intellij IDEA 默认打开上次项目设置
    场景默认情况下,每次打开IntellijIDEA,都会连带着打开上次打开的项目。如果不希望它每次打开时都连带的打开上次的项目,可通过“系统设置”进行配置。配置方法如下图所示,找到Intellij配置中的SystemSettings,右边的Reopenlastprojectonstartup,默认为勾选状态,即每次打开IDE时......
  • 如何打开上古时期的“百度”页面
    无意之中解锁了百度的上古页面: 链接:https://www.baidu.com/default.html百度一下,你就知道(baidu.com)  ==========================================   可以说看到了这个页面就想到了20年前的百度,这个页面可以说百度的上古页面或者说是始祖页面了,现在的百度页面......
  • 云斗杯 T2 派蒙是最好的伙伴! 题解
    云斗杯T2题解赛时脑抽了只打了60pts暴力xwx。题目描述给定两个长度为\(n\)的\(01\)序列\({a_n}\)和\({b_n}\),与另一个矩阵\({c_{n,n}}\)。矩阵\({c_{n,n}}\)的生成规则如下:\[c_{i,j}=a_i\timesb_j\]现给定一个数\(k\),求在矩阵\(c_{n,n}\)内,有多少个......
  • [YDRG#001] 提瓦特环游记 · 云斗杯 · 七月 Golden 组模拟赛 整理分析--zhengjun
    link总体评价:因为K了,所以好评,练一下思维蛮好的,质量不错比赛2.5hK的。#A.诗人小G初进OI界标准送分,输出\(\frac{s_2-a_2}{a_1}\)。#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;constintN=1e6+10;intn,a[N];voidread(ll&x){ char......
  • MTK9669打开上电开机进待机的IR唤醒功能
    此patch不是新加一个遥控类型。而是用公版遥控的键值替换成自家的遥控键值。 index9d0967f72cd..3bc93b84d5c100755---a/Domestic_3M_20201106/bootable/bootloader/mboot-mtk/mboot/MstarCore/src/api/msAPI_Power.c+++b/Domestic_3M_20201106/bootable/bootloader/mboot-......
  • ##windows代码教你如何表白心爱的女神
    第一步制作表白弹窗:1、先创建1个弹窗文档:点击鼠标右键,新建一个文本文档2、输入下面这串代码注意:代码可以无限延展,想说几句话就可以复制几行代码~3、打开文件-->另存为,将......
  • Python编程写的圣诞树|一共六款|快拿去送给心爱的人吧
    先上图:上代码:定义背景t=turtle.Turtle()#定义速度#t.speed("fastest")#定义背景颜色screensize(bg='black')t.left(90)t.forward(3*n)#定义最上端星星......
  • 【前端特效】程序员给你的专属告白,快来转发给你心爱的那个她吧!
    【前端特效】程序员给你的专属告白,快来转发给你心爱的那个她吧!点击打开视频讲解更加详细<template><divclass="content"><imgsrc="../assets/live.gif"alt="......