看程序写结果(program)
看程序写结果(program)
Time Limit:1000ms Memory Limit:64MB
题目描述
LYK 最近在准备 NOIP2017 的初赛,它最不擅长的就是看程序写结果了,因此它拼命地
在练习。
这次它拿到这样的一个程序:
Pascal:
readln(n);
for i:=1 to n do read(a[i]);
for i:=1 to n do for j:=1 to n do for k:=1 to n do for l:=1 to n do
if (a[i]=a[j]) and (a[i]<a[k]) and (a[k]=a[l]) then ans:=(ans+1) mod 1000000007;
writeln(ans);
C++:
scanf(“%d”,&n);
for (i=1; i<=n; i++) scanf(“%d”,&a[i]);
for (i=1; i<=n; i++) for (j=1; j<=n; j++) for (k=1; k<=n; k++) for (l=1; l<=n; l++)
if (a[i]==a[j] && a[i]<a[k] && a[k]==a[l]) ans=(ans+1)%1000000007;
printf(“%d\n”,ans);
LYK 知道了所有输入数据,它想知道这个程序运行下来会输出多少。
输入格式(program.in)
第一行一个数 n,第二行 n 个数,表示 ai。
输出格式(program.out)
一个数表示答案。
输入样例
4
1 1 3 3
输出样例
16
数据范围
对于 20%的数据 n<=50。
对于 40%的数据 n<=200。
对于 60%的数据 n<=2000。
对于 100%的数据 n<=100000,1<=ai<=1000000000。
其中均匀分布着 50%的数据不同的 ai 个数<=10,对于另外 50%的数据不同的 ai 个
数>=n/10。
思路:
我们现在分析一下这个c++代码
pcanf(“%d”,&n);
for (i=; i<=n; i++) scanf(“%d”,&a[i]);
for (i=; i<=n; i++) for (j=; j<=n; j++) for (k=; k<=n; k++) for (l=; l<=n; l++)
if (a[i]==a[j] && a[i]<a[k] && a[k]==a[l]) ans=(ans+)%;
printf(“%d\n”,ans);
这段代码里面有4重循环大概n==100就差不多爆时间
所以我们要优化
其中有两重循环可以简化为O(1);
那就是第一重和最后一重
就是询问有在这个数组里有几个和这个元素值相等的元素
我们可以把所有的元素值记录下来
然后离散化使之成为存储每个元素个数的数组
然后每个数组的值都是这个元素个数的平方
现在再看第二重和第三重循环
这个是用来比较大小的
于是
我想到了前缀和
就是把比当前元素个数的平方和记录下来
然后每次取值就用前缀和就好
经优化后成为一个O(n)时间复杂度的算法
来,上代码:
#include<cstdio>
#include<iostream>
#include<algorithm> #define mod 1000000007LL using namespace std; long long int b[],n,ans;
long long int sum[]; int a[],head; char ch; void qread(long long int &x)
{
x=;ch=getchar();
while(ch>''||ch<'') ch=getchar();
while(ch<=''&&ch>=''){x=x*+(int)(ch-'');ch=getchar();}
} int main()
{
qread(n);
for(int i=;i<=n;i++) qread(b[i]);
sort(b+,b+n+);
for(int i=;i<=n;i++)
{
if(b[i]!=b[i-]) head++;
a[head]++;
}
for(int i=;i<=head;i++) a[i]=a[i]*a[i]%mod,sum[i]=(sum[i-]+(a[i]%mod))%mod;
for(int i=;i<=head;i++) ans=(ans+((sum[i-]*a[i])%mod))%mod;
cout<<ans<<endl;
return ;
}
看程序写结果(program)的更多相关文章
- 在win下,如何用bat看程序运行的时间
		
上网搜了下用bat记录程序运行时间的方法,结果连google跳出的都是些什么ctime啥的- - 一点都不靠谱 傍晚问了几个大神,也大多都是ctime党,不过还好明哲造![跪跪跪] 在此mark 就比 ...
 - 使用 Java 程序写文件时,记得要 flush()
		
使用 Java 程序往磁盘写文件时碰到了这样的问题:文件写不全. 假如内容(StringBuffer/StringBuilder)有 100W 个字符,但是通过 Java 程序写到文件里的却不到 10 ...
 - 看图写代码---看图写代码  阅读<<Audio/Video Connectivity Solutions for Virtex-II Pro and Virtex-4 FPGAs >>
		
