【Codeforces Round #720 (Div. 2)】-B.Nastia and a Good Array-构造

题目:
【Codeforces Round #720 (Div. 2)】-B.Nastia and a Good Array-构造_第1张图片
思路:
本来还以为这是个贪心让求最小变换次数了,结果发现不是,随便一胡就过去了
所以
这就是道构造题

我们可以发现,最小的位置上的数绝对是构造完的数列中最小的那个数
所以最小的数肯定要保留
由于__gcd(x, x + 1) == 1,所以我们可以利用此性质做n - 1次变换
即由最小值所在的位置开始
向两侧各做一个递增的差值为1的等差数列

不贪心地,暴力做就行了

代码:

/*
____________________________________________________________________________________
          /  ______|   |   |   |____   ___|\   \      /   /    \      |           |
         /  /      |   |   |   |   |   |    \   \    /   /  /\  \     |    _______| 
         |  |      |   |___|   |   |   |     \   \  /   /  /  \  \    |    |______
         |  |      |    ___    |   |   |      \   \/   /  /____\  \   |_______    |
         |  |      |   |   |   |   |   |       \      /  ________  \   ______|    |
         \  \______|   |   |   |___|   |___     \    /  /        \  \ |           |
Author : _\________|___|___|___|___________|_____\__/__/__________\__\|___________|
————————————————————————————————————————————————————————————————————————————————————

*/
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define G 10.0
#define LNF 1e18
#define EPS 1e-6
#define PI acos(-1.0)
#define INF 0x7FFFFFFF

#define ll long long
#define ull unsigned long long

#define LOWBIT(x) ((x) & (-x))
#define LOWBD(a, x) (lower_bound(ALL(a), (x)) - (a).begin())
#define UPPBD(a, x) (upper_bound(ALL(a), (x)) - (a).begin())
#define TEST(a) cout << "---------" << a << "---------" << '\n'

#define Chivas int main()
#define Regal exit(0)

#define SP system("pause")
#define IOS ios::sync_with_stdio(false)
#define map unordered_map

#define PB(x) push_back(x)
#define ALL(a) ((a).begin(),(a).end())
#define MEM(a, b) memset(a, b, sizeof(a))
#define EACH_CASE(cass) for (cin >> cass; cass; cass--)

using namespace std;

template<typename T> inline T MAX(T a, T b){
     return a > b? a : b;}
template<typename T> inline T MIN(T a, T b){
     return a > b? b : a;}
template<typename T> inline void SWAP(T &a, T &b){
     T tp = a; a = b; b = tp;}
template<typename T> inline T GCD(T a, T b){
     return b > 0? gcd(b, a % b) : a;}
template<typename T> inline pair<T, T> MaxInVector_ll(vector<T> vec){
     T MaxVal = -LNF, MaxId = 0;for(int i = 0; i < (int)vec.size(); i ++) if(MaxVal < vec[i]) MaxVal = vec[i], MaxId = i; return {
     MaxVal, MaxId};}
template<typename T> inline pair<T, T> MinInVector_ll(vector<T> vec){
     T MinVal = LNF, MinId = 0;for(int i = 0; i < (int)vec.size(); i ++) if(MinVal > vec[i]) MinVal = vec[i], MinId = i; return {
     MinVal, MinId};}
template<typename T> inline pair<T, T> MaxInVector_int(vector<T> vec){
     T MaxVal = -INF, MaxId = 0;for(int i = 0; i < (int)vec.size(); i ++) if(MaxVal < vec[i]) MaxVal = vec[i], MaxId = i; return {
     MaxVal, MaxId};}
template<typename T> inline pair<T, T> MinInVector_int(vector<T> vec){
     T MinVal = INF, MinId = 0;for(int i = 0; i < (int)vec.size(); i ++) if(MinVal > vec[i]) MinVal = vec[i], MinId = i; return {
     MinVal, MinId};}
template<typename T> inline pair<map<T, T>, vector<T> > DIV(T n){
     T nn = n;map<T, T> cnt;vector<T> div;for(ll i = 2; i * i <= nn; i ++){
     while(n % i == 0){
     if(!cnt[i]) div.push_back(i);cnt[i] ++;n /= i;}}if(n != 1){
     if(!cnt[n]) div.push_back(n);cnt[n] ++;n /= n;}return {
     cnt, div};}


struct node{
     
    ll j;
    ll k;
    ll x;
    ll y;
};
 
inline void solve(){
     
    ll n; cin >> n;
    ll Minid = 0, Minval = LNF;//最小的值的位置,最小的值

    vector<ll> a;
    for(ll i = 0, x; i < n; i ++){
     
        cin >> x;
        a.PB(x);
    }

    pair<int, int> p = MinInVector_ll(a);
    Minid = p.second, Minval = p.first;

    if(n == 1){
     
        cout << "0" << endl;
        return;
    }
    vector<node> put;
    for(ll i = Minid + 1; i < n; i ++){
     
        a[i] = a[i - 1] + 1;
        put.push_back({
     i, Minid, a[i], Minval});
    }
    for(ll i = Minid - 1; i >= 0; i --){
     
        a[i] = a[i + 1] + 1;
        put.push_back({
     i, Minid, a[i], Minval});
    }
 
    cout << put.size() << endl;
    for(int i = 0; i < (int)put.size(); i ++){
     
        cout << put[i].j + 1 << " " << put[i].k + 1 << " " << put[i].x << " " << put[i].y << endl;
    }
}
 
Chivas{
     
    int cass;
    IOS;
    EACH_CASE(cass){
     
        solve();
    }
    Regal;
}

你可能感兴趣的:(#,CodeForces)