| 比赛 |
2026.8.28 |
评测结果 |
AAAAAAAAAA |
| 题目名称 |
一周一次买下同班同学的那些事 |
最终得分 |
100 |
| 用户昵称 |
郑霁桓 |
运行时间 |
0.318 s |
| 代码语言 |
C++ |
内存使用 |
8.18 MiB |
| 提交时间 |
2026-08-28 09:42:32 |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
long long T,n,a[200005],f[200005][2],g[200005][2];
const long long I=1e18;
vector<int>v;
inline void df(int x,bool y,bool op){
if(!x) return;
if(op){
if(f[x][y]==f[x-1][y]+a[x]){
df(x-1,y,1);
return;
}
if(y){
if(f[x][y]==-g[x-1][0]-a[x]){
if(v.size()&1) v.push_back(x);
else{
int p=v[v.size()-1];
v.pop_back();
v.push_back(x);
v.push_back(p);
}
df(x-1,0,0);
return;
}
if(f[x][y]==-g[x-1][1]-a[x]){
if(v.size()&1) v.push_back(x);
else{
int p=v[v.size()-1];
v.pop_back();
v.push_back(x);
v.push_back(p);
}
df(x-1,1,0);
return;
}
}else{
if(f[x][y]==-g[x-1][0]-a[x]){
if(v.size()&1){
int p=v[v.size()-1];
v.pop_back();
v.push_back(x);
v.push_back(p);
}else v.push_back(x);
df(x-1,0,0);
return;
}
if(f[x][y]==-g[x-1][1]-a[x]){
if(v.size()&1){
int p=v[v.size()-1];
v.pop_back();
v.push_back(x);
v.push_back(p);
}else v.push_back(x);
df(x-1,1,0);
return;
}
}
}else{
if(g[x][y]==g[x-1][y]+a[x]){
df(x-1,y,0);
return;
}
if(y){
if(g[x][y]==-f[x-1][0]-a[x]){
if(v.size()&1) v.push_back(x);
else{
int p=v[v.size()-1];
v.pop_back();
v.push_back(x);
v.push_back(p);
}
df(x-1,0,1);
return;
}
if(g[x][y]==-f[x-1][1]-a[x]){
if(v.size()&1) v.push_back(x);
else{
int p=v[v.size()-1];
v.pop_back();
v.push_back(x);
v.push_back(p);
}
df(x-1,1,1);
return;
}
}else{
if(g[x][y]==-f[x-1][0]-a[x]){
if(v.size()&1){
int p=v[v.size()-1];
v.pop_back();
v.push_back(x);
v.push_back(p);
}else v.push_back(x);
df(x-1,0,1);
return;
}
if(g[x][y]==-f[x-1][1]-a[x]){
if(v.size()&1){
int p=v[v.size()-1];
v.pop_back();
v.push_back(x);
v.push_back(p);
}else v.push_back(x);
df(x-1,1,1);
return;
}
}
}
return;
}
int main(){
freopen("bought.in","r",stdin);
freopen("bought.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>T;
// cout<<T<<"\n"; ///////////
while(T--){
cin>>n,v.clear();
// cout<<n<<'\n'; ///////////
for(int i=1;i<=n;i++) cin>>a[i];
// for(int i=1;i<=n;i++) cout<<a[i]<<" "; /////////////
f[0][0]=g[0][0]=0,f[0][1]=-1e18,g[0][1]=1e18;
for(int i=1;i<=n;i++){
f[i][0]=f[i-1][0]+a[i];
g[i][0]=g[i-1][0]+a[i];
if(a[i]>0){
f[i][0]=max(f[i][0],max(-g[i-1][1],-g[i-1][0])-a[i]);
g[i][0]=min(g[i][0],min(-f[i-1][1],-f[i-1][0])-a[i]);
}
f[i][1]=f[i-1][1]+a[i];
g[i][1]=g[i-1][1]+a[i];
if(a[i]<0){
f[i][1]=max(f[i][1],max(-g[i-1][1],-g[i-1][0])-a[i]);
g[i][1]=min(g[i][1],min(-f[i-1][1],-f[i-1][0])-a[i]);
}
}
df(n,0,1);
// cout<<f[n][0]<<"\n"; //////////////////
cout<<v.size()<<"\n";
for(int i=0;i<v.size();i++) cout<<v[i]<<" ";
cout<<"\n";
}
return 0;
}
//2 -10 -11 3 -10 15 7 18 16 17 -9
//-2 10 11 -3 10 -15
//2 -10 -11
//-2
//-2 -10 -11 -3 -10 -15 7 18 16 17 -9
//2 10 11 3 10 15 -7 18 16 17 -9