首页 > 其他分享 >题解:CF1833F Ira and Flamenco

题解:CF1833F Ira and Flamenco

时间:2024-07-15 17:22:44浏览次数:15  
标签:CF1833F int 题解 tr long mp ans Flamenco 满足要求

思路

因为要一个长度为 \(m\) 的,且最大与最小的元素之差小于等于 \(m\) 所以序列应为 \(a_i,a_i+1,a_i+2\dots,a_i+m-1\),所以满足要求的序列之需要连续 \(m\) 个就行了,这个最开始排序,去重后用 lower_bound 求一下小于 \(a_i+m-1\) 的数有没有 \(m\) 个就行了。

考虑满足要求序列的答案,每个值相同的数只选一次且必须选一次,我们设 \(mp_{a_i}\) 为值为 \(a_i\) 的数的个数,所以 \(ans=mp_{a_i}\times mp_{a_i+1}\dots\times mp_{a_i+m-1}\) 这一坨要用线段树不然会超 long long,把每个答案贡献记在满足要求的序列中的最小的 \(a_i\) 上就行了。

代码

#include<bits/stdc++.h>
#define int long long
#define mid (tr[x].l+tr[x].r>>1)
using namespace std;
const int N = 2e5 + 5;
const int mod = 1e9 + 7;

int T,n,m,ans;

map <int,int> mp;

int a[N],b[N],sum,cnt[N];

struct node {
	int ad,l,r;
} tr[N<<2];

void pushup(int x) {
	return void(tr[x].ad=(tr[x<<1].ad*tr[x<<1|1].ad)%mod);
}

void build(int x,int l,int r) {
	tr[x].l = l, tr[x].r = r;
	if(l==r) return void(tr[x].ad = cnt[l]);
	build(x<<1,l,mid),build(x<<1|1,mid+1,r);
	return void(pushup(x));
}

int query(int x,int L,int R) {
//	cout<<tr[x].ad<<" ";
	if(tr[x].l>=L&&tr[x].r<=R) return tr[x].ad;
	int anss = 1;
	if(L<=mid) anss*=query(x<<1,L,R);
	anss%=mod;
	if(R>mid) anss*=query(x<<1|1,L,R);
	return anss%mod;
}

signed main() {
//	freopen("neat.in","r",stdin);
//	freopen("neat.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0) , cout.tie(0);
	cin>>T;
	int p,k;
	while(T--) {
		cin>>n>>m;
		ans = 0;
		for(int i=1; i<=n; ++i) {
			cin>>a[i];
			mp[a[i]]++;
		}
		sort(a+1,a+1+n);
		for(int i=1; i<=n; ++i) b[i] = a[i];
		p = unique(b+1,b+1+n)-b-1;
		if(m>p) {
			cout<<"0\n";
			for(int i=1; i<=n; ++i) mp[a[i]] = 0;
			continue;
		}
		for(int i=1; i<=p; ++i) cnt[i] = mp[b[i]];
		build(1,1,p);
		for(int i=1; i<=p; ++i) {
			k = lower_bound(b+1,b+1+p,b[i]+m) - b - 1;
			if(k-i+1<m) continue;
			ans += query(1,i,k);
			ans%=mod;
		}
		for(int i=1; i<=n; ++i) mp[a[i]] = 0;
		cout<<ans<<'\n';
	}
	return 0;
}

标签:CF1833F,int,题解,tr,long,mp,ans,Flamenco,满足要求
From: https://www.cnblogs.com/DuckYa/p/18303523

相关文章

  • P8704 [蓝桥杯 2020 省 A1] 填空问题 题解
    题目传送门A.跑步训练我们经过仔细观察,可以发现每222分钟就会消耗300300......
  • P2754 [CTSC1999] 家园 / 星际转移问题题解
    开始时,将源点连一条权值为\(k\)的边到地球。然后以时间分层,从上一层的点连接到下一层的点,权值为飞船载人数量,并将代表月球的点连接到汇点。每加一层,在上一层的基础上进行增广,看能不能增加流量,如果流量变为\(k\),那么证明运送完成。可以证明枚举时间最多到\(1500\),图的点数不......
  • SP4063 MPIGS - Sell Pigs / P4638 [SHOI2011] 银行家题解
    考虑使用网络流。建立源点\(S\)和汇点\(T\)。每个人作为一个点,将它们与汇点\(T\)连接,权值为需要的猪的数量。然后对于每个人,如果和之前的某个人开了相同的猪圈,那么就将之前的那个人的点与这个人的点连接。如果猪圈还没有被开过,就从源点\(S\)连接这个点,权值为猪圈猪的初......
  • P1402 酒店之王题解
    考虑使用网络流。分为\(6\)层。第一层为源点。第二层为所有菜的点。第三层和第四层都表示人。(限制只能选择一个)。第五层为房子。第六层为汇点。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintN=410,M=101000,INF=0x3f3f3f3......
  • AE莫名的小问题解决办法和基础的操作快捷键分享
    更多macOS实用教程,小白教学点击这里!AdobeAfterEffects,简称AE,是由Adobe公司开发的视频剪辑和设计软件。它是一款用于动画、视觉效果和电影合成的二维半动画软件,广泛应用于电影、电视和网络视频创作。AfterEffects主要用于创建动态图像和视觉特效,被誉为制作动态影像设计不可或......
  • 题解 P5270 无论怎样神树大人都会删库跑路
    题解P5270无论怎样神树大人都会删库跑路题意已经说得很清楚了,我们直接开始讲题。首先考虑一次只插入一个字符。问题只在于我们想要判断最后几个字符是否组成相同,即判断两个可重集合是否相等。这个需求很像字符串哈希的目的(快速判断两个字符串是否相等)。但集合怎么哈希呢?需求......
  • 【力扣 709】转换成小写字母 C++题解(字符串)
    给你一个字符串s,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。示例1:输入:s=“Hello”输出:“hello”示例2:输入:s=“here”输出:“here”示例3:输入:s=“LOVELY”输出:“lovely”提示:1<=s.length<=100s由ASCII字符集中的可打印字符组......
  • 【力扣 58】最后一个单词的长度 C++题解(字符串)
    给你一个字符串s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中最后一个单词的长度。单词是指仅由字母组成、不包含任何空格字符的最大子字符串。示例1:输入:s=“HelloWorld”输出:5解释:最后一个单词是“World”,长度为5。示例2:输入:s="flymetot......
  • 【MX-J1-T2】『FLA - III』Ilumina 题解
    题目传送门【MX-J1-T2】『FLA-III』Ilumina思路硬导题。因为\(c=\lfloor\frac{b}{m}\rfloor\),那么\(b\)一定可以表示为\(c\timesm+x\),其中\(0\lex\lem-1\)。又因为\(b=\lfloor\frac{a}{n}\rfloor\),那么\(a\)一定可以表示为\(b\timesn+y\),其中\(0\ley\len......
  • 题解:P10765 「CROI · R2」在相思树下 I
    在发布求救信号后,@我就在这里253发了题解。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongintt,ans;voidsolve(){ intn,k,x,ans; scanf("%lld%lld",&n,&k); ans=1; intpre=1,behind=n; for(inti=0;i<k;i++......