序言:博客是為了別人寫?還是自己寫。在我看來,博客可以幫助我記錄自己的知識的歡愉,以別人的角度去審視自己的想法,博客幫助我記錄自己的成長,也等待著一位位有緣人。好了,不多說了,進入正題。回去做了做coderbeginner166的題,看到了一串非常有感覺的代碼,還是一樣的簡潔明瞭。此處,原題鏈接ht... ...
序言:博客是為了別人寫?還是自己寫。在我看來,博客可以幫助我記錄自己的知識的歡愉,以別人的角度去審視自己的想法,博客幫助我記錄自己的成長,也等待著一位位有緣人。
好了,不多說了,進入正題。回去做了做coderbeginner166的題,看到了一串非常有感覺的代碼,還是一樣的簡潔明瞭。此處,原題鏈接
https://atcoder.jp/contests/abc166/tasks/abc166_e
原題解析在此
解析:滿足題目要求的可能性就是這樣,數理化分析後,在左邊(較小數)和右邊對應較大數分別有一個單變數表達式,找到相等的就可以了。
代碼如下:
#include<stdio.h> int main(){ int i,n,a[200002],b[200002]={0}; long long c=0; scanf("%d",&n); for(i=0;i<n;i++)scanf("%d",&a[i]); for(i=0;i<n;i++){ if(i+a[i]<=n)b[i+a[i]]++; //較小數的算式 if(i-a[i]>=0)c+=b[i-a[i]];//較大數算式與較小數算式相等時,加上這些可能,由於較大數在較小數後面出現,不會出現漏記的情況,同時 //極大的節省了計算時間和記錄空間,完美,這是我給出的圖解(ps:不要計較美術,問就是靈魂畫師) } printf("%lld",c); }