首页 > 其他分享 >ABC 314 G

ABC 314 G

时间:2023-08-13 13:35:09浏览次数:44  
标签:ABC cur int res ll pos 314 lst

简单题,但是我赛时没写完,少了一个 \(5\) 分钟。

link

程序有点丑,就不放 link 了,去掉注释在这。

code
#include <bits/stdc++.h>

using namespace std;

#define de(x) cout<<#x<<"="<<x<<endl

using ll = long long;

const int N = 6e5+5;

ll n,m,h,a[N],b[N],A[N],L[N],lst[N];
ll cur[N];
ll bit[N],bit2[N];
vector<ll> g[N];
map<ll,ll> mp;
map<ll,ll> c;
int Lst[N];

void M(ll x,ll y){
	while (x<=n*2){
		bit[x]+=y;
		x+=x&-x;
	}
}

void M2(ll x,ll y){
	while (x<=n*2){
		bit2[x]+=y;
		x+=x&-x;
	}
}

ll S(ll x){
	ll res=0;
	while (x>0){
		res+=bit[x];
		x-=x&-x;
	}
	return res;
}

ll Q(ll l,ll r){
	return S(r)-S(l-1);
}

ll S2(ll x){
	ll res=0;
	while (x>0){
		res+=bit2[x];
		x-=x&-x;
	}
	return res;
}

ll Q2(ll l,ll r){
	return S2(r)-S2(l-1);
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);

	cin>>n>>m>>h;
	multiset<ll> st;
	for (int i=1; i<=n; i++){
		cin>>a[i]>>b[i];
		st.insert(a[i]+cur[b[i]]);
		ll t=a[i];
		a[i]=a[i]+cur[b[i]];
		A[i]=a[i];
		lst[i]=cur[b[i]];
		L[i]=lst[i];
		cur[b[i]]+=t;
	}
	int cnt=0,cnt2=0;
	for (auto u : st){
		if (!mp.count(u)){
			mp[u]=++cnt;
		}
		g[mp[u]].push_back(++cnt2);
	}
	for (int i=1; i<=n; i++){
		ll t=mp[a[i]];
		a[i]=g[t][c[t]++];
		t=mp[lst[i]];
		if (Lst[b[i]]!=0) lst[i]=a[Lst[b[i]]];
		Lst[b[i]]=i;
	}
	int pos=0;
	for (int i=0; i<=m; i++){
		int hv=i;
		while (pos<=n){
			pos++;
			if (pos==n+1){
				break;
			}
			if (lst[pos]){
				M(lst[pos],-1);
			}
			M(a[pos],1);
			if (lst[pos]){
				M2(lst[pos],-L[pos]);
			}
			M2(a[pos],A[pos]);
			int l=-1,r=n*2+1;
			while (l+1<r){
				int mid=l+r>>1;
				if (Q(mid,n*2)>hv){
					l=mid;
				}
				else{
					r=mid;
				}
			}
			ll tmp=Q2(1,r-1);
			if (tmp>=h){
				if (lst[pos]){
					M(lst[pos],1);
				}
				M(a[pos],-1);
				if (lst[pos]){
					M2(lst[pos],L[pos]);
				}
				M2(a[pos],-A[pos]);
				break;
			}
		}
		pos--;
		cout<<pos<<" ";
	}
	cout<<endl;
	return 0;
}

// don't waste time!!!

思路,待更。

我的做法和 Editorial 不一样,是 \(O(m\log^2 n)\) 的,更差,但是 \(\sim 1000\) ms 可过。

标签:ABC,cur,int,res,ll,pos,314,lst
From: https://www.cnblogs.com/SFlyer/p/17626461.html

相关文章

  • abc270d Stones
    abc270d直接贪心每次取最大的会有问题,比如说下面的例子11245我们考虑dp\(f[i]\)表示在先手的情况下,有i个石头的局面,最多能拿多少个石头,同时记录\(g[i]\)表示选的哪一个\(a[i]\)那么转移就是\(f[i]=max(f[i-a[j]-a[g[i-a[j]]]]+a[j])\)#include<algorithm>#include<cst......
  • ABC 314 F 题解
    原题传送门题意有n支队伍进行比赛,起初,第i支队伍只有选手i一个人。总共要进行n-1场比赛,每次给出p和q,意为让p所在的队伍与q所在的队伍进行比赛(数据保证此时p和q不在同一支队伍),设p所在的队伍有\(siz_p\)个人,q所在的队伍有\(siz_q\)个人,则此次比赛中p......
  • ABC314
    T1:3.14模拟代码实现s='3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679'n=int(input())ans=s[0:n+2]print(ans)T2:Roulette模拟代码实现#include<bits/stdc++.h>#definerep(i,n)for......
  • Devexpress xtraTabControl1实现多标签页选项卡,关闭选项卡,刷新重新加载
    //选项卡Dictionary<string,XtraTabPage>dictXtraTabPage=newDictionary<string,XtraTabPage>();Dictionary<string,Form>dictXtraForm=newDictionary<string,Form>();publicvoidShowMDIForm(string......
  • [ABC309G] - Ban Permutation 题解
    [ABC309G]-BanPermutation题解题目描述求长为\(N(N\leq100)\)且满足以下条件的排列\(P=(P_1,P_2,...,P_N)\)的个数,模\(998244353\):\(\forall1\leqi\leqN\),\(|P_i-i|\geqX(X\leq5)\)。思路首先拆绝对值,得到:\[P_i\geX+i\veeP_i\leX-i\]数数题除了排列......
  • 2023牛客暑期多校训练营6 ABCEG
    比赛链接A题解方法一知识点:并查集,树形dp,背包dp。因为需要路径中的最大值,因此考虑按边权从小到大加入图中,保证通过这条边产生贡献的点对已经全部出现。在加边的同时进行树上背包,答案存在集合根节点里即可。树上背包需要用到上下界限制的转移优化,能将复杂度从\(O(n^3)\)降......
  • abc227e
    E-Swap首先我们注意到,加入我们想要一个串T,那么最小步数是唯一的。设\(f[i][j][e][y]\)表示当前到第i个字符,一共用掉了j次,前面有e个E,y个Y。然后转移即可,因为k不会大于\(n^2\),预处理第x个字符的位置即可。#include<algorithm>#include<cstdio>#include<cstring>#include<ma......
  • ABC245E Wrapping Chocolate [线段树二分]
    也许更好的阅读体验\(\mathcal{Description}\)\(n\)个物品有长和宽,\(m\)个盒子也有长和宽,一个盒子最多可以装一个物品,问\(n\)个物品能否都放进盒子,物品和盒子不能旋转\(\mathcal{Solution}\)先离散化长和宽,将物品和盒子按照长从大到小排序考虑到当前物品时将所有长大于等于当......
  • Atcoder ABC307_G-Approximate Equalization 序列dp
    AT_ABC307_G-ApproximateEqualization没想到还有ApproximateEqualizationII!!:AT_ABC313_CDescription:给定一个长度为\(N\)的数列:\(A=(A_1,A_2,···,A_N)\),有两种操作可以以任意顺序进行任意多次(可以为0):\(A[i]-\)=\(1\)且\(A[i+1]+\)=\(1\),\((1\leqi\leqN-1)......
  • ABC313C 扩展
    简要题意:给定长为\(n\)的序列,再给定\(k\),可以进行若干次以下操作:每次选定一个数\(i(1\lei\len)\)使得\(a_{i}\leftarrowa_{i}+k\)或者\(a_{i}\leftarrowa_{i}-k\),最小化最终数组的最大值与最小值之差。这个题是去年学校模拟赛的题目,这两天又给翻了出来((......