暴兵的卿学姐

题目连接:

http://acm.uestc.edu.cn/#/problem/show/1281

Description

沈宝宝又和卿学姐开始玩SC2了!

自从沈宝宝学会新的阵型后,就把卿学姐干的不要不要的,每次都把卿学姐按在地上摩擦。

卿学姐是我们的学姐啊,不能就这样认怂啊。

然后卿学姐就开始研究新的阵型(虽然没有什么卵用,咸鱼终究是咸鱼

这个阵型必须是正方形,必须包含卿学姐所有的兵种(1到n),每个学姐的每种兵也都必须排成正方形。

比如当n=8的时候,一个可行的解是像下面那种矩阵

1 1 1 3 3

1 1 1 3 3

1 1 1 2 4

5 5 7 6 6

5 5 8 6 6

我们可以认为1代表枪兵,2代表运输机,3代表坦克,4代表光头,5代表雷神,6代表味精,7代表SCV,8代表战列舰。

卿学姐的每种兵都排成了正方形,并且整个组成了一个正方形。

按照CodeForces的说法,卿学姐有可能没带电脑,或者不擅长数学,或者在忙别的事情,总之这个问题交到了你的手上。

只要你教会了卿学姐这个阵型,那么卿学姐就会化身暴兵狂魔,一雪前耻!

你需要构造一个可行的解,或者判断无解。由于星际2有人口限制,所以最后的矩阵的边长不能超过1000。

Input

输入一个整数1<=n<=200000

Output

输出一行字符串,如果是能够构造出来,那么输出"Possible",否则输出"Impossible"

如果是可以构造的,输出一个整数K,表示矩阵的边长

接下来K行K列,输出这个矩阵

如果有多解,输出任意解就好~

Sample Input

8

Sample Output

Possible

5

1 1 1 3 3

1 1 1 3 3

1 1 1 2 4

5 5 7 6 6

5 5 8 6 6

Hint

题意

题解:

题意:你需要构造一个m*m的正方形,使得里面恰好有n个正方形。m需要<=1000,n<=200000。

题解:

这道题怎么做呢?

首先我们假设没有m<=1000这个条件。

那么显然除了2的所有偶数n,我们都可以由1+(n-1)组成。

比如 6:

1 1 2

1 1 3

4 5 6

比如8:

1 1 1 2

1 1 1 3

1 1 1 4

5 6 7 8

比如10

1 1 1 1 2

1 1 1 1 3

1 1 1 1 4

1 1 1 1 5

6 7 8 9 10

然后我们又可以发现一个特质,我们组成一个正方形之后,我们只要再加三个和这个一模一样的正方形就好了,所有2n+3都能组成了~。

然后除了2,3,5以外的所有都能构造了~

然后这道题就完了。

但是,现在有一个条件,就是m需要小于等于1000,数据范围极限是200000。

我们可以简单思考一下,1000*1000 = 1000000,数据极限范围是200000。

那么你构造的每个正方形的平均边长小于sqrt(5)就能解决这道题啦。

在这里我推荐陈鑫的做法:

这个大正方形内,只需要有边长为2和边长为3的正方形。

那么假设我有num2个边长为2的正方形,num3个边长为3的正方形,而剩下的全都是边长为1的正方形。

那么边长为1的正方形的数量为m*m-num2*4-num3*9。

显然m*m-​num2*4-num3*9==n-num2-num3就好了。

化简m*m - num2*3-num3*8 = n。

这个方程,肯定num2越多越好。

然后贪心的去摆这些正方形就好了,然后就结束了。

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 1050;
  4. int g[maxn][maxn];
  5. int cnt=1;
  6. int main()
  7. {
  8. int n;
  9. scanf("%d",&n);
  10. if(n==2||n==5||n==3)return puts("Impossible"),0;
  11. int m = sqrt(n);
  12. if(m*m==n)
  13. {
  14. printf("Possible\n%d\n",m);
  15. for(int i=1;i<=m;i++,cout<<endl)
  16. for(int j=1;j<=m;j++)
  17. printf("%d ",cnt++);
  18. return 0;
  19. }
  20. m--;
  21. while(m++)
  22. {
  23. int t = m*m-n;
  24. int num2 = t/3;
  25. int num3 = 0;
  26. if(t%3==0)num3=0;
  27. else if(t%3==1)num3=2,num2-=5;
  28. else num3=1,num2-=2;
  29. if(num2<0)continue;
  30. if(m*m-num2*3-num3*8!=n)continue;
  31. memset(g,0,sizeof(g));
  32. cnt=1;
  33. for(int i=1;i<=m-2&&num3>0;i++)
  34. {
  35. for(int j=1;j<=m-2&&num3>0;j++)
  36. {
  37. int flag = 0;
  38. for(int i1=0;i1<3;i1++)
  39. for(int j1=0;j1<3;j1++)
  40. if(g[i+i1][j+j1])flag=1;
  41. if(flag)continue;
  42. for(int i1=0;i1<3;i1++)
  43. for(int j1=0;j1<3;j1++)
  44. g[i+i1][j+j1]=cnt;
  45. cnt++;
  46. num3--;
  47. }
  48. }
  49. for(int i=1;i<=m-1&&num2>0;i++)
  50. {
  51. for(int j=1;j<=m-1&&num2>0;j++)
  52. {
  53. int flag = 0;
  54. for(int i1=0;i1<2;i1++)
  55. for(int j1=0;j1<2;j1++)
  56. if(g[i+i1][j+j1])flag=1;
  57. if(flag)continue;
  58. for(int i1=0;i1<2;i1++)
  59. for(int j1=0;j1<2;j1++)
  60. g[i+i1][j+j1]=cnt;
  61. cnt++;
  62. num2--;
  63. }
  64. }
  65. for(int i=1;i<=m;i++)
  66. for(int j=1;j<=m;j++)
  67. if(g[i][j]==0)g[i][j]=cnt++;
  68. if(cnt==n+1)
  69. {
  70. printf("Possible\n%d\n",m);
  71. for(int i=1;i<=m;i++,cout<<endl)
  72. for(int j=1;j<=m;j++)
  73. printf("%d ",g[i][j]);
  74. return 0;
  75. }
  76. }
  77. }

CDOJ 1281 暴兵的卿学姐 构造题的更多相关文章

  1. 卿学姐与公主 UESTC - 1324 分块模板题

    题意:http://acm.uestc.edu.cn/#/problem/show/1324 中文题,自己看喽. 题解:分块模板,update时顺便更新块属性.ask时先判掉belong[l]==be ...

  2. CDOJ 1324 卿学姐与公主(分块)

    CDOJ 1324 卿学姐与公主(分块) 传送门: UESTC Online Judgehttp://acm.uestc.edu.cn/#/problem/show/1324 某日,百无聊赖的卿学姐打 ...

  3. cdoj 1328 卿学姐与诡异村庄 Label:并查集 || 二分图染色

    卿学姐与诡异村庄 Time Limit: 4500/1500MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  ...

  4. cdoj 1329 卿学姐与魔法 优先队列

    卿学姐与魔法 Time Limit: 1200/800MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Sta ...

  5. cdoj 1324 卿学姐与公主 线段树裸题

    卿学姐与公主 Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit St ...

  6. CDOJ 1292 卿学姐种花 暴力 分块 线段树

    卿学姐种花 题目连接: http://acm.uestc.edu.cn/#/problem/show/1292 Description 众所周知,在喵哈哈村,有一个温柔善良的卿学姐. 卿学姐喜欢和她一 ...

  7. UESTC - 1324 卿学姐与公主

    题目链接 某日,百无聊赖的卿学姐打开了某11区的某魔幻游戏 在这个魔幻的游戏里,生活着一个美丽的公主,但现在公主被关押在了魔王的城堡中. 英勇的卿学姐拔出利刃冲向了拯救公主的道路. 走过了荒野,翻越了 ...

  8. cdoj1324卿学姐与公主

    地址:http://acm.uestc.edu.cn/#/problem/show/1324 卿学姐与公主 Time Limit: 2000/1000MS (Java/Others)     Memo ...

  9. cdoj1344卿学姐种美丽的花

    地址:http://acm.uestc.edu.cn/#/problem/show/1344 题目: 卿学姐种美丽的花 Time Limit: 8000/4000MS (Java/Others)    ...

随机推荐

  1. python自动开发之第二十四天(Django)

    一.ModelForm操作及验证 1.class Meta:class Meta: #注意以下字段不能加逗号 model = models.UserInfo #这里的all代指所用的字段,也可以是一个 ...

  2. 【HDU3037】Saving Beans

    Lucas的裸题,学习一个. #include<bits/stdc++.h> #define N 100010 using namespace std; typedef long long ...

  3. jquery - 实例1

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="text2.aspx.cs& ...

  4. JQuery判断一个元素下面是否有内容或者有某个标签

    网站开发时,我们时常需要把没有内容的标签隐藏或者去掉.在用JQ有两种好的解决办法: 一.判断文本是否为空 var jqObj = $(this);if(jqObj.text().trim()){ // ...

  5. z-index失效的情况

    1.父标签 position属性为relative: 2.问题标签无position属性(不包括static): 3.问题标签含有浮动(float)属性. 4.问题标签的祖先标签的z-index值比较 ...

  6. poj 3280(区间DP)

    Cheapest Palindrome Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7869   Accepted: 38 ...

  7. Jmeter-----随机生成手机号后8位并去重,来进行注册手机号的压测

    要求:对注册接口进行100000次压测,手机号已126开头,后面的8位数不限 前言:在进行测试中,我们需要对注册接口进行压测100000次,那么就要求手机号码每次填写的不一致,否则手机号使用一次后会出 ...

  8. Linux下服务器搭建

    一.安装前准备工作 yum -y install gcc   yum -y install gcc-c++   yum -y install make yum -y install ncurses-d ...

  9. SGU 263. Towers

    各种操作: put x c:表示在第 x 列上增加 c 个积木(c>0). tput t x c:表示在塔 t 的第 x 列上增加 c 个积木(c>0). towers:询问共有几座塔. ...

  10. Python基础系列----环境的搭建及简单输入、输出

    1.Python                                                                                         以下信 ...