题目:
CodeForces - 746F: Music in Car
题意:
给定a[],b[],你要选一段连续的区间,使得区间b[]之和小于等于K,并且区间a[]之和最大,同时也有W次机会将b[i]=ceil(b[i]/2)
分析:
假设没有修改的机会,因为a[],b[]都是正整数,区间具有单调性,所以可以用尺取法找到所有合法的区间,更新答案;现在有修改的机会,贪心的想,肯定要修改区间前W大的数;双指针移动的时候,无非是增加一个数或者删除一个数;(1)增加一个数,只需要和区间第W的数比较一下;(2)删除一个数,只需要判断这个数是否是前W大就可以容易地维护b[]区间和
这些操作都是平衡树模板,set查一个数的排名和排名为x的数的操作都是O(N)的,当然也可以用两个set维护,一个存入前W大,其它的都存入另一个
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 2e5+25;
struct data{int l,r,v,size,fix,w;}tr[maxn];
int len,root,ans;
void update(int k){tr[k].size=tr[tr[k].