bzoj3211花神游历各国

题意:

n个数的序列,m个操作,操作两种:区间开根(向下取整)和区间求和。n≤100000,m≤200000,序列中的数非负且≤109

题解:

一个≤109的数开6次根就变成1了。因此开根操作可以暴力只开不是1或0的数。对每个数维护并查集表示离它最近的不是1或0的数,每次只修改这个数在并查集中的根节点,然后跳到根节点的下一个数继续此操作。而数组的快速修改求和用树状数组就可以了。反思:本机测大数据会爆栈,路径压缩得写出非递归形式,但似乎bzoj的栈很大。

代码:

 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define inc(i,j,k) for(int i=j;i<=k;i++)
#define maxn 100500
#define ll long long
#define lb(x) x&-x
using namespace std; inline int read(){
char ch=getchar(); int f=,x=;
while(ch<''||ch>''){if(ch=='-')f=-; ch=getchar();}
while(ch>=''&&ch<='')x=x*+ch-'',ch=getchar();
return f*x;
}
int n,m,fa[maxn]; ll c[maxn],v[maxn];
void update(int x,ll val){while(x<=n)c[x]+=val,x+=lb(x);}
ll query(int x){ll q=; while(x>)q+=c[x],x-=lb(x); return q;}
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
int main(){
n=read(); inc(i,,n)v[i]=(ll)read(),fa[i]=i,update(i,v[i]); m=read();
fa[n+]=n+; inc(i,,n)if(v[i]<=)fa[i]=find(i+);
inc(i,,m){
int x=read(),l=read(),r=read();
if(x==)printf("%lld\n",query(r)-query(l-));
if(x==){
int j=l;
while(j<=r){
j=find(j); if(j>r)break; ll y=v[j]; v[j]=(ll)sqrt(y);
update(j,v[j]-y); if(v[j]<=)fa[j]=find(j+); j++;
}
}
}
return ;
}

20160613

------------------------------------------------------------------------------------------------------------------------------------------

bzoj3038上帝造题的七分钟2

题意:

同bzoj3211,但数的大小变为10^12,且操作代码变了。

题解:

数组开大,快速读入类型改为longlong即可。(我发现我bzoj3211的代码竟然是错了,wa了好几发,现在已改正)

代码:

 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define inc(i,j,k) for(int i=j;i<=k;i++)
#define maxn 100500
#define ll long long
#define lb(x) x&-x
using namespace std; inline ll read(){
char ch=getchar(); ll f=,x=;
while(ch<''||ch>''){if(ch=='-')f=-; ch=getchar();}
while(ch>=''&&ch<='')x=x*+ch-'',ch=getchar();
return f*x;
}
int n,m,fa[maxn]; ll c[maxn],v[maxn];
void update(int x,ll val){while(x<=n)c[x]+=val,x+=lb(x);}
ll query(int x){ll q=; while(x>)q+=c[x],x-=lb(x); return q;}
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
int main(){
n=read(); inc(i,,n)v[i]=read(),fa[i]=i,update(i,v[i]); m=read();
fa[n+]=n+; inc(i,,n)if(v[i]<=)fa[i]=find(i+);
inc(i,,m){
int x=read(),l=read(),r=read(); if(l>r)swap(l,r);
if(x==)printf("%lld\n",query(r)-query(l-));
if(x==){
int j=l;
while(j<=r){
j=find(j); if(j>r)break; ll y=v[j]; v[j]=(ll)sqrt(y);
update(j,v[j]-y); if(v[j]<=)fa[j]=find(j+); j++;
}
}
}
return ;
}

20160922

最新文章

  1. Lattice Reduction (LLL) 算法C代码实现
  2. Single Number II ——位操作
  3. springmvc 中RequestMapping注解的使用
  4. MyEclipse 8.5 开发环境配置,汉化,Aptana2.0插件,SVN 插件,Flex Builder 3/4 插件安装(转载)
  5. Spring 与 Hibernate 集成 Transactional设置为只读
  6. 使用HttpClient发送HTTPS请求以及配置Tomcat支持SSL
  7. Less 关于css hack的写法
  8. Spark1.0.0 分布式环境搭建
  9. Elasticsearch 5.0 安装 Search Guard 5 插件 (五)
  10. 单片AT89C2051 + SD卡 + 3310LCD = 音乐播放器
  11. 201521123103 《java学习笔记》 第十四周学习总结
  12. 【centos6.5 hadoop2.7 _64位一键安装脚本】有问题加我Q直接问
  13. 容器化分布式日志组件ExceptionLess的Angular前端UI
  14. RDIFramework.NET代码生成器全新V3.5版本发布-重大升级
  15. 神经网络_线性神经网络 1 (Nerual Network_Linear Nerual Network 1)
  16. Oarcle之单行函数(下)
  17. 使用windeployqt工具来进行Qt的打包发布
  18. 通过 Java 线程堆栈进行性能瓶颈分析
  19. C5-fasterrcnn-小象cv-code
  20. Web用户控件开发--分页控件

热门文章

  1. Pycharm下安装模块
  2. MySQL的LIKE模糊查询优化
  3. 设计模式系列之组合模式(Composite Pattern)——树形结构的处理
  4. Linux下安装 Java
  5. 不同类型数据库中LIKE语句使用
  6. Accelerate Framework in Swift
  7. loadRunnner中90%的响应时间
  8. Hystrix总结
  9. 10、一个action中处理多个方法的调用第一种方法动态调用
  10. c语言二维数组的转置