正着想,肯定不得好死,后面的操作影响前面的数字
但是反着想,我们的行为变成了:
每次可以对队列最后的数字进行 − 1 -1 −1、 ÷ 2 且会使前面的数字整体 + 1 \div 2\ 且会使前面的数字整体\ +1 ÷2 且会使前面的数字整体 +1 等操作
如何构造使得队列中元素都变成 0 0 0
这就很好想:我们从后往前一个个消灭,每一次 + + + 操作给全局tag + 1 +1 +1
这道题成功在赛时唐出来了——(难绷
AC-code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
int tag = 0;
string t = "";
string opt[2] = {"1+","c+"};
void get(int x) {
string s = "";
int p = x;
x >>= 1;
bool flag = true;
while(x) {
s = opt[1] + s;
tag++;
if(x & 1 && x > 1) s = opt[0] + s,tag++;
x >>= 1;
}
if(p & 1) s = s + "1+",tag++;
s = "1" + s;
t = s + t;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);cout.tie(nullptr);
freopen("polaris.in","r",stdin);
freopen("polaris.out","w",stdout);
int n;
cin>>n;
vector<int> b(n + 1);
for(int i = 1;i<=n;i++)
cin>>b[i];
for(int i = n;i >= 1;i--)
get(b[i] + tag);
cout<<t;
return 0;
}