博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU4288 Coder
阅读量:6091 次
发布时间:2019-06-20

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

题意:

给出一个有序集合,3种操作。插入一个数,删除一个数,都保证序列有序。以及求和

其中求和是将下标%5==3的所有数求和,这道题是2012年成都网络预赛的题目,一开始只知道用线段树,但不知从何下手,

因为要求的不是连续区间的元素之和,而是满足%5==3的所有数求和,当时我就迷茫了,之后搜了网上的题解,基本上弄懂了。

思路:线段树求解,不过与以往的不同这个是多棵的线段树,每个节点下有五个元素集,每个是当前树所有下标%5==3的元素的和,这样就可以去求满足条件的元素和了。

 

1 #include
2 #include
3 using namespace std; 4 const int N=100005; 5 struct { 6 int l,r,cnt; 7 __int64 s[5]; 8 }tree[3*N]; 9 int a[N],b[N];10 bool vis[N];11 void build(int l,int r,int i){12 tree[i].l=l;13 tree[i].r=r;14 tree[i].cnt=0;15 memset(tree[i].s,0,sizeof(tree[i].s));16 if(l
>1;18 build(l,mid,i<<1);19 build(mid+1,r,i<<1|1);20 }21 }22 void add(int p,int i,int flag){23 tree[i].cnt+=flag*2-1;24 if(tree[i].l==p && tree[i].r==p){25 tree[i].s[0]=flag*a[p];26 return;27 }28 int mid=(tree[i].l+tree[i].r)>>1;29 if(p<=mid) add(p,i<<1,flag);30 else add(p,i<<1|1,flag);31 for(int j=0;j<5;j++)//自底向上更新父节点信息 32 tree[i].s[j]=tree[i<<1].s[j]+tree[i<<1|1].s[(j-tree[i<<1].cnt%5+5)%5];33 }34 int main()35 {36 int n,i,k,p;37 char cmd[5];38 while(~scanf("%d",&n)){39 memset(b,0,sizeof(b));40 memset(vis,0,sizeof(vis));41 for(k=i=0;i

 

 

 

转载于:https://www.cnblogs.com/shihuajie/archive/2013/05/01/3053468.html

你可能感兴趣的文章
使用wagon-maven-plugin部署Java项目到远程服务器
查看>>
新书推荐 |《PostgreSQL实战》出版(提供样章下载)
查看>>
JavaScript/数据类型/function/closure闭包
查看>>
30个免费资源:涵盖机器学习、深度学习、NLP及自动驾驶
查看>>
读zent源码库之Dialog组件实现
查看>>
express中间层搭建前端项目3
查看>>
【刷算法】我知道的所有类似斐波那契数列的问题
查看>>
centos下安装JAVA开发工具(3)------Mysql
查看>>
JS 实现文字滚动显示
查看>>
php实现依赖注入(DI)和控制反转(IOC)
查看>>
如何搭建高质量、高效率的前端工程体系--页面结构继承
查看>>
白山云科技 CTO 童剑:空降后,如何有技术又有艺术地破局?
查看>>
Google发布App Engine第二代运行时,提供Python 3.7和PHP 7.2支持
查看>>
通过XAML Islands使Windows桌面应用程序现代化
查看>>
Mozilla开发全新的公开网络API WebXR 来实现增强现实
查看>>
IOS 10适配https 包含对于一些http的一些兼容配置
查看>>
【人脸识别终结者】多伦多大学反人脸识别,身份欺骗成功率达99.5%
查看>>
服务短信的退订与恢复方法
查看>>
2016年中国软件行业基准数据正式发布
查看>>
Eclipse安装Spring工具套件
查看>>