typedeflonglong ll; constint MAXN = 1e5 + 5; constint MOD = 1e9 + 7; classSolution { private: int cf[MAXN]; vector<int> used; public: intmaxSumRangeQuery(vector<int>& nums, vector<vector<int>>& requests){ for (int i = 0; i < requests.size(); i++){ int a = requests[i][0], b = requests[i][1]; cf[a]++; cf[b + 1]--; } int sum = 0; for (int i = 0; i < nums.size(); i++){ sum += cf[i]; used.push_back(sum); } sort(used.begin(), used.end(), greater<int>()); sort(nums.begin(), nums.end(), greater<int>()); ll ans = 0; for (int i = 0; i < used.size(); i++){ ans += ((ll)used[i] * (ll)nums[i]); } return ans % MOD; } };
classSolution { private: int bottom[65], top[65], left[65], right[65]; int InD[65] = { 0 }; vector<int> H[65]; //边集 bool vis[65][65] = { false }; int n, m; queue<int> myque; public: boolisPrintable(vector<vector<int>>& targetGrid){ n = targetGrid.size(), m = targetGrid[0].size(); for (int i = 1; i <= 60; i++) { //初始化 top[i] = left[i] = 0x3f3f3f3f; bottom[i] = right[i] = -1; } for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { int curcolor = targetGrid[i][j]; bottom[curcolor] = max(bottom[curcolor], i); //最大下边界 right[curcolor] = max(right[curcolor], j); //以下同理 top[curcolor] = min(top[curcolor], i); left[curcolor] = min(left[curcolor], j); } } //确定所有颜色的上下左右边界 for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { int curcolor = targetGrid[i][j]; for (int faColor = 1; faColor <= 60; faColor++) { if (faColor == curcolor || vis[faColor][curcolor]) continue; //重边或者重点,跳过。 if (top[faColor] <= i && i <= bottom[faColor] && left[faColor] <= j && j <= right[faColor]) { //fa颜色集合包含了curcolor集合 H[faColor].push_back(curcolor); //说明两颜色存在偏序关系 vis[faColor][curcolor] = true; InD[curcolor]++; } }
} } /*以下为拓扑排序,通过拓扑排序判断这些偏序关系即有向图,是否存在环,有环说明两颜色集合互相包含*/ int cnt = 0; for (int i = 1; i <= 60; i++) if (InD[i] == 0) { myque.push(i); cnt++; } while (!myque.empty()) { int u = myque.front(); myque.pop(); for (int i = 0; i < H[u].size(); i++) { int v = H[u][i]; InD[v]--; if (InD[v] == 0) { myque.push(v); cnt++; } } } return (cnt == 60); } };