Codeforces Gym 101173 CERC 16 D & BZOJ 4790 Dancing Disks

强烈安利这道构造题目,非常有意思。

这里用到的思想是归并排序!

多路归并排序!

我们这样想,假设6*6的网格中除了最后一个网格外,其他的凡是有元素的格子中,这些元素都是严格有序的。

也就是说在每个rod上,从栈顶到栈底是严格单调递减的,那么我们可以模仿归并排序的思想,从这些rods里面选取一个最大的放在最后一个网格上,并把它从原rod里面删除掉,然后再取这些rods里面最大的放到最后一个网格上,这样的话,是不是就是归并排序的思想。最后这个网格在操作完成后将是严格单调递减的。即满足了要求。

现在我们的任务是把其他的格子都变成单调递增的。那么怎么办呢?

递归呀!!!

那么我们的思路就有了。

但是这里要注意一个问题!就是说(1,2)和(2,1)这两个格子实际上可以构造出size为2的有序序列。这样下去第6*6个格子足够构造40000多个数字的有序序列。

代码:

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5;
const int INF = 1e9;
stack<int> rods[7][7];
int arr[MAXN];
int n;
vector<int> opx;
vector<int> opy;
vector<char> opt;
vector<int> opn;
int merge(int x,int y, int op){if(x + y == 3){if(rods[1][1].size() >= 2){int top1 = rods[1][1].top();rods[1][1].pop();int top2 = rods[1][1].top();rods[1][1].pop();if((top1 > top2) ^ op){ //op == 0 inc,op == 1 decrods[x][y].push(top1);rods[x][y].push(top2);opx.push_back(1);opy.push_back(1);opt.push_back(x == 1?'R':'D');opn.push_back(1);opx.push_back(1);opy.push_back(1);opt.push_back(x == 1?'R':'D');opn.push_back(1);}else{rods[x][y].push(top2);rods[x][y].push(top1);opx.push_back(1);opy.push_back(1);opt.push_back(x == 1?'R':'D');opn.push_back(2);}return 2;}else if(rods[1][1].size() == 1){int top1 = rods[1][1].top();rods[1][1].pop();rods[x][y].push(top1);opx.push_back(1);opy.push_back(1);opt.push_back(x == 1?'R':'D');opn.push_back(1);return 1;}else{return 0;}}int nums[7][7];memset(nums,0,sizeof(nums));for(int i = 1;i <= x;i++){for(int j = 1;j <= y;j++){if((i != x || j != y) && (i != 1 ||j != 1)){nums[i][j] = merge(i,j,!op);}}}if(!rods[1][1].empty()){nums[1][1] = 1;}//merge itint cur_cnt = 0;int pos_x = 0;int pos_y = 0;int pos_max = op * INF; int flag = 1;while(flag){flag = 0;for(int i = 1;i <= x;++i){for(int j = 1;j <= y;++j){if(i == x && j == y) continue;if(!nums[i][j]) continue;if((pos_max < rods[i][j].top()) ^ op){ // op == 0 incpos_max = rods[i][j].top();pos_x = i;pos_y = j;}}}if(pos_max != op * INF){pos_max = op * INF;flag = 1;cur_cnt++;rods[x][y].push(rods[pos_x][pos_y].top());rods[pos_x][pos_y].pop();nums[pos_x][pos_y]--;for(int i = pos_y;i < y;i++){opx.push_back(pos_x);opy.push_back(i);opt.push_back('R');opn.push_back(1);}for(int i = pos_x;i < x;i++){opx.push_back(i);opy.push_back(y);opt.push_back('D');opn.push_back(1);}}}return cur_cnt;
}
int main(){scanf("%d",&n);for(int i = 1;i <= n;i++){scanf("%d",&arr[i]);rods[1][1].push(arr[i]);}merge(6,6,0);for(int i = 0;i < opx.size();++i){printf("%d %d %c %d\n",opx[i],opy[i],opt[i],opn[i]);}return 0;
}

Codeforces Gym 101173 CERC 16 D BZOJ 4790 Dancing Disks相关推荐

  1. [构造] Codeforces Gym 101173 CERC 16 K BZOJ 4796 Key Knocking

    每三个一起考虑 不论如何 我们都可以进行最多一次操作使得答案加2 就好了 #include<cstdio> #include<cstdlib> #include<algo ...

  2. Codeforces Gym 101173 K. Key Knocking (构造)

    题意 对于给定的长为 3×N3\times N 的 01 字符串 S,求在最多变换 N 次下使得字符串 S 的 weight >= 2n . 字符串的 weight 为 相邻不同字符的个数 + ...

  3. Codeforces Gym 101086 M ACPC Headquarters : AASTMT (Stairway to Heaven)

    Codeforces Gym 101086 M ACPC Headquarters : AASTMT (Stairway to Heaven) 题目来源: Codeforces 题意: 给出一些比赛, ...

  4. [Codeforces Gym 101651/100725B] Banal Tickets

    Codeforces Gym 100725 题解: 先分两种情况, 积为000与积非0" role="presentation" style="position ...

  5. GYM CERC 16 K Key Knocking 构造

    Problem K 题意:给出长度为3n的01串,定义一个串的价值为:相邻不同的个数+1.例如011010100 价值为7. 操作反转两个相邻元素:将[x,x+1]两个元素的值反转,0->1,1 ...

  6. Codeforces Gym 100269 Dwarf Tower (最短路)

    题目连接: http://codeforces.com/gym/100269/attachments Description Little Vasya is playing a new game na ...

  7. Codeforces Gym 100342J Problem J. Triatrip 求三元环的数量 bitset

    Problem J. Triatrip Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100342/at ...

  8. Codeforces Gym 101142C:CodeCoder vs TopForces(搜索)

    http://codeforces.com/gym/101142/attachments 题意:每个人在TC和CF上分别有两个排名,如果有一个人在任意一个网站上大于另一个人的排名,那么这个人可以打败另 ...

  9. 【中途相遇法】【STL】BAPC2014 K Key to Knowledge (Codeforces GYM 100526)

    题目链接: http://codeforces.com/gym/100526 http://acm.hunnu.edu.cn/online/?action=problem&type=show& ...

最新文章

  1. 2016.5.57—— Remove Duplicates from Sorted List
  2. 德哥:从Oracle DBA到PostgreSQL布道者
  3. winxp精简版没有IIS的解决办法
  4. 封装jquery的ajax,便于加载等待提示框
  5. c/c++教程 - 2.2 引用的使用方法,引用做函数参数,引用做返回值,引用的本质,常量引用
  6. delphi windows编程_学习C/C++:伴随我成长的编程书!
  7. 新站快速收录同时也提高内页的收录
  8. 中国的开源之夏来了!
  9. 网络WireShark进行抓包
  10. 基于蜂群对花蜜需求所做的数量模型构建及分析
  11. 什么是逻辑卷管理器lvm?lvm设备的管理
  12. waiting for changelog lock.
  13. python习题练习(一)
  14. 大众点评数据采集分析
  15. 大无语事件 谷歌浏览器无标题
  16. DNS添加KMS SRV记录激动激活
  17. macOS实现视频转音频以及音频拼接
  18. Python爬虫入门教程 35-100 知乎网全站用户爬虫 scrapy
  19. 用户界面框架jQuery EasyUI示例大全之DataList
  20. python自动化报表-Python报表自动化

热门文章

  1. python中list的意思_list在python中是什么意思
  2. ufo帧率测试网站_一加7游戏续航测试 满电开始玩猜猜能玩多久
  3. setnx和expire合成一条指令_Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?...
  4. win10新建管理员账户_【经验篇001】Win10专业版如何开启超级管理员账户
  5. 10-4 5-4 查询至少生产三种不同速度PC的厂商 (20 分)
  6. 哈希表(散列表)基础概念与经典题目(Leetcode题解-Python语言)之中——实际应用
  7. 4位BCD计数器设计
  8. 算法-找出最近点对问题
  9. DDIA笔记—第六章 数据分区
  10. 2021 ccpc 哈尔滨 G. Damaged Bicycle 状压 + 期望dp