博客
关于我
CodeForces 1484D Playlist 思维暴力
阅读量:502 次
发布时间:2019-03-07

本文共 1858 字,大约阅读时间需要 6 分钟。

题目链接

题意

给出一个数组,从1开始循环检查,如果gcd(a[i],a[i+1])=1(若i=n,那么比较a[n]和a[1]),那么就把a[i+1]移除。注意不能连续移除两个元素。问最终移除元素的数量和移除次序

思路

被前面题难度吓到了,这边直接带点思路打暴力就可以了。

看cf评论区说什么list和循环队列啥的,也没看明白,等出官方题解再说吧。

容易想到以下性质,在我们循环检查数组时,我们没有必要每次都对数组整个检查一遍,在处理完一遍后,能够产生新答案的位置只有上一次检查过程中产生了删除元素的位置。

我们用li数组记录每一个元素右边指向的元素,对于第i个元素,初始为i+1,之后可能会不断变化,比如我们把i右边的移除,那么li[i]则变成了li[li[i]],这样处理是非常节约时间的。

我们创建数组v,初始时存放1-n的全部下标,创建临时的t数组存放可能产生新答案的位置。对于满足条件的位置i,我们把i加入数组t,把li[i]打标记防止重复访问,更新li[i],更新答案。之后让v=t,循环直到v为空为止

教训/收获

  1. 别被吓到,想到就写,很多题没那么难,别摆烂
  2. c++11里可以用emplace_back()代替push_back(),他的插入效率更高,减少了不必要的构造,拷贝,析构等。但说实话vector平时都是基本类型居多,最多用个string,效率能高多少打个问号。

代码

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#define endl "\n"//#define int long long//#define double long doubleusing namespace std; typedef long long ll; const int maxn=200505; const int inf=0x3f3f3f3f; int n,m,k; int a[maxn]; int li[maxn]; bool vis[maxn]; vector
v,ans,t; struct custom_hash { static uint64_t splitmix64(uint64_t x) { x += 0x9e3779b97f4a7c15;x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;x = (x ^ (x >> 27)) * 0x94d049bb133111eb;return x ^ (x >> 31);}size_t operator()(uint64_t x) const { static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();return splitmix64(x + FIXED_RANDOM);}}; signed main(){ IOS #ifndef ONLINE_JUDGE freopen("IO\\in.txt","r",stdin); freopen("IO\\out.txt","w",stdout); #endif int tn; cin>>tn; while(tn--){ cin>>n; ans.clear();v.clear(); for(int i=1;i<=n;i++){ cin>>a[i]; v.emplace_back(i); li[i]=i+1; vis[i]=0; } li[n]=1; while(v.size()){ t.clear(); for(auto i:v){ if(vis[i]) continue; if(__gcd(a[i],a[li[i]])==1){ ans.emplace_back(li[i]); vis[li[i]]=1; li[i]=li[li[i]]; t.emplace_back(i); } } v=t; } cout<

转载地址:http://dpnjz.baihongyu.com/

你可能感兴趣的文章
Netty+Protostuff实现单机压测秒级接收35万个对象实践经验分享
查看>>
Netty+SpringBoot+FastDFS+Html5实现聊天App详解(一)
查看>>
netty--helloword程序
查看>>
netty2---服务端和客户端
查看>>
Netty5.x 和3.x、4.x的区别及注意事项(官方翻译)
查看>>
netty——bytebuf的创建、内存分配与池化、组成、扩容规则、写入读取、内存回收、零拷贝
查看>>
netty——Channl的常用方法、ChannelFuture、CloseFuture
查看>>
netty——EventLoop概念、处理普通任务定时任务、处理io事件、EventLoopGroup
查看>>
netty——Future和Promise的使用 线程间的通信
查看>>
netty——Handler和pipeline
查看>>
Vue输出HTML
查看>>
netty——黏包半包的解决方案、滑动窗口的概念
查看>>
Netty中Http客户端、服务端的编解码器
查看>>
Netty中使用WebSocket实现服务端与客户端的长连接通信发送消息
查看>>
Netty中实现多客户端连接与通信-以实现聊天室群聊功能为例(附代码下载)
查看>>
Netty中的组件是怎么交互的?
查看>>
Netty中集成Protobuf实现Java对象数据传递
查看>>
netty之 定长数据流处理数据粘包问题
查看>>
Netty事件注册机制深入解析
查看>>
netty代理
查看>>