日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Codeforces Gym 101173 CERC 16 D BZOJ 4790 Dancing Disks

發布時間:2023/12/3 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Codeforces Gym 101173 CERC 16 D BZOJ 4790 Dancing Disks 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。