差分数组详细讲解:
差分数组是个啥?能干啥?怎么用?(差分详解+例题)_From now on...的Blogs-CSDN博客_差分数组
绝绝子!!!很好的诠释了差分数列的用途:其实差分数组是一个辅助数组,从侧面来表示给定某一数组的变化,一般用来对数组进行区间修改(同时加或减)的操作,作用就是求多次进行区间修改后的数组喽!
(我还发现个规律区间问题好像都得struct+好排序)
一开始写的说内存爆了,又vector又set的果然不是最优算法..........
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long ll;
vector<set<int>> v(100005);
int n, m;
int main()
{
cin >> n >> m;
for (int i = 1, l, r, d; i <= m; i++){
cin >> l >> r >> d;
for (int j = l; j <= r; j++){
v[j].insert(d);
}
}
int MAX_N = -1;
for (int i = 1; i <= n;i++){
int temp = v[i].size();
MAX_N = max(MAX_N, temp);
}
for (int i = 1; i <= n; i++){
if(MAX_N==v[i].size()){
cout << i << endl;
return 0;
}
}
// for (int i = 1; i <= n;i++){
// for (int p:v[i])
// cout << p << " ";
// cout << endl;
// }
}
ACCODE:
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long ll;
int n, m;
struct node {
int st, ed, d;
}a[100005];
int num[100005];
bool cmp(node n1, node n2) {
if (n1.d != n2.d)
return n1.d < n2.d;
else
return n1.st < n2.st;
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= m; i++) {
cin >> a[i].st >> a[i].ed >> a[i].d;
}
sort(a + 1, a + 1 + m, cmp);
int l = a[1].st, r = a[1].ed;
for (int i = 2; i <= m; i++) {
if (a[i].st <= r && a[i].d == a[i - 1].d) {
r = max(r, a[i].ed);
}
else {
num[l]++;
num[r + 1]--;
l = a[i].st;
r = a[i].ed;
}
}
num[l]++;
num[r + 1]--;
int maxnn = -1;
int sum = 0;
int res = 0;
for (int i = 1; i <= n; i++) {
sum += num[i];
if (sum > maxnn) {
maxnn = sum;
res = i;
}
}
cout << res;
}