文章目录
- 思路
- AC CODE
- 总结
题目链接:2580. 统计将重叠区间合并成组的方案数
思路
- 一个区间合并的板子,计算出区间数目之后,每个区间都有放左和放右两种选法,所以最后的答案就是 2 k 2^k 2k。
- 但是需要用c进行二维数组的排序,我不会
qsort()
,就写了一个数组的快排,然后用了快速幂计算答案。
AC CODE
void cmp(int **i, int **j){int *tmp = *i;*i = *j;*j = tmp;
}void quick_sort(int **q, int l, int r){if(l >= r) return;int i = l - 1, j = r + 1, x = q[(l + r) >> 1][0];while(i < j){do i++; while(q[i][0] < x);do j--; while(q[j][0] > x);if(i < j) cmp(&q[i], &q[j]);}quick_sort(q, l, j); quick_sort(q, j + 1, r);
}long long qmi(long long a, long long b, int mod){long long res = 1 % mod;while(b){if(b & 1) res = (res * a) % mod;a = a * a % mod;b >>= 1;}return res;
}int countWays(int** ranges, int rangesSize, int* rangesColSize) {const int mod = 1e9 + 7;int st = -1, ed = -1;long long res = 0;quick_sort(ranges, 0, rangesSize - 1);for(int i = 0; i < rangesSize; ++i){int seg = ranges[i][0];if(seg <= ed) ed = fmax(ed, ranges[i][1]);else{res++;st = seg;ed = ranges[i][1];}}res = qmi(2, res, mod);return res % mod;
}
总结
- 交换一维数组时,用了取二维地址然后交换,跟交换变量一个道理。
q[i]
是一个指向一维数组的一级指针,所以需要取地址。