首页 > 其他分享 >带悔贪心 QOJ interval

带悔贪心 QOJ interval

时间:2024-11-09 22:08:40浏览次数:1  
标签:带悔 int interval 反悔 read 端点 匹配 QOJ 贪心

interval

带反悔的贪心

即通过(大根堆、小根堆)来维护当前贪心策略的最优解,若发现最优解不对,就退回上一步,更新最优解。

将区间按照左端点排序,从左向右遍历区间。当前区间为 \([l,r]\),取出当前右端点最左的区间,可以就匹配。

如果不可以,去看看已经匹配的这些对区间中的 \((b,c)\),\(c\) 的右端点是否在 \(a\) 左侧,若是,则 \(a,b\) 匹配,\(c\) 放入未匹配的队列,因为右端点越左说明在后面匹配上的可能就越大。

反悔贪心就是我们维护一个反悔堆,把想要反悔的放到堆中,然后不断贪心,如果发现可以反悔(会使结果更优或可能更优),那就反悔。
反悔操作指的是这一步的贪心不是全局最优解,我们就退回去一步。

#include<bits/stdc++.h>
using namespace std;

template <typename T>
inline void read(T &x){
	x = 0;
	static char c;
	static bool f;
	c = getchar(), f = 0;
	while(c < '0' || c > '9'){ if(c == '-')f = 1; c = getchar(); }
	while('0' <= c && c <= '9')x = (x << 3) + (x << 1) + (c ^ 48), c = getchar();
	x = f ? -x : x;
}
template <typename T,typename ...Types>
inline void read(T &x,Types &...y){
	read(x);
	read(y...);
}

const int N = 5e5 + 10;
using pii = pair<int,int>;
priority_queue<pii,vector<pii>,greater<pii> > a,b;
int n,ans[N],m;
int match[N],mp[N];
struct P{
	int l,r,id;
	bool friend operator <(const P &a,const P &b){
		return a.l == b.l ? a.r < b.r : a.l < b.l;
	}
}s[N];



int main(){
	read(n),read(m);
	for(int i = 1;i<=n;++i)read(s[i].l,s[i].r),s[i].id = i;
	sort(s+1,s+n+1);
	for(int i = 1;i<=n;++i){
		int l = s[i].l, r = s[i].r, id = s[i].id;
		mp[i] = id;
		if(a.size() && a.top().first < l){
			match[mp[a.top().second]] = id;
			match[id] = mp[a.top().second];
			a.pop(),b.push({r,i});
		}
		else if(b.size() && b.top().first < r){
			int to = match[mp[b.top().second]];
			match[to] = id, match[id] = to;
			match[mp[b.top().second]] = 0;
			a.push(b.top()),b.pop(),b.push({r,i});
		}
		else a.push({r,i});
	}
	int tot = 0;
	for(int i = 1;i<=n;++i){
		if(match[i]){
			ans[i] = ans[match[i]] = ++tot;
			match[match[i]] = 0;
		}
	}
	for(int i = 1;i<=n;++i){	
		(ans[i] == 0) && (ans[i] = ++tot);
		printf("%d ",ans[i] > m ? 0 : ans[i]);
	}
	return 0;
}

标签:带悔,int,interval,反悔,read,端点,匹配,QOJ,贪心
From: https://www.cnblogs.com/fight-for-humanity/p/18537379

相关文章

  • Little Elephant and Interval
    TF.LittleElephantandIntervalTheLittleElephantverymuchlovessumsonintervals.Thistimehehasapairofintegerslandr(l ≤ r).TheLittleElephanthastofindthenumberofsuchintegersx(l ≤ x ≤ r),thatthefirstdigitofinte......
  • [At_dp_w] Intervals & [At_dp_x] Tower
    两道题都很好Intervals给定\(m\)条规则形如\((l_i,r_i,a_i)\)​,对于一个01串,其分数的定义是:对于第\(i\)条规则,若该串在\([l_i,r_i]\)中至少有一个1,则该串的分数增加\(a_i\)你需要求出长度为\(n\)的01串中的最大分数\(1\len,m\le2\times10^5,|a_i|\le10^9\)......
  • Prometheus Alert Manager -- Difference between group_wait, group_interval, and r
    Definitiongroup_interval:group_interval dictateshowlongtowaitbeforesendingnotificationsaboutnewalertsthatareaddedtoagroupofalertsthathavebeenalertedonbefore。repeat_interval:IfthereisnothingchangeintheAlertGroup......
  • qoj8542 Add One 2
    大概是把官方题解再说一遍。注意到,给\(k\)个数加一的代价为\(k\)。定义一个序列\(S\)合法当且仅当:对于初始为全\(0\)的序列\(B\),可以通过对\(B\)进行多次给定的两种操作得到\(S\)。可以把题意转化为:给定序列\(A\),对于所有合法序列\(S\),且\(\foralliS_i\geqA_......
  • QOJ #9317. Rivals
    题面传送门直接做显然不太好做,考虑转化成每次都从\(n\)个怪中随机挑一个出来打,但是只有挑到还有血量的怪才算入“打了一次”。使用生成函数来刻画这个东西:当打了一次,乘上一个\(y\),打了有效的一次,乘上一个\(x\)。枚举最后一次有效攻击打到了哪个身上,则每个怪的EGF就是\[x^......
  • qoj6562 First Last 题解
    妙妙题。首先不同字母数最多为\(3\)。我们把每一个字母看成一个点。对于每一个字符串,首个字母朝末尾字母连一条有向边。那么问题变为了给定一张有向图,从某个点出发,每次走一条边,且边不能重复,不能走的人输。问哪方有必胜策略。先不考虑时间复杂度,那么这个可以直接爆搜。但是肯定......
  • qoj8528 Chords 题解
    数据随机有什么用?用你惊人的注意力可以观察到答案的值域在\(800\)附近。考虑暴力dp,设\(dp_{l,r}\)表示值域在\([l,r]\)中最多能选几个区间。假设\(r\)对应区间的左端点为\(lst\),那么有转移方程\(dp_{l,r}=dp_{l,lst-1}+dp_{lst+1,r-1}+1\)。时间复杂度\(O(n^2)\)。......
  • 题解 QOJ5048【[ECFinal19K] All Pair Maximum Flow】
    题目描述给你一个\(n\)个点\(m\)条边的图,它是平面上的正\(n\)边形和一些对角线,节点按逆时针方向编号为\(1\)到\(n\)。对角线只可能在节点处相交。每条边有一个容量,求每个点对之间的最大流的和。\(n\leq200000,m\leq400000\)。solution做法每次找出边权最小的边\(......
  • QOJ #9448. Product Matrix
    题面传送门这居然是能快速插值的?首先令\(A_{i,x,y}=a_{x,y}2^i+b_{x,y}\),则\(\prod\limits_{i=k}^{k+m-1}A_i\)的\((1,1)\)位置相当于将\(x=2^k\)代入答案多项式得到的点值。可以用矩阵乘法在\(O(mn^3)\)时间复杂度内求出这\(m+1\)个点值。然后我们需要插值出原来......
  • 题解 QOJ1869【Power Station of Art】/ SS241006B【结论题】
    题解QOJ1869【PowerStationofArt】/SS241006B【结论题】PetrozavodskSummer2021.Day6.XJTUContest,GPofXJTUXXIIOpenCupnamedafterE.V.Pankratiev,GrandPrixofXi'an题目描述给出一个无向图,每个点有点权\(a\)和颜色\(c\),其中颜色只会有红蓝两种。......