题目在此
这次没打,因为比赛是在夜里开始的,所以就补题呗,题目挺难的(对于我来说,主要是我太菜了)。
就简单的计数字母,循环判断一下就可以了。
题解:
struct node{
int begin,end;
int ip; //编号
int pos; //坐的位置
bool operator< (const node& a)const{
return end > a.end;//最小值优先
}
}arr[10010];
bool cmp(node a,node b){
return a.begin < b.begin;
}
class Solution {
public:
int smallestChair(vector<vector<int>>& t, int tf) {
int n = t.size();
for (int i = 0; i < n; i ++){
arr[i].begin = t[i][0];
arr[i].end = t[i][1];
arr[i].ip = i;
}
sort(arr,arr+n,cmp);
set<int> qs; //记录空闲位置
for (int i = 0; i < n+10; i ++) qs.insert(i);//事先把空位置预处理一下
priority_queue<node> qn; //记录在位置上的人
for (int i = 0; i < n; i ++){
auto tp = arr[i];
while(!qn.empty()&&qn.top().end <= tp.begin){
qs.insert(qn.top().pos);
qn.pop();
}
if (tp.ip == tf){
return *(qs.begin());
}
//放到座位上
tp.pos = *(qs.begin());
qs.erase(qs.begin());
qn.push(tp);
}
return -1;
}
};
思路:借鉴这场比赛排名第八那名大佬的的
差分+标记
因为题目要求的原因:混合颜色的集合不相同,要分开写。
所以可以发现:最终求的所有的区间起点的终点一定是距离起点最近的一个题目给出区间的起点或终点。
typedef long long LL;
class Solution {
public:
vector<vector<LL> > splitPainting(vector<vector<int>>& segments) {
LL sum[100000+ 10] = {0};
bool vis[100000+ 10] = {0}; //用一个标记把所有的起点终点都标记了
for (auto t: segments) {
int a = t[0], b = t[1];
sum[a] += t[2];
sum[b] -= t[2];
vis[a] = true; //都标记
vis[b] = true;
}
LL cnt = 0;
int p = 0;
vector<vector<LL> > res;
for (int i=1; i<= 100001; ++i) {
if (cnt > 0 && vis[i] ) { //找到终点,cnt > 0 为了避免此时这个标记是起点
res.push_back({p,i,now}); //加入答案集合
}
if (vis[i]) p = i;//记录所求区间起点
cnt += sum[i]; //前缀和
}
return res;
}
};
未完待续(可能 已经完了)