看图写代码 阅读<<Audio/Video Connectivity Solutions for Virtex-II Pro and Virtex-4 FPGAs >> 1.S ...
 - 微信小程序 写音乐播放器 slider组件 将value设置为0 真机测试滑块不能回到起点
		
最近在用微信小程序写一个音频播放页面,做时间进度的时候用到了slider插件,但是在自然播放完成,或者上/下切换的时候,将slider的value属性值设为0,开发工具上滑块会回到起点,有效.但是真机 ...
 - exe崩溃用windbgattach后有宝贵现场,可看程序退出线程等,千万不要清屏
		
exe崩溃用windbgattach后有宝贵现场,可看程序退出线程等,千万不要清屏
 - 编写第一个python程序(Your Firsr Program)
		
1)代码如下: 1 # This program says hello and asks for my name. 2 myName = input("What is your name?& ...
 - RabbitMQ学习之:(四)回头看刚才写的程序 (转贴+我的评论)
		
转自:http://lostechies.com/derekgreer/2012/03/18/rabbitmq-for-windows-hello-world-review/ 我的心得: 1. 在创建 ...
 - uva 110 Meta-Loopless Sorts 用程序写程序 有点复杂的回溯水题
		
题目要求写一个直接用比较排序的pascal程序,挺有趣的一题. 我看题目数据范围就到8,本来以为贪个小便宜,用switch输出. 然后发现比较次数是阶乘级别的,8的阶乘也是挺大的,恐怕会交不上去. 于 ...
 - 用CIL写程序:写个函数做加法
		
前言: 上一篇文章小匹夫为CIL正名的篇幅比较多,反而忽略了写那篇文章初衷--即通过写CIL代码来熟悉它,了解它.那么既然有上一篇文章做基础(炮灰),想必各位对CIL的存在也就释然了,兴许也燃起了一点 ...
 
随机推荐
- Oracle 查询并删除重复记录的SQL语句
			
查询及删除重复记录的SQL语句 1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select * from peoplewhere peopleId in (select ...
 - git 上传项目到github
			
1.本地新建文件夹GIT,Git Bash打开命令窗口, ①git config --global user.name "名字" eg: git config --global ...
 - Vue列表渲染
			
gitHub地址:https://github.com/lily1010/vue_learn/tree/master/lesson09 一 for循环数组 <!DOCTYPE html> ...
 - 初学Node(六)搭建一个简单的服务器
			
搭建一个简单的服务器 通过下面的代码可以搭建一个简单的服务器: var http = require("http"); http.createServer(function(req ...
 - arcgis andriod 长按获得当前信息
			
// 长按显示鼠标点坐标及比例尺 private class myLongPressListener implements OnLongPressListener { private static f ...
 - Sharepoint 2013 开启App和配置App
			
在任何站点中,点Add App,然后点Sharepoint Store,如果没有Enable apps,打开app store的时候出出现错误: Sorry, apps are turned off. ...
 - Struts2原理
			
Struts 2以WebWork优秀的设计思想为核心,吸收了Struts 1的部分优点,建立了一个兼容WebWork和Struts 1的MVC框架,Struts 2的目标是希望可以让原来使用Strut ...
 - Python数据结构与算法--List和Dictionaries
			
Lists 当实现 list 的数据结构的时候Python 的设计者有很多的选择. 每一个选择都有可能影响着 list 操作执行的快慢. 当然他们也试图优化一些不常见的操作. 但是当权衡的时候,它们还 ...
 - IIS下打印报表到Excel
			
阅读本文之前,请先看上一篇文章<.NET下Excel报表的打印>. 上一篇文章<.NET下Excel报表的打印>介绍了关于报表打印到Excel文件中的方法.若要把项目通过IIS ...
 - Enterprise Library +Caliburn.Micro+WPF      CM框架下使用企业库验证,验证某一个属性,整个页面的文本框都变红的原因
			
我用的是CM这个框架做的WPF,在用企业库的验证的时候,我用标签的方式给一个属性加了不能为空的验证,但整个页面的所有控件的外面框都变红了.原因是CM框架的绑定方式是直接X:Name="你的属 ...