首先一定要从每个数的范围 \(i - n \le a_i \le i - 1\) 入手,最开始是这样一个想法,不难发现对于每个 \(i\) 都能选 \(n\) 个数,并且能选的右端点在 \(i - 1\),那么我们可以吧每个 \(i\) 前移一位,实际上就是 \(0 \sim n - 1\) 这些位置上选没选数,而如果这个位置上没选那么就一定选在了前面,实际上这样还是非常不好做,于是我考虑只选择了一个负数的情况,发现还是不能发现一种简便的方法来找出这个集合,因此我们需要换一种方式思考。

既然分析性质行不通,我们可以考虑直接构造出答案。像这种找到一个集合满足一些条件的题目,我们可以将其转化为图论问题,例如求一个连通块的权值和为特定值或者找到一个环使得环上权值和为特定值,转化方式就需要巧妙的连边了。因为 \(a_i\) 涉及到负数不方便连边,于是我们可以对于每个 \(a_i\) 增添一个增量 \(k\),即将 \(a_i \rightarrow b_i = a_i + k_i\) 那么原问题就转化为寻找一个集合使得 \(\sum b_i = \sum k_i\)。我的想法是对于每个 \(i\) 我们连边 \(i \rightarrow a_i + k_i\) 可以发现这中间有 \(n\) 条边,因为是有向边我们找联通块不方便,因此可以考虑找环。于是我们接下来的目的就是寻找一个合适的 \(k_i\) 使得连出来环上的边满足上述条件,然后我就不会做了,下面的做法只能无限 \(\rm stO\) 出题人。首先我们需要注意到这样一件事,如果刚好 \(n\) 个点,\(n\) 条边那么图中一定会存在一个环,于是我们就可以让 \(1 \le a_i + k_i \le n\) 那么这样就一定会出现环了,与此同时我们需要注意到一个如果要满足 \(\sum b_i = \sum k_i\) 那么不难发现环上的权值和要是编号和,事实上根据之前的连边如果能出现环那么环上的权值和一定是编号和,因为我们是每个编号 \(i\) 向外连一条边。再观察一下数据范围 \(i - n \le a_i \le i - 1\),两边不正好出现了 \(1, n\) 吗?先把两边减去 \(i\) 可得 \(-n \le a_i - i \le -1\) 再反个号 \(1 \le i - a_i \le n\) 不就是我们想要的东西吗?于是对于每个 \(i\) 我们连边 \(i \rightarrow i - a_i\) 再在图上找一个环即可。注意多组数据不能直接 \(\rm memset\)。

#include<bits/stdc++.h>
using namespace std;
#define N 1000000 + 5
#define rep(i, l, r) for(int i = l; i <= r; ++i)
bool book[N];
int T, n, x, top, cnt, a[N], fa[N], st[N], ans[N];
int read(){
char c; int x = 0, f = 1;
c = getchar();
while(c > '9' || c < '0'){ if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int main(){
T = read();
while(T--){
n = read();
rep(i, 1, n) a[i] = read(), fa[i] = i - a[i];
x = 1, cnt = top = 0;
while(!book[x]) book[x] = true, st[++top] = x, x = fa[x];
while(st[top] != x) book[st[top]] = false, ans[++cnt] = st[top--];
ans[++cnt] = st[top];
while(top) book[st[top--]] = false;
printf("%d\n", cnt);
rep(i, 1, cnt) printf("%d ", ans[i]); puts("");
}
return 0;
}

最新文章

  1. 在Winform开发中使用日程控件XtraScheduler
  2. Git版本控制工具(三)----远程仓库GitHub的使用
  3. 百度之星Astar2016 Round2A
  4. 用友UAP
  5. HDU 5358 First One 求和(序列求和,优化)
  6. Quartz Scheduler 开发指南(1)
  7. input设置disabled,经过strus2提交到后台,后台取不到值
  8. 151111 sqlite3数据库学习
  9. HDU-2059龟兔赛跑(基础方程DP-遍历之前的所有状态)
  10. SQLServer游标详解
  11. 百度网盘API的操作--PCS 百度个人云存储 上传 ,下载文件
  12. 邮件报警(postfix)
  13. webstorm编辑器使用
  14. sqlserver乱码问题解决
  15. BZOJ2212 POI2011Tree Rotations(线段树合并)
  16. Dojo框架:误解与现实[转载]
  17. 科技界、IT届的外号
  18. 微信公开课厦门站 时尚行业专场PPT
  19. linux测试系统使用expdp迁移数据到windos系统,11.2.0.4版本测试
  20. 压力测试工具ab及centos下单独安装方法 nginx和tomcat静态资源的性能测试

热门文章

  1. PLSQL到期处理
  2. Ubuntu mininet+Ryu环境安装
  3. [opencv]常用阵列操作函数总结
  4. CapstoneCS5265|TYPEC转HDMI 4K60HZ转换方案设计|CS5265功能介绍
  5. 基于Spring MVC + Spring + MyBatis的【银行卡系统】
  6. 编写Java程序,使用 Socket类模拟用户加入 QQ 群时,QQ 小冰发送欢迎消息的场景(用户充当客户端,QQ 小冰充当服务端)
  7. [ vue ] quasar框架踩坑:在vue文件外导入路由,执行router.push(&#39;/&#39;)没有效果
  8. navicat 找不到系统路径 【修改了系统路径中文名称引起的】
  9. 使用 navigator.userAgent.toLowerCase() 区别 浏览器 类型
  10. 用户注册调优 及Connection对象