洛谷 桶哥的问题——吃桶——题解
思路下限很低,暴力模拟即可,但数据很大,对时间复杂度有要求。
先分析一下题,发现核心条件即x<z且3|z-x,y并没有什么作用。同时可以证明,若x+3y=z,在z不变的情况下不会有第二对x、y满足条件,即我们找到的每个套餐都不会重复。
考虑用O(n log n)的算法。用链表的思想,把所有数据全部读完后,对每个桶来说,都从它开始往前找到第一个符合要求的桶,并让找到的桶指向它。这样处理完毕后,只需从头开始扫一遍所有桶,对每个桶来说,若桶的指针非空,就顺着指针走下去,每沿着指针走一次就是一个套餐,加到答案里即可。
可惜还是不够快,只有九十分。
代码如下:
1 // luogu-judger-enable-o2 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 #include<algorithm> 6 #include<cctype> 7 #include<vector> 8 using namespace std; 9 vector<int>a[10001];//每个种类的集合(各元素下标) 10 int ans;char ch; 11 const long long P=10007; 12 int b[100001],zh[100001],bi[100001];//营养、种类、种类里的下标 13 int nxt[100001];//下一个 14 int reans; 15 inline int read() 16 { 17 ans=0; 18 ch=getchar(); 19 while(!isdigit(ch)) ch=getchar(); 20 while(isdigit(ch)) ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar(); 21 return ans; 22 } 23 int w; 24 int main() 25 { 26 // freopen("data1.in.txt","r",stdin); 27 int n=read(),m=read(); 28 for(register int i=1;i<=n;i++) 29 b[i]=read(); 30 for(register int i=1;i<=n;i++) 31 { 32 zh[i]=read(); 33 a[zh[i]].push_back(i); 34 bi[i]=a[zh[i]].size()-1; 35 for(int j=bi[i]-1;j>=0;j--) 36 { 37 if((i-a[zh[i]][j])%3==0) 38 { 39 nxt[a[zh[i]][j]]=i; 40 break; 41 } 42 } 43 } 44 int y; 45 long long an; 46 for(int i=1;i<=n;i++) 47 { 48 for(int j=nxt[i];j<=n&&j;j=nxt[j]) 49 { 50 an=(i+j)*(long long)(b[i]-b[j]); 51 reans=(reans+an)%P; 52 } 53 } 54 if(reans<0) reans+=P; 55 printf("%d",reans); 56 return 0; 57 }
_rqy提供了一种快到飞起的O(n)的算法 2095ms =》87ms 大佬就是大佬呵。。。
把拆开,就是x*bx-x*bz+z*bx-z*bz。发现当z等于某个值时,ans就要加上所有在z前面、与z差3的倍数、与z属于同一类的x分别代入该式子得到的结果的和,写成一个算式就是∑xbx-bz∑x+z∑bx-zbz*∑1(即合法的x的个数),设每项的∑分别为sxbx,sx,sbx,s,发现每项又可递推求出,这样一个O(n)算法就诞生了!
AC代码如下:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cctype> 5 #include<ctime> 6 using namespace std; 7 const int mod=10007; 8 int sx[100001],sbx[100001],sxbx[100001],s[100001],a[100001],b[100001]; 9 int ans; 10 char ch; 11 inline int read() 12 { 13 ans=0; 14 ch=getchar(); 15 while(!isdigit(ch)) ch=getchar(); 16 while(isdigit(ch)) ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar(); 17 return ans; 18 } 19 int main() 20 { 21 int n; 22 n=read();read();//m其实并没用 23 for(int i=1;i<=n;i++) b[i]=read()%mod; 24 for(int i=1;i<=n;i++) a[i]=read(); 25 ans=0; 26 for(int gro=1;gro<=3;gro++)//差三的倍数的分一组,共有三组:%3=0的;%3=1的和%3=2的。 27 { 28 memset(sx,0,sizeof sx); 29 memset(sbx,0,sizeof sbx); 30 memset(sxbx,0,sizeof sxbx); 31 memset(s,0,sizeof s); 32 for(int z=gro;z<=n;z+=3) 33 { 34 ans=(ans+sxbx[a[z]])%mod; 35 ans=(ans-b[z]*sx[a[z]]%mod)%mod; 36 ans=(ans+z*sbx[a[z]])%mod; 37 ans=(ans-z*b[z]%mod*s[a[z]])%mod; 38 sxbx[a[z]]=(sxbx[a[z]]+z*b[z]%mod)%mod; 39 sx[a[z]]=(sx[a[z]]+z)%mod; 40 s[a[z]]=(s[a[z]]+1)%mod; 41 sbx[a[z]]=(sbx[a[z]]+b[z])%mod; 42 } 43 } 44 if(ans<0) ans+=mod; 45 printf("%d",ans); 46 return 0; 47 }
转载于:https://www.cnblogs.com/InductiveSorting-QYF/p/10945990.html
洛谷 桶哥的问题——吃桶——题解相关推荐
- 洛谷P2851 [USACO06DEC]The Fewest Coins G 题解
洛谷P2851 [USACO06DEC]The Fewest Coins G 题解 题目链接:P2851 [USACO06DEC]The Fewest Coins G 题意: Farmer John ...
- 洛谷P4799 [CEOI2015 Day2] 世界冰球锦标赛 题解
洛谷P4799 [CEOI2015 Day2] 世界冰球锦标赛 题解 题目链接:P4799 [CEOI2015 Day2] 世界冰球锦标赛 题意: 译自 CEOI2015 Day2 T1「Ice Ho ...
- 洛谷P4390 [BOI2007]Mokia 摩基亚 题解
洛谷P4390 [BOI2007]Mokia 摩基亚 题解 题目链接:P4390 [BOI2007]Mokia 摩基亚 题意:摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和 ...
- BZOJ4943 洛谷3823 UOJ315:[NOI2017]蚯蚓排队——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4943 http://uoj.ac/problem/315 https://www.luogu.or ...
- 洛谷-DFS-1019-单词接龙-个人AC题解和公共AC题解笔记
学习内容: 预处理 万能头文件 string的使用 话不多说,直奔主题 本人AC代码 #include<iostream> #include<cstdio> #include& ...
- 洛谷P3755 [CQOI2017]老C的任务 题解
题目传送门 题目描述 老C是个程序员. 最近老C从老板那里接到了一个任务--给城市中的手机基站写个管理系统.作为经验丰富的程序员,老C轻松地完成了系统的大部分功能,并把其中一个功能交给你来实现. 由于 ...
- [洛谷]CON1466 洛谷2017春节联欢赛 Hello Dingyou题解 Bzoj4763雪辉
题目来源:https://www.luogu.org/contest/show?tid=1466 创建时间:2017/3/13 18:33 镇楼图: 猜猜她是谁~ 解题思路: 春节居然也有 ...
- 洛谷P1424 小鱼的航程(改进版)-c++题解
小鱼的航程(改进版) - 洛谷 解题思路:周一到周五游泳,六日休息 输入周几(x)开始和经过了几(n)天,所以我们可以对输入的x一直自加n次,如果x在周一到周五则游泳的天数也自加,超过7天时对x取余7 ...
- 《GMOJ-Senior-5449 Pacifist》/《洛谷-CF763C / CodeForces-763-C Timofey and remoduling》题解
题目大意 给出一个长度为 n n n的元素两两不同的序列和一个质数 m m m.若该序列是由一个等差数列在模 m m m意义下打乱而得到的,请尝试求出原数列的首项和公差.若可能的原数列不唯一,请随便输 ...
- 洛谷4277:萃香的请柬——题解
https://www.luogu.org/problemnew/show/P4277 萃香在小时候就一直有一个梦想,就是邀请全乡居民一起参加宴会,在上次发动异变被灵梦退治之后她仍旧没有放弃,而是在元 ...
最新文章
- 深度详解ResNet到底在解决一个什么问题?
- SAP之成本中心类型与功能范围
- Apache ECharts顺利毕业,成为ASF顶级项目
- 使用Nginx反向代理来实现简单的负载均衡
- python报错RuntimeError: This event loop is already running
- navmenu 收起没有动画 element_ABC360等3家英语动画片课程测评:用动画片学英语不靠谱?...
- python2.7中没有zlib库的解决方案(zipimport.ZipImportError: can't decompress data; zlib not available)
- 《计算机组成原理》BCD码 8421编码原理剖析
- 恒大俱乐部每年亏损数亿,为何马云还不卖掉手中的股份?
- ios笔记-单例文字代码详解
- 单麦克纳姆轮受力分析
- 前后端分离 获取用户ip_前后端分离应用——用户信息传递
- IOS开发之支付功能概述
- 《英特尔 oneAPI—打开异构新纪元》
- 【教程】无需下载任何软件,使win10任务栏完全透明!
- 录音怎么转换成mp3格式?
- 我的留英日记[转载]
- 校园助手APP--简介及框架
- 为什么在AndroidManifest.xml中Activity的theme用不了Theme.Light.NoTitleBar?
- 加密操作-->图片加密
热门文章
- 【Windows】WPS | 多级编号 | 自定义多级标号
- Flash 控件的安装
- 企业组织架构的架构图用思维导图软件怎么做?
- ROS导航调参经验总结(Teb算法)
- Mysql表和数据的复制操作
- python选课系统代码_Python选课系统开发程序
- 51单片机99秒倒计时C语言程序,单片机 60秒倒计时
- 计算机教程打字方法,技巧:打字指法和关键位置教程_IT /计算机_信息
- 削峰填谷 matlab,风电与电动汽车协同并网调度环境模型
- caffe:将mean.binaryproto文件转化为mean.npy文件