看程式寫結果(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]
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]
lyk 知道了所有輸入資料,它想知道這個程式執行下來會輸出多少。
輸入格式(program.in)
第一行乙個數 n,第二行 n 個數,表示 ai。
輸出格式(program.out)
乙個數表示答案。
輸入樣例
41 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=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]1)%1000000007
;printf(「%d\n」,ans);
這段**裡面有4重迴圈大概n==100就差不多爆時間
所以我們要優化
其中有兩重迴圈可以簡化為o(1);
那就是第一重和最後一重
就是詢問有在這個陣列裡有幾個和這個元素值相等的元素
我們可以把所有的元素值記錄下來
然後離散化使之成為儲存每個元素個數的陣列
然後每個陣列的值都是這個元素個數的平方
現在再看第二重和第三重迴圈
這個是用來比較大小的
於是我想到了字首和
就是把比當前元素個數的平方和記錄下來
然後每次取值就用字首和就好
經優化後成為乙個o(n)時間複雜度的演算法
來,上**:
#include#include#include
#define mod 1000000007ll
using
namespace
std;
long
long
int b[100001
],n,ans;
long
long
int sum[100001
];int a[100001
],head;
char
ch;void qread(long
long
int &x)
}int
main()
for(int i=1;i<=head;i++) a[i]=a[i]*a[i]%mod,sum[i]=(sum[i-1]+(a[i]%mod))%mod;
for(int i=1;i<=head;i++) ans=(ans+((sum[i-1]*a[i])%mod))%mod;
cout
return0;
}
看程式寫結果 program
看程式寫結果 program time limit 1000ms memory limit 64mb 題目描述 lyk 最近在準備 noip2017 的初賽,它最不擅長的就是看程式寫結果了,因此它拼命地 在練習。這次它拿到這樣的乙個程式 scanf d n for i 1 i n i scanf d...
看程式寫結果
看程式寫結果 a 乙個類的靜態 塊,構造 塊,構造方法的執行流程 靜態 塊 構造 塊 構造方法 b 靜態的內容是隨著類的載入而載入 靜態 塊的內容會優先執行 c 子類初始化之前先會進行父類的初始化 結果是 靜態 塊fu 靜態 塊zi 構造 塊fu 構造方法fu 構造 塊zi 構造方法zi class...
看程式寫結果
看程式寫結果 program time limit 1000ms memory limit 64mb 題目描述 lyk最近在準備noip2017的初賽,它最不擅長的就是看程式寫結果了,因此它拼命地在練習。這次它拿到這樣的乙個程式 pascal readln n for i 1 to n do rea...