zoukankan      html  css  js  c++  java
  • [CF1521E] Nastia and a Beautiful Matrix

    前言

    莫名其妙洛谷rk1,CF rk2。(指运行时间)

    于是水博客

    题目

    CF

    洛谷

    讲解

    有一个贪心策略很好想,如果确定了矩阵边长 (n),我们一定会让坐标为 ((2k_1,2k_2),k_1,k_2in N^+) 的格子空出来。

    然后我们考虑将剩下的格子进行分类,建议画图理解(由于太懒就不上传图了)。其实就是图太丑。

    对于坐标为 ((1+2k_1,1+2k_2),k_1,k_2in N) 的格子,我们显然可以随便填,定义其为颜色3。

    而剩下的格子可以二染色,定义其为颜色1,2。

    我们可以将数字数量按从小到大排序,方格按颜色1,3,2或2,3,1排序,然后填就可以了。

    至于 (n),需要满足两个条件:

    • (ncdot n) 的矩阵可以包含 (m) 个数。
    • 没有数字的数量超过颜色1与颜色2格子数的和。

    时间复杂度 (O(sum klog_2k))

    当然,如果你优化排序方式,也可以做到 (O(sum m)) 级别。

    代码

    struct node
    {
    	int a,ID;
    	bool operator < (const node &px)const{
    		return a > px.a;
    	}
    }s[MAXN];
    
    int main()
    {
    //	freopen(".in","r",stdin);
    //	freopen(".out","w",stdout);
    	for(int T = Read(); T ;-- T)
    	{
    		MAX = n = 0; m = Read(); k = Read();
    		while(n * n - (n>>1) * (n>>1) < m) n++;
    		for(int i = 1;i <= k;++ i) s[i].a = Read(),MAX = Max(MAX,s[i].a),s[i].ID = i;
    		sort(s+1,s+k+1);
    		while(((n+1)>>1) * ((n+1)>>1) + (n>>1) * ((n+1)>>1) < MAX) n++;
    		for(int i = 1;i <= n;++ i)
    			for(int j = 1;j <= n;++ j)
    				ans[i][j] = 0;
    		int now = 1;
    		for(int i = 2;i <= n && now <= k;i += 2)//二染色之一种格子
    			for(int j = 1;j <= n && now <= k;j += 2)
    			{
    				ans[i][j] = s[now].ID; s[now].a--;
    				while(!s[now].a && now <= k) now++;
    			}
    		for(int i = 1;i <= n && now <= k;i += 2)//随便填
    			for(int j = 1;j <= n && now <= k;j += 2)
    			{
    				ans[i][j] = s[now].ID; s[now].a--;
    				while(!s[now].a && now <= k) now++;
    			}
    		for(int i = 1;i <= n && now <= k;i += 2)//二染色另外一种格子
    			for(int j = 2;j <= n && now <= k;j += 2)
    			{
    				ans[i][j] = s[now].ID; s[now].a--;
    				while(!s[now].a && now <= k) now++;
    			}
    		Put(n,'
    ');
    		for(int i = 1;i <= n;++ i,putchar('
    '))
    			for(int j = 1;j <= n;++ j)
    				Put(ans[i][j],' ');
    	}
    	return 0;
    }
    
  • 相关阅读:
    LeetCode偶尔一题 —— 617. 合并二叉树
    《剑指offer》 —— 链表中倒数第k个节点
    《剑指offer》 —— 青蛙跳台阶问题
    《剑指offer》—— 二维数组中的查找
    《剑指offer》—— 替换空格
    《剑指offer》—— 合并两个排序的链表
    《剑指offer》—— 礼物的最大价值
    生成Nuget 源代码包来重用你的Asp.net MVC代码
    Pro ASP.Net Core MVC 6th 第四章
    Pro ASP.NET Core MVC 6th 第三章
  • 原文地址:https://www.cnblogs.com/PPLPPL/p/14757744.html
Copyright © 2011-2022 走看看