E Magic Stones (思維好題)

2021-09-10 15:41:11 字數 917 閱讀 7428

題意:

給出a陣列,b陣列,下標為2~n-1 可以進行操作,a[i]=a[i+1]+a[i-1]-a[i],問進行若干次操作,能否將a陣列變成b陣列 。

思路:真是一道很巧妙的題目。對三個數字a[i-1],a[i],a[i]+1,d1=a[i]-a[i-1],d2=a[i+1]-a[i],a[i]可以這樣看,a[i]=a[i-1]+a[i]-a[i-1]=a[i-1]+d1,經過操作之後,a[i]=a[i+1]+a[i-1]-a[i]=a[i-1]+a[i+1]-a[i]=a[i-1]+d2,此時重新計算d1,d2,d1=a[i+1]-a[i],d2=a[i]-a[i+1],可以看到其實每次操作就是將d1,d2交換,那麼開頭結尾是固定的,a[1],a[n],保持不變,那麼如果a[1]=b[1],a[n]=b[n],每次操作只是旋轉距離差,a,b陣列相鄰兩個數字距離差形成的陣列相同0,那麼經過若干次旋轉操作之後,a陣列一定可以變成b陣列,否則不能。

#includeusing namespace std;

typedef long long ll;

typedef pairpii;

typedef vectorvi;

#define rep(i,a,b) for(int i=(a);i<(b);i++)

#define fi first

#define se second

#define de(x) cout<<#x<<"="<=(a);--i)

const int n=1e5+5;

ll a[n],b[n];

mapmp;

int main()

for(int i=1;i<=n;++i)

} } if(b[1]!=a[1]||b[n]!=a[n])

cout<<"yes"

}

D Perfect Groups 思維好題

一道挺不錯的題目。定義乙個陣列的答案 將這個陣列分成k組,每組裡面任意一對數字乘積都是平方數,k要最小。題目給出乙個n個長度的大小,要你求每個子陣列的答案,最後輸出答案為1.2,3 n的子陣列各有多少個。n最大是5000,子陣列個數是n n 1 2,n平方也是沒問題的,因此我們只要考慮,如果o 1 ...

D Cleaning 思維好題 字首)

題意 n個數,現在你可以取出相鄰的都不為0的數,使得他們同時減1,如果乙個堆為0了,它並不會消失掉,此時我們有至多一次機會操作,交換相鄰兩個數的位置,問能不能使得全部的數都變為0.思路 首先發現,端點一定要 後面的值,不然肯定不成立。於是a2 a1,減了之後a2 a2 a1 此時a2變成端點,同理可...

sdnu oj 1283 山師好男友 思維

參考 可以看出,被按了奇數次數的燈最後是開著的,而被按了偶數次數的燈最後是關著的。因為是從 2 開始按的,所以如果乙個數有偶數個因子那就會被按奇數次,如果有奇數個因子就會被按偶數次。所以轉化為求 a,b 內有偶數個因子的數 這就會涉及到質因子分解定理,即任何正數都能被分解成多個質數的冪次乘積的形式 ...