首页 > 其他分享 >数组元素关系映射——cf_925_D. Divisible Pairs

数组元素关系映射——cf_925_D. Divisible Pairs

时间:2024-02-14 22:56:19浏览次数:33  
标签:Pairs const Divisible ll cf long int 数组 define

目录

问题概述

原题参考:D. Divisible Pairs
给出整数n、x、y和长度为n的数组,要求求出数组中满足以下关系的数对

  • x|ai+aj
  • y|ai-aj
  • i < j

思路分析

刚开始看到这个题的时候觉得没思路,坐牢卡半天发现感觉是对的(裂开)。
题解给的是map的做法,看完之后又恍然大悟,实在是妙啊。这个题给我的思路是什么呢,是对于数组中求解数对的特殊关系的总和数这类问题的解法的思路,这种题往往n2的时间复杂度是爆掉的(好吧,说了句废话,好像很多题n2都要爆)。这个好像总是给人无从下手的感觉,好吧,我真的是很讨厌数组里,发现最近写的数组连续性、数组公式求和...,估计是杠上了,首先是推出给出的公式的作用

x|ai+aj  -->  x%(ai%x + aj%x) == 0
y|ai-aj  -->  ai%y == aj%y

这个不就是映射关系嘛,首先是求出和ai同余y的数,放到一起,然后再在这些数里面找出和ai“互补”的aj,注意还有一个i<j的条件,所以遍历只能一方进行,也就是说,当前数只能当aj,不能当ai,说起来抽象,但是我在补题的时候想起来一个远古题目,放在这里互补一下A-B数对,这里就不一样了,这里的话就没有限制,所以当前数既可以当A,也可以当B,具体参考代码

参考代码

  • D. Divisible Pairs
#include <bits/stdc++.h>
using namespace std;
#define FAST_IO ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define endl '\n'
#define pll pair<long long, long long>
#define pii pair<int, int>
#define vi vector<int>
#define vl vector<long long>
#define ll long long
#define ull unsigned long long
const ll INF = 9187201950435737471;
const int inf = 2139062143;
const ll mod = 1e9 + 7;
const double eps = 1e-6;
const double PI = acos(-1.0);
const int N = 2e5+7;
int n, x, y, a[N];
map<int, map<int, int>> w;
void solve() {
	ll ans = 0;
	cin >> n >> x >> y;
	for(int i=1; i<=n; i++) cin >> a[i];
	w.clear();
	for(int i=1; i<=n; i++) {
        //其实这里<j, i>也是可以的,所以假如没有第三个条件的话,这里是*2
		ans += w[a[i]%y][(x-(a[i]%x))%x];
		w[a[i]%y][a[i]%x] ++;
	}
	cout << ans << endl;
}
int main() {
#ifdef xrl
	freopen("in.txt", "r", stdin), freopen("out.txt", "w", stdout);
#endif
	FAST_IO;
	int t = 1;
	cin >> t;
	while(t --) solve();
#ifdef xrl
	cout << "Time used = " << (double)(clock() * 1.0 / CLOCKS_PER_SEC) << "s";
#endif
	return 0;
}
  • A-B数对
#include <bits/stdc++.h>
using namespace std;
#define FAST_IO ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define endl '\n'
#define pll pair<long long, long long>
#define pii pair<int, int>
#define vi vector<int>
#define vl vector<long long>
#define ll long long
#define ull unsigned long long
const ll INF = 9187201950435737471;
const int inf = 2139062143;
const ll mod = 1e9 + 7;
const double eps = 1e-6;
const double PI = acos(-1.0);
const int N = 2e5+7;
map<int, int> w;
int n, a[N], c;
void solve() {
    ll ans = 0;
    cin >> n >> c;
    for(int i=1; i<=n; i++) cin >> a[i];
    for(int i=1; i<=n; i++) {
        //这里就是分别求作为b、a的情况
        ans += w[a[i]-c];
        ans += w[a[i]+c];
        w[a[i]] ++;
    }
    cout << ans << endl;
}
int main() {
#ifdef xrl
    freopen("in.txt", "r", stdin), freopen("out.txt", "w", stdout);
#endif
    FAST_IO;
    int t = 1;
    //cin >> t;
    while(t --) solve();
#ifdef xrl
    cout << "Time used = " << (double)(clock() * 1.0 / CLOCKS_PER_SEC) << "s";
#endif
    return 0;
}

做题反思

当数组求解特殊关系的数对数时,寻找他们之间的映射关系,将其放入到map中

