Тема ссылки: точка I ах ╭ (╯ ^ ╰) ╮
С учетом эффекта:
Have
множество монет, каждая монета имеет две
В ответ на просьбу прийти
монеты максимальное значение
ограничение набора монет:
Не торопитесь, чтобы не принимать
умолять
Проблемно-разрешающие идеи:
Потому что
Ограничения, поэтому не локальный оптимум глобальный оптимум ,
но думать об этом, если предположить , что ток принял
монет, и является оптимальным
учитываякак выиграть монеты:
Прямые принятьчто максимальный ток монеты может принять
Заменить первый дубль
монеты, а затем взять самую большую группу монеткоторыенастоящее время могут принимать
Бездумный не нашел третий случая, третий случай уже включен в оптимальном решении в выше
так записывать он может принимать различные монеты и получил первые из нескольких
с тем, что вы можете поддерживать очереди приоритета
Core: + жадные трахает очередь приоритетов
#include<bits/stdc++.h>
#define rint register int
#define deb(x) cerr<<#x<<" = "<<(x)<<'\n';
using namespace std;
typedef long long ll;
const int maxn = 2e5 + 5;
int T, n, ans[maxn], th2[maxn], th[maxn];
struct node1{
int x, id, th;
bool operator < (const node1 &A) const{
return x < A.x;
}
};
struct node2{
int x, y, id;
bool operator < (const node2 &A) const{
return x + y < A.x + A.y;
}
};
priority_queue <node1> q1;
priority_queue <node2> q2;
int main() {
scanf("%d", &T);
while(T--){
scanf("%d", &n);
while(!q1.empty()) q1.pop();
while(!q2.empty()) q2.pop();
for(int i=1, a, b; i<=n; i++){
scanf("%d%d", &a, &b);
th2[i] = b, th[i] = 0;
q1.push({a, i, 0});
q2.push({a, b, i});
}
int f = 0, prex, preid, a, b;
for(int i=1; i<=n*2; i++){
while(th[q1.top().id]!=q1.top().th && !q1.empty()) q1.pop();
while(th[q2.top().id]!=0 && !q2.empty()) q2.pop();
a = q1.top().x;
b = (f&&!q2.empty()) ? q2.top().x + q2.top().y - prex : 0;
if(a <= b){ // 取 2个
f = 0;
ans[i] = ans[i-1] + b;
th[q2.top().id] = 2;
q1.push({prex, preid, --th[preid]});
q2.pop();
} else { // 取 1个
f = 1;
ans[i] = ans[i-1] + a;
prex = q1.top().x, preid = q1.top().id;
q1.pop();
if(!th[preid]) q1.push({th2[preid], preid, 1});
++th[preid];
}
printf("%d%c", ans[i], " \n"[i==n*2]);
}
}
}