四川住房建设厅网站首页,科技背景图,网站页面相似度检测,哈尔滨建设网登录正题
纪中题目链接:https://jzoj.net/senior/#main/show/3487 题目大意
有两个东西 一个是表示可以选择这个东西#xff0c;然后加x的价值。 一个是在这个操作之前不可以超过x个东西。 求最大价值 解题思路
我们考虑每个不能超过的操作#xff0c;我们留下价值最大的。…正题
纪中题目链接:https://jzoj.net/senior/#main/show/3487 题目大意
有两个东西 一个是表示可以选择这个东西然后加x的价值。 一个是在这个操作之前不可以超过x个东西。 求最大价值 解题思路
我们考虑每个不能超过的操作我们留下价值最大的。我们可以用这个思路先将能装的装了然后到达第二个操作就留下价值最大的。 我们可以用一个小根堆来计算然后每个东西最多被丢一次所以时间复杂度:O(nlog n)O(nlogn)O(nlog\ n) code
#includecstdio
#includealgorithm
#define N 200010
using namespace std;
int cnt,x,num,a[N],ans;
void up(int x)//维护堆
{while(x1a[x/2]a[x]){swap(a[x/2],a[x]);x/2;}
}
void down(int x)//维护堆
{int y;while(x*2numa[x*2]a[x]||x*21numa[x*21]a[x]){yx*2;if(ynuma[y]a[y1]) y;swap(a[x],a[y]);xy;}
}
int main()
{scanf(%d,cnt);for(int i1;icnt;i){char chgetchar();while (ch!cch!e) chgetchar();scanf(%d,x);if(chc){a[num]x;ansx;up(num);}//能装就装else if(i!cnt){while(numx){ans-a[1];swap(a[1],a[num]);num--;down(1);}//丢到允许}}printf(%d,ans);
}