标签:Pairs,const,Divisible,ll,cf,long,int,数组,define
From: https://www.cnblogs.com/notalking569/p/18015787

相关文章

  • 2024.2.14 WC24 线段树 / CF1572D / lgP3679
    西安Day1。感冒还没好,牙龈炎也没好,明天还要考试,又要坐牢了/kk。今天是tyy的图论选讲,感觉前面网络流部分还是在线的,平面图部分毒瘤tyy拿出了他的员交课件,恐怖,直接下线了。看了NAVI和Faze的预选赛,你们俩怎么都打的这么稀碎/fn。Override真好听。「WC2024」线段树我......
  • CF925
    CF925补题ing待更新F对第2到n依次建边,求拓扑序是否存在,即cnt=n#include<bits/stdc++.h>usingnamespacestd;#defineendl'\n'#defineintlonglong#definedb(x)cout<<x<<""<<endl;#define_db(a,n)for(inti=1;i<=n;i++)c......
  • CF1931F Chat Screenshots 另一种题解
    题目链接:CF或者洛谷本题拓扑排序不再赘述,来说说字符串哈希怎么做这题。本篇以另一种角度剖析题目背景,并不追求最优,例如有些地方其实可以暴力判断,主要以构造的角度阐述,顺便感谢灵茶山的朋友的讨论。结论三个串及其以上必定能构造出最初的那个串。下面进行证明:首先一个串,显......
  • CF609D题解
    Gadgetsfordollarsandpounds题目传送门题解给一个单\(\log\)题解。“求最早完成买\(k\)样东西的天数。”——很明显的二分答案。在检验函数中,我们应当把前\(k\)小的物品费用之和与总金额作比较,其它题解大多使用直接排序的方法,于是就多了一只\(\log\)。其实没有必......
  • CF1927G Paint Charges
    题意简述你有\(n\)个道具,对于第\(i\)个道具,你可以选择覆盖\([i-a_i+1,i]\)或\([i,i+a_i-1]\),或者什么都不做。求覆盖所有\(1\simn\)所需要的道具的最小数目。\(n\le100\)。\(O(n^3)\)解法首先明确一个事实:被一个或多个区间包含的区间,使用该区间对应的道具是没有......
  • CF1928E Modular Sequence
    原题链接设\(p=x\bmody\)。思考发现本质是\(x,x+y,x+2y,\cdots,x+k_1y,p,p+y,p+2y,\cdots,p+k_2y,p,p+y,p+2y,\cdots,p+k_3y\cdots\),即每次二操作会使\(y\)的系数变为\(0\)。枚举第\(i\)次操作是第一次二操作,记\(s_1=s-(i\timesx+y\times\dfrac{i(i-1)}{2}+(n-i)\time......
  • CF1928D Lonely Mountain Dungeons
    原题链接设\(F(n,m)\)是将\(n\)个同种族的人放到\(m\)个队伍中可以获得的贡献。可以发现在同一个队伍中的人不能互相产生贡献,所以尽可能平均分配是最优的。设\(p=\lfloor\dfrac{n}{m}\rfloor,q=n\bmodm\),那么有\(m-q\)个队伍中有\(p\)个人,\(q\)个队伍中有\(p+1\)......
  • CF1918F Caterpillar on a Tree
    题意简述你想要遍历一棵大小为\(n\)的树,初始在根节点\(1\),每次你可以花费\(1\)从一个点通过一条边到达另一个点,或者花费\(0\)传送到根节点。求完成遍历的最小代价。\(n\le2\times10^5,k\le10^9\)。分析首先,传送门肯定是在叶子节点使用。其次,遍历顺序是按照子树的深......
  • CF1928C Physical Education Lesson
    原题链接先考虑暴力枚举每个\(k\)是否合法,发现\(k\)合法当且仅当\((2k-2)\mid(n-x)\)或者\((2k-2)\mid(n+x-2)\)并且\(k\geqx\)。因为当\(n\)处于每一段中的第\(1\simk\)个数中时\(n-x\)是上一段的结尾,\(n\)处于每一段中的第\(k\sim2k-2\)个数中时\(n+(x......
  • CF103E Buying Sets(最大权闭合子图模型)
    题意简述有\(n\)个元素和\(n\)个集合,保证任意\(k\)个集合的并\(\gek\)。每个集合有权值\(a_i\),你需要选出一些集合使得集合数等于集合并大小,并在此基础上最小化选出的集合权值和。\(n\le300,|a_i|\le10^6\)。分析将集合和元素看成物品,我们发现,若选择了一个集合,则......