题目链接


题目大意:就是给你n个边长为1的正方形,要求用这些正方形拼成周长为m的图形,并输出这些正方形的坐标,如果没有输出No


首先如果这些正方形都零散分布那么周长就是4∗n4*n4∗n,如果将这些正方形都聚集在一起尽量拼成正(长)方形的周长最小2∗(l+r)2*(l+r)2∗(l+r):比如:7=3∗3,8=3∗3,9=3∗3,10=3∗4,11=3∗4(l和r要尽可能相进)7=3*3,8=3*3,9=3*3,10=3*4,11=3*4(l和r要尽可能相进)7=3∗3,8=3∗3,9=3∗3,10=3∗4,11=3∗4(l和r要尽可能相进)这里求错了一直wa


下面就是如何构造:我们知道假设所有的正方形都是零散的那么总周长是4*n,假如你将两个正方向合并成链状那么总周长会减少2,如过合并成矩形状就是在两个正方形相夹得对角地方总周长会减少4

我们假设有18个正方形那么最小的组合就是用黑色框起来部分那么我们先把涂黑部分的框先构造出来如果再往里面填正方形的时候就是减4了,如果想要减2就向下面角继续延申填就好了


#include <iostream>
#include <cstdio>
#include <stack>
#include <sstream>
#include <vector>
#include <map>
#include <cstring>
#include <deque>
#include <cmath>
#include <iomanip>
#include <queue>
#include <algorithm>
#include <set>
#define mid ((l + r) >> 1)
#define Lson rt << 1, l , mid
#define Rson rt << 1|1, mid + 1, r
#define ms(a,al) memset(a,al,sizeof(a))
#define log2(a) log(a)/log(2)
#define _for(i,a,b) for( int i = (a); i < (b); ++i)
#define _rep(i,a,b) for( int i = (a); i <= (b); ++i)
#define for_(i,a,b) for( int i = (a); i >= (b); -- i)
#define rep_(i,a,b) for( int i = (a); i > (b); -- i)
#define lowbit(x) ((-x) & x)
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define hash Hash
#define next Next
#define count Count
#define pb push_back
#define f first
#define s second
using namespace std;
const int N = 2e6+10, mod = 1e9 + 7;
const long double eps = 1e-5;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
typedef pair<double,double> PDD;
template<typename T> void read(T &x)
{x = 0;char ch = getchar();ll f = 1;while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();}while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f;
}
template<typename T, typename... Args> void read(T &first, Args& ... args)
{read(first);read(args...);
}PII  ans[55];
int main()
{int T;read(T);while(T --){int n, m;int cnt = 0;read(n,m);int l = 0, r = 0;while(r * r <= n) r ++;if((r - 1) * (r - 1) == n) r = r - 1, l = r;else if((r - 1) * r >= n) l = r - 1;else l = r;// cout << l <<" " << r << endl;if(m & 1 || m < (l + r) * 2 || m > 4 * n) puts("No");else{puts("Yes");int tmp = 4 * n - m;//tmp是你要减少的边数int x = 1, y = 1;//构造边缘:特判tmp==0的时候for(int k = 0, i = 1, j = 0; cnt < l + r - 1; ++ k){if(!tmp) break;if(k & 1) ans[cnt ++] = {(x + i),y}, i ++;else ans[cnt ++] = {y,(x + j)}, j ++;tmp -= 2 * (cnt > 1);}if(!tmp){for(int i = 0; i < cnt; ++ i)printf("%d %d\n",ans[i].f,ans[i].s);//剩下的按照对角的规律输出就好:这里输出的坐标不连续就好for(int i = cnt; i < n; ++ i)printf("%d %d\n",x  + n + i,y  + n + i);}else{while(tmp){int f = 0;  y ++;for(int i = 0; tmp >= 4; ++ i)//贪心的先往里面填-4{//控制填充的层数if(f % (r - 1) == 0 && f != 0) y ++, f = 0;ans[cnt ++] = {x + f + 1,y};f ++;tmp -= 4;}if(tmp)//最多填一次减2{ans[cnt ++] = {r + 1,1};tmp -= 2;}}for(int i = 0; i < cnt; ++ i)printf("%d %d\n",ans[i].f,ans[i].s);for(int i = cnt; i < n; ++ i)printf("%d %d\n",x + n  + i,y + n  + i);}}}return 0;
}

2020牛客多校第3场:[Points Construction Problem + 思维题+构造]相关推荐

  1. 2020牛客多校暑期训练营(赛后总结和补题)

    https://ac.nowcoder.com/acm/contest/5668/B AC代码: #include <iostream> using namespace std; int ...

  2. 2020牛客多校第1场H-Minimum-cost Flow

    解题思路: 首先我们要从费用流mcmf的算法入手:因为它每次增广是再费用增广路上跑的,根据贪心的思想费用小的路基本上能运多少就尽量运多少,所以我们可以假设初始的边容量是1,只跑一遍mcmf.记录一下每 ...

  3. 数论分块 ---- 2020牛客多校第7场H-Dividing[思维+数论分块]

    题目大意: 解题思路:很明显满足条件的点是n%k==0∣∣n%k==1n\%k==0||n\%k==1n%k==0∣∣n%k==1 1.因为nnn是从111开始的如果一直乘以k[n=n∗k]k[n=n ...

  4. 2020牛客多校第7场C-A National Pandemic[树链剖分+思维]

    题目大意 1.首先我们看一下操作1:实际上可以说成在所有位置上加上w−dist(x,y)w-dist(x,y)w−dist(x,y),因为dist(x,x)=0dist(x,x)=0dist(x,x) ...

  5. 2020牛客多校第5场B-Graph完全图异或最小生成树

    因为这里边是可以任意加的但是要保证联通性所有这里可以看成一个完全图,每条边的权值=a[u]^a[v] 1.那么我们可以将每个点的权值sort一遍,将每个a[i],从高位到低位,按照最高位的1出现的顺序 ...

  6. 2020牛客多校第3场:Two Matchings[找规律+dp]

    题目链接 解题思路:这题规律......无语: #include <iostream> #include <cstdio> #include <stack> #in ...

  7. 2020牛客多校第三场[C Operation Love+基础计算几何 判断多边形顺逆时针]

    题目链接 题目大意:就是给你两个左右手的模型,下面给出这两只手通过平移变换之后坐标问你这只手是左手还是右手?[题目保证坐标是按照顺时针或者逆时针给出的] 解题思路:首先我们先观察一下这只右手:假如数据 ...

  8. 贪心 ---- 2020牛客多校第3场[Clam and Fish+贪心]

    题目链接 解题思路:1.根据贪心的思想肯定是如果是第2或者第3种状态肯定是钓鱼且不需要鱼饵的,如果是在第0种状态有鱼饵肯定也钓鱼,对于第1种状态就是可以钓鱼也可以造鱼饵的状态我们如何考虑 2.我们从后 ...

  9. exgcd ---- 2020牛客多校第三场:[Fraction Construction Problem:exgcd+思维题]

    题目链接 题目大意:就是给你两个数a,ba,ba,b叫你求满足下面三个条件的c,d,e,fc,d,e,fc,d,e,f 1.cd−ef=ab1.{c\over d}-{e\over f}={a\ove ...

最新文章

  1. mark一个subList的坑
  2. linux查看终端进程,Linux查看进程
  3. 分享:RethinkDB 1.3 发布,分布式 JSON 数据库
  4. boost::gregorian模块实现测试时钟的测试程序
  5. 更改Android Studio中AVD的默认路径
  6. Npgsql 6.0.2 发布,赶紧升级!!!
  7. Spring事务管理示例JDBC
  8. 《BackTrack 5 Cookbook中文版——渗透测试实用技巧荟萃》—第1章1.3节安装BackTrack到USB驱动器...
  9. 怎么解决TortoiseGit每次Pull或者Push都需要输用户名密码的问题
  10. mysql group by 聚合_浅析MySQL使用 GROUP BY 分组聚合与细分聚合
  11. LeetCode 655. Print Binary Tree (C++)
  12. express服务器多次访问数据库实例
  13. IDEA新特性真牛逼:提前知道代码怎么走!
  14. 关于nagios 邮件报警问题
  15. WebSql用法(自我记录)
  16. kindeditor 文件上传 java_富文本编辑器kindeditor上传图片的配置方法
  17. 功率曲线k值_一种基于DTW的改进K-means的日负荷曲线聚类方法技术
  18. 如何拯救无法「深度学习」的制造业,2019工业智能灵魂10问
  19. 初学者如何选入门第一把吉他,这几个防坑避雷小技巧你一定要知道!
  20. python读文件夹图片,做数据集

热门文章

  1. 网络工程师_记录的一些真题_2008下半年上午
  2. HyperPocket:生成点云网络
  3. 链表问题13——删除无序单链表中值重复出现的节点
  4. 【从蛋壳到满天飞】JS 数据结构解析和算法实现-AVL树(一)
  5. Elastic Search 介绍和基本概念
  6. CentOS yum源的配置与使用
  7. “笨方法”学习Python笔记(2)-VS Code作为文本编辑器以及配置Python调试环境
  8. Python——eventlet.websocket
  9. 命令行运行hadoop实例wordcount程序
  10. Oracle事务处理—隔离级别