CF1956E1 Nene vs. Monsters (Easy Version) 题解
考虑暴力。直接模拟是不可取的,因为会被
但是观察到对于两个相邻的怪兽
于是考虑用这条性质减少操作——我们只需不断模拟使得序列中不存在三个相邻的
考虑该做法的时间复杂度。使用刚才卡暴力的方法(构造许多
注意特判
放代码(C++17):
#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
int t; cin>>t;
while(t--){
int n; cin>>n;
vector<int> a(n),r;
for(auto &i:a)cin>>i;
if(n==2){
while(a[0]&&a[1])
a[1]=max(0,a[1]-a[0]),a[0]=max(0,a[0]-a[1]);
if(a[1])cout<<"1\n2\n";
else if(a[0])cout<<"1\n1\n";
else cout<<"0\n\n";
continue;
} // 此时直接模拟即可
while([&](){
for(int i=0;i<a.size();i++)
if(a[i]&&a[(i+1)%a.size()]&&a[(i+2)%a.size()])
return true;
return false;
}()) // 判断序列是否合法
for(int i=0;i<n;i++)
a[(i+1)%n]=max(0,a[(i+1)%n]-a[i]);
for(int i=0;i<n;i++)
if(a[i]&&!a[(i+n-1)%n])r.emplace_back(i);
cout<<r.size()<<'\n';
for(int i:r)cout<<i+1<<' ';
cout<<'\n';
}
return 0;
}