Codeforces Round 775(Div.2) Problem C Weird Sum(匿名函数的使用)
原題鏈接
C++ Lambda函數(匿名函數)的使用方法
? 首先了解一下 C++ 匿名函數的基本使用方法
基本語法
//[捕獲列表](參數列表)->返回類型{函數體} auto f = [](int a, int b)->int {return a + b; };捕獲列表
? []:空捕獲列表,Lambda不能使用所在函數中的變量。
? [&]:隱式捕獲列表,Lambda體內使用的局部變量都按引用方式傳遞。
? [=]:隱式捕獲列表,Lambda體內使用的局部變量都按值傳遞。
返回類型
? 可以不填,默認為return語句返回值的返回類型。
應用
? sortsortsort排序
auto cmp = [&](pair<int, int> p1, pair<int, int> p2){return p1.second < p2.second;};sort(v.begin(), v.end(), cmp); sort(v.begin(), v.end(), [&](auto a, auto b){return a.second < b.second;});本題題意
? 給一個n?mn*mn?m的表格,每個單元格里面有一個數字,代表一種顏色,求所有兩兩相同顏色的單元格的曼哈頓距離之和。
思路
? 1.用map<int,pair<int,int>>map<int, pair<int,int>>map<int,pair<int,int>>記錄所有顏色所在的單元格。
? 2.對某一種顏色,我們將其橫坐標排序,遍歷每一個橫坐標,假設當前位置為iii,我們記錄前面所有的橫坐標總個數cntcntcnt以及所有橫坐標之和sumsumsum,不難證明,當前橫坐標和前面所有橫坐標的距離之和為cnt?i?sumcnt * i - sumcnt?i?sum,因此,我們可以得到當前顏色的所有橫坐標兩兩組合的距離之和,并且由于我們是從小到大枚舉,所以得到的答案就是兩兩橫坐標距離差的絕對值之和,即曼哈頓距離的要求。
? 3.同樣的,我們對縱坐標進行操作,最后兩者相加即是答案。
代碼
#include <iostream> #include <algorithm> #include <vector> #include <map> using namespace std; int main() {int n, m;map<int, vector<pair<int, int>>> mp;cin >> n >> m;for(int i = 0; i < n; i ++)for(int j = 0; j < m; j ++){int x;cin >> x;mp[x].push_back({i, j});}// auto cmp = [&](pair<int, int> p1, pair<int, int> p2){// return p1.second < p2.second;// };auto sol = [&](vector<pair<int, int>> v){long long res = 0;sort(v.begin(), v.end());long long cnt = 0, sum = 0;for(auto &[i, j] : v){res += i * cnt - sum;sum += i;cnt ++;}cnt = sum = 0;// sort(v.begin(), v.end(), cmp);sort(v.begin(), v.end(), [&](auto a, auto b){return a.second < b.second;});for(auto &[j, i] : v){res += i * cnt - sum;sum += i;cnt ++;}return res;};long long ans = 0;for(auto &[c, v] : mp)ans += sol(v);cout << ans << endl;return 0; }總結
以上是生活随笔為你收集整理的Codeforces Round 775(Div.2) Problem C Weird Sum(匿名函数的使用)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#无参构造方法
- 下一篇: 格式化什么意思?格式化了数据还能恢复吗?