Codeforces Gym 101173 CERC 16 D & BZOJ 4790 Dancing Disks
来源:互联网 发布:精通nginx pdf 编辑:程序博客网 时间:2024/06/05 23:46
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;}
阅读全文
1 0
- Codeforces Gym 101173 CERC 16 D & BZOJ 4790 Dancing Disks
- [分治 杂题] Codeforces Gym 101173 CERC 16 G & BZOJ 4792 Geohash Grid
- [2-SAT 构造] Codeforces Gym 101173 CERC 16 L. Lost Logic
- GYM CERC 16 K Key Knocking 构造
- CodeForces Gym 100735D
- Gym CERC 16 F Free Figuriness 思维+模拟
- codeforces GYM 101431D(构造)
- Codeforces Gym 101485D Debugging
- Codeforces Gym 100623D Problem D. Deposits
- CodeForces Gym 100646D Party Party Party
- Codeforces Gym 100463D Evil DFS
- codeforces Gym 100187D Holidays(排列组合)
- Codeforces gym 101102 D 单调栈
- Codeforces Gym 101234D Forest Game
- Codeforces Gym 100642 C D F
- CodeForces Gym 100989D 1D Cafeteria (B)
- Codeforces Gym 100342D Problem D. Dinner Problem Dp+高精度
- codeforces 113D&bzoj 3270
- HTML5 data- 自定义属性
- 自定义函数标签
- C语言实现数据保护算法(1)——DES&3DES加解密
- jQuery实现点击全选和取消全选
- ubuntu 下 face_recognition 的安装
- Codeforces Gym 101173 CERC 16 D & BZOJ 4790 Dancing Disks
- eclipseEE中tomcat的最常用的两个功能的简单说明
- 关于打开App崩溃的一个问题记录
- 1272:三位数反转
- webview加载网页用法(工程内部加载)
- 查询所有连接到ORACLE服务器的客户端IP地址的方法
- HELLO WORLD
- Android聊天机器人
- paython 获取excel数据