Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में आयत क्षेत्रफल II (Rectangle Area II) - ओवरलैपिंग आयतों का कुल क्षेत्रफल


समस्या विवरण

हमें अक्ष-संरेखित (axis-aligned) आयतों की एक सूची दी गई है। प्रत्येक आयत rectangle[i] = {x1, y1, x2, y2} द्वारा दर्शाया गया है, जहां (x1, y1) निचले-बाएं कोने का बिंदु है और (x2, y2) ऊपरी-दाएं कोने का बिंदु है।

हमें तल (plane) में सभी आयतों द्वारा कवर किए गए कुल क्षेत्रफल को ज्ञात करना है। उत्तर बहुत बड़ा हो सकता है, इसलिए हम मॉड्यूलो 10^9 + 7 का उपयोग कर सकते हैं।

उदाहरण

इनपुट: {{0,0,2,2},{1,0,2,3},{1,0,3,1}}

आउटपुट: 6

समाधान दृष्टिकोण (स्वीप लाइन एल्गोरिदम)

यह समस्या स्वीप लाइन एल्गोरिदम और निर्देशांक संपीड़न (coordinate compression) का उपयोग करके हल की जाती है:

  1. सभी अद्वितीय x-निर्देशांक एकत्र करें और उन्हें क्रमबद्ध करें।
  2. प्रत्येक आयत के लिए दो घटनाएं (events) बनाएं: प्रवेश (y1, +1) और निकास (y2, -1)।
  3. घटनाओं को y-निर्देशांक के अनुसार क्रमबद्ध करें।
  4. स्वीप लाइन को y-अक्ष के साथ ऊपर ले जाएं, सक्रिय x- अंतराल की लंबाई बनाए रखें।
  5. कुल क्षेत्रफल संचित करें: क्षेत्रफल += (वर्तमान_y - पिछला_y) * सक्रिय_लंबाई।

कार्यकारी प्रोग्राम

#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
const int MOD = 1e9 + 7;

class Solution {
public:
    lli add(lli a, lli b) {
        return ((a % MOD) + (b % MOD)) % MOD;
    }
    
    map<int, int> compress(vector<vector<int>>& v) {
        vector<int> temp;
        for (int i = 0; i < v.size(); i++) {
            temp.push_back(v[i][0]);
            temp.push_back(v[i][2]);
        }
        sort(temp.begin(), temp.end());
        map<int, int> ret;
        int idx = 0;
        for (int i = 0; i < temp.size(); i++) {
            if (!ret.count(temp[i])) {
                ret[temp[i]] = idx++;
            }
        }
        return ret;
    }
    
    int rectangleArea(vector<vector<int>>& v) {
        vector<int> xv;
        xv.push_back(0);
        for (int i = 0; i < v.size(); i++) {
            xv.push_back(v[i][0]);
            xv.push_back(v[i][2]);
        }
        sort(xv.begin(), xv.end());
        xv.erase(unique(xv.begin(), xv.end()), xv.end());
        
        map<int, int> index;
        int idx = 0;
        for (int i = 0; i < xv.size(); i++) {
            index[xv[i]] = i;
        }
        
        vector<int> count(index.size());
        vector<vector<int>> events;
        for (int i = 0; i < v.size(); i++) {
            int x1 = v[i][0], y1 = v[i][1];
            int x2 = v[i][2], y2 = v[i][3];
            events.push_back({y1, x1, x2, 1});
            events.push_back({y2, x1, x2, -1});
        }
        sort(events.begin(), events.end());
        
        lli ret = 0;
        lli sum = 0, currentY = 0;
        for (int i = 0; i < events.size(); i++) {
            lli y = events[i][0];
            int x1 = events[i][1], x2 = events[i][2];
            int sig = events[i][3];
            
            ret = add(ret, (y - currentY) * sum);
            currentY = y;
            
            for (int j = index[x1]; j < index[x2]; j++) {
                count[j] += sig;
            }
            
            sum = 0;
            for (int j = 0; j < count.size(); j++) {
                if (count[j] > 0) {
                    sum += (xv[j + 1] - xv[j]);
                }
            }
        }
        return ret % MOD;
    }
};

int main() {
    Solution ob;
    vector<vector<int>> v = {{0,0,2,2},{1,0,2,3},{1,0,3,1}};
    cout << ob.rectangleArea(v);
    return 0;
}

आउटपुट

6
  1. C++ में डायगोनल ट्रैवर्स II C++ में डायगोनल ट्रैवर्स II

    मान लीजिए हमारे पास nums नामक लिस्ट ऑफ लिस्ट है, हमें nums के सभी एलिमेंट्स को डायगोनल क्रम में दिखाना है।इसलिए, यदि इनपुट हैतो आउटपुट होगा [1,6,2,8,7,3,9,4,12,10,5,13,11,14,15,16]इसे हल करने के लिए, हम निम्न चरणों का पालन करेंगे:एक ऐरे ret परिभाषित करेंएक 2D ऐरे v परिभाषित करेंi := 0 से शुरू करें,

  1. C++ में वृत्त और आयत के ओवरलैप की जांच C++ में वृत्त और आयत के ओवरलैप की जांच

    मान लीजिए हमारे पास एक वृत्त है जिसे (त्रिज्या, xc, yc) से दर्शाया जाता है, जहां (xc, yc) केंद्र के निर्देशांक हैं। हमारे पास एक अक्ष-संरेखित आयत भी है जिसे (x1, y1, x2, y2) से दर्शाया जाता है, जहां (x1, y1) निचले-बाएं कोने के निर्देशांक हैं और (x2, y2) ऊपरी-दाएं कोने के निर्देशांक हैं। हमें जांचना

  1. C++ में आयत क्षेत्रफल गणना C++ में आयत क्षेत्रफल गणना

    मान लीजिए हम 2D तल में दो समकोणीय आयतों द्वारा कवर किए गए कुल क्षेत्रफल को ढूंढना चाहते हैं। प्रत्येक आयत को उसके निचले बाएं कोने और ऊपरी दाएं कोने द्वारा परिभाषित किया जाता है।हल करने के चरण= H या D <= F, तो(C - A) * (D - B) + (G - E) * (H - F) वापस करेंएक सरणी h परिभाषित करें, इसमें A, C, E, G डाल