bistuacm 2023年第四場高階訓練賽題解

2021-09-19 01:29:01 字數 1577 閱讀 5327

(因vjudge經常崩潰而無法交題,而北交平台偶爾題目亂碼,因此用這種形式)

難度:cf 1300~1800原題

知識點:模擬

題意:先求出所有數的和sum,然後從左到右找到字首和大於等於sum的一半即可。

#includeusing namespace std;

int main()

for(i=0;i=sum)break;

}cout《知識點:字串,暴力列舉

題意:一次操作可新增乙個字元,或copy已有字串(一共只能copy一次)問最少運算元。

解法:由於n很小(只有100),因此可o(n^2)暴力查詢最大的a(0~ i)=a(i+1~2i)的相同子串。

#includeusing namespace std;

int main()

else cout<<0;

cout<<" ";

}if(a[i]=='a')cout<<"1";

else cout<<"0";

}

知識點:樹形dp,dfs

題意:對於給定有根樹,對每個葉子染色,對於i從1到n,求快樂節點不小於i個的最小染色的顏色數量k。所謂快樂節點指:以該節點為根的子樹,所有葉子的顏色不同。

解法:設葉子總數為m。顯然,i=n時k為m,i≤p時k為1。這時可以觀察到,假設所有葉子的權值為1,每個節點的權值為它所有孩子權值之和,那麼這個權值就是該節點作為「快樂節點」的最小染色數。因此可以用乙個dp[i]表示第i個節點的權值,然後dfs求所有節點權值,最後排序後依次從小到大輸出即可。

#includeusing namespace std;

vectorg[111111];

int dp[111111]=;

void dfs(int x)

dfs(1);

sort(dp+1,dp+1+n);

for(i=1;i<=n;i++)cout《知識點:貪心

題意:相鄰兩數x和y合併,新數可選擇為x-y或y-x。求最終只剩乙個數的最大值。

解法:顯然,若所有數有負有正,那麼sum(abs(a[i]))即為所求。若全為正或全為負,則要犧牲絕對值最小的那個數,最終的sum-2min(abs)即可。

注意要處理n=1的特解。

#includeusing namespace std;

long long a[555555];

int main()

if(n==1)

long long power(long long a,long long b)

return res;

}long long c[111111];

char in[111111];

int main()

for(i=0;ilong long sum=0;

int chu=(n+1)/k;

long long q=power(b,k)*power(inv(a),k)%mod;

if(q==1)

cout<<(sum+mod)%mod;

return 0;

}for(i=0;icout<}

bistuacm 2023年第三場新生訓練賽題解

a 知識點 排序 桶 題意 給乙個陣列,求其中所有不同非零元素的種類數。解法一 對陣列從小到大排序。很明顯相同的元素排序後一定相鄰,因此種類數 n 相鄰相等的對數 注意要特判0是否存在。時間複雜度o nlogn 空間複雜度o 1 解法二 注意到元素的範圍是 1e5 1e5,因此可以開乙個20萬大小的...

bistuacm 2023年第 場新生訓練賽題解

知識點 列舉 題意 尋找距離陣列某個數最接近的a i k且b i 1的數。解法 按題意模擬即可。includeusing namespace std int main for t 0 t cout 10 t 知識點 數學 題意 找到大於a,且各數字只含乙個非0數字的數,輸出其和a的差。解法 求出a的...

bistuacm 2023年新生訓練賽 第 場題解

比賽難度 cf 1000 1500 知識點 模擬 題意 乙個陣列,每次操作可以增加乙個數或刪除乙個數。問最少多少次操作可以讓mex k?mex值陣列不存在的最小非負整數 解法 按題意模擬即可。0到k 1若不存在則增加之。k若存在則刪除之。includeusing namespace std int ...