afo倒計時...感覺10月28日就完了。
3道題都是洛谷某次月賽的題目。
t1 斐波拉契
題解:
這道題一開始我還不太懂什麼意思,就覺得很懵逼,推了很久也沒有發現什麼規律。差點就建了一棵樹跳lca。其實完全沒有必要,還是好想,我的思路就是記錄每乙個節點是哪一代出生的,然後你會發現每個節點的兒子與他的父親相差都為乙個斐波拉契數列中的數,於是我們可以這樣想,就是按照找lca的思路來跳,然後每次出生靠後的節點往上跳,每次跳的值就是斐波拉契數列中的它出生那一代的項數。資料範圍是10^12,所以要處理到菲波拉切數列的60項即可。避免了建樹,還是比較好想的。
**如下:
#includeusingview codenamespace
std;
const
int maxn=1e6+7
;long
long
f[maxn];
intm;
long
long
a,b;
inttot;
intma,mb;
bool
flag;
inline
long
long
read()
long
long lca(long
long x,long
long
y) }
}else}}
}returnx;}
intmain()
else
}for(int j=2;j<=60;j++)
}printf(
"%lld\n
",lca(a,b));}}
return0;
}
t2 數顏色
題解:
暴力做法是個人都會寫,考試的時候只打了暴力做法,原本以為只能得30分,結果出題人造的資料比較良心,還是水到了60分。其實正解二分答案我覺得很難想到,所以我還是選擇往資料結構的方面來想。
動態開點線段樹即可,每一棵線段樹維護每一種顏色,顏色一共有300000種,動態開點足矣。然後交換的話就是簡單的單點修改。坑點:注意每次單點修改時要將原序列中的顏色交換,還需要小小的卡常。
**如下:
#includeusingview codenamespace
std;
const
int maxn=300005
;int lc[maxn*30],rc[maxn*30
],root[maxn];
intn,m;
inta[maxn];
int sum[maxn*30
];int
cnt;
intopt,l,r,x,c;
inline
intread()
void update(int &rt,int l,int r,int pos,int
v)int query(int rt,int l,int r,int l1,int
r1)int
main()
for(int i=1;i<=m;i++)
else
}return0;
}
t3 分組
題解:
這道題的題面很長,對於這種題面很長的題,讀題時就需要耐心,你發現你讀完了題面就能得到8分。這道題資料範圍寫的非常明確,還是很好得分的。對於k=1的情況,我們只需要讓相加為平方數的數不在乙個序列中即可。k=2時,需要用並查集來輔助,具體過程見**,又是並查集的神奇運用。
#includeusingview codenamespace
std;
const
int maxn=1e6+7
;bool
power[maxn];
intn,k;
long
long
sum;
inta[maxn];
bool
flag;
intans[maxn];
intcnt;
intlast;
intmaxx;
intvis[maxn];
intfa[maxn];
intbiaoji[maxn];
intget(int
x)void
work1()
}if(flag)
vis[a[i]]=1
; }
}void
work2()
if(j*jcontinue
;
if(j*j-a[i]>maxx) break
;
if(vis[j*j-a[i]]&&j*j-a[i]!=a[i])
}if(flag)
last=i;}}
}else
int f1=get(a[i]),f2=get(a[i]+maxx),f3=get(j*j-a[i]),f4=get(j*j-a[i]+maxx);
if(f1==f3)
else}}
if(flag)
last=i;}}
vis[a[i]]++;
}}int
main()
if(k==1
) work1();
else
work2();
printf(
"%d\n
",cnt+1
);
for(int i=cnt;i>=1;i--) printf("
%d "
,ans[i]);
printf("\n
");return0;
}
NOIP模擬 修路
這題第一眼看上去有些懵逼,還以為是dp。第二眼,哦,這麼裸的最小生成樹,2分鐘打完,拍都沒對,自信100分。最終100分。每條邊的權值減去連個節點的權值,所有的邊做一次最小生成樹就好了。include include include include include define fo i,a,b f...
NOIP模擬 項鍊
經過一番周折,bob找到了alice,為了安慰alice驚魂未定的心,bob決定給alice買一條手鍊,這條手鍊由m個珍珠組成,每個珍珠上刻著不同的小寫字母。當alice看到一些字母按照一定的順序排列成的字串時,就會產生一定的愉悅值。bob現在可以在這m個珍珠上刻上字母,現在他想知道,如何刻字母可以...
NOIP模擬 幻象
phantom是一位愛思考的哲 學家。最近phantom得到了森 妖精的真傳。在他練功的時候,每秒他的思緒中都有一定的概率浮現出奇 異的幻象,持續x秒的幻象將產生 空格 的幻象值。phantom練功發自真心,他想知道,在n秒內他期望產生的幻象值是多少。等我比賽完之後,我們才知道 空格 是x2 所以比...