首页 > 其他分享 >【ABC298C】题解

【ABC298C】题解

时间:2023-05-05 22:44:35浏览次数:46  
标签:q1 q2 int 题解 scanf 200010 push ABC298C

思路

一道很好的复习数据结构的题。

对于第 \(1\) 个问答(既第 \(2\) 种操作),我用一个小根堆(优先队列,\(\text{priority\_queue}\))来储存第 \(i\) 个盒子的卡牌。

对于第 \(2\) 个问答(既第 \(3\) 种操作),我用一个 \(\text{set}\) 来储存编号为 \(i\) 个卡牌在哪些盒子里。
由于 \(\text{set}\) 会自动去重,也会自动排序,所以直接存和输出了。

怎么存呢?

先看一下我开的变量:

set<int>q2[200010];
priority_queue<int,vector<int>,greater<int> >q1[200010],k;

其中 \(q_1[i]\) 表示第 \(i\) 个盒子里的卡牌(小根堆,升序排序),\(q_2[i]\) 表示编号为 \(i\) 个卡牌在的盒子的编号(也是升序排序),\(k\) 是输出用做过渡的。

设要将编号为 \(a\) 的卡牌放在编号为 \(b\) 的盒子里,则:

q1[b].push(a);
q2[a].insert(b);

看不懂的结合定义再理解一遍。

会存了,询问就直接输出了。

参考代码

#include<bits/stdc++.h>
using namespace std;
int n,q;
set<int>q2[200010];
priority_queue<int,vector<int>,greater<int> >q1[200010],k;
int main(){
	scanf("%d%d",&n,&q);
	while(q--){
		int op;
		scanf("%d",&op);
		if(op==1){
			int a,b;
			scanf("%d%d",&a,&b);
			q1[b].push(a);
			q2[a].insert(b);
		}
		else if(op==2){
			int a;
			scanf("%d",&a);
			while(!q1[a].empty()){
				k.push(q1[a].top());
				printf("%d ",q1[a].top());
				q1[a].pop();
			}
			putchar('\n');
			while(!k.empty()){
				q1[a].push(k.top());
				k.pop();
			}
		}
		else{
			int a;
			scanf("%d",&a);
			for(set<int>::iterator it=q2[a].begin();it!=q2[a].end();it++) printf("%d ",*it);
			putchar('\n');
		}
	}
	return 0;
}

标签:q1,q2,int,题解,scanf,200010,push,ABC298C
From: https://www.cnblogs.com/fengxiaoyi/p/17375602.html

相关文章

  • 【学习笔记】【题解】树形依赖 DP 选做
    地址:https://www.cnblogs.com/FReQuenter5156/p/shuxingyilaidp.html/简介这类背包本质上是分组背包问题。将一个节点的每一棵子树看作一组,进行分组背包。所谓分组背包,即在选择物品的时候,一开始将物品分为好几组,在选择时,可以从每一组中至多选择一件物品,问如何获得最大的价值,所......
  • CF338D GCD Table-题解(excrt)
    CF338DGCDTable个人评价:还好算法扩展CRT题面给了一张\(n\timesm\)的矩阵,第i行j列的权值是gcd(i,j),现在有一个长度为k的序列A,问是否存在(i,j)使得\(gcd(i,j+l-1)=a_l(1\leql\leqk)\)问题分析我们将对应行设为x,对应列设为y,那么就有如下同余方程组\(x\equiv(y+l-1)......
  • P8446 虹色的北斗七星 题解
    传送门前言:很久之前做的一道题目了,当时并没有想出来怎么做,随便猜了个结论交上去发现过了。(好像还是第一道自己做出来的绿)简要题意:你有一个长度为\(n\)的序列\(a\),一个区间\([l,r]\)的价值定义为当前区间的极差减去区间长度,求出最大的价值。\(Solution\):看了看题解,发现......
  • [CodeForces-545A]题解(C++)
    PartIPreface原题目(Luogu)原题目(CodeForces)PartIISketch给定一个正整数\(n\),表示汽车数量。给定一个\(n\timesn\)阶矩阵\(A\),第\(i\)行\(j\)列上的数字表示\(i\)车与\(j\)车的对撞情况。\(\begin{aligned}\begin{cases}A_{i,j}=-1&i,j\text{车没......
  • [CodeForces-545A]题解(C++)
    PartIPreface原题目(Luogu)原题目(CodeForces)PartIISketch给定一个正整数\(n\),表示汽车数量。给定一个\(n\timesn\)阶矩阵\(A\),第\(i\)行\(j\)列上的数字表示\(i\)车与\(j\)车的对撞情况。\(\begin{aligned}\begin{cases}A_{i,j}=-1&i,j\text{车没......
  • CF1260E Tournament 题解
    妙妙题,但是感觉评不到紫。题目链接。题意luogu题意。有\(n\)个人,贿赂第\(i\)个人的代价为\(a_i\)。这些人中,贿赂代价为\(-1\)的是你的朋友。现在,你可以两两配对,使得编号小的被淘汰,但是,如果你贿赂了编号大的,那么编号大的被淘汰,而编号小的留下。问:使得你朋友夺得冠军的......
  • django迁移数据库错误问题解决
    删除所有的pyc文件,迁移文件然后重新运行python3manage.pymakemigrationsdjango.db.utils.InternalError:(1060,"Duplicatecolumnname'addr_id'")运行python3manage.pymigrate--fake然后重新运行python3manage.pymigrate成功!......
  • ABC269F 题解
    前言题目传送门!更好的阅读体验?题解区的方法思维难度都过大(?),提供一种极其容易的方法。思路题目就是求\(\sum\limits_{i=x_1}^{x_2}\sum\limits_{j=y_1}^{y_2}a_{i,j}\)。所以很容易想到先算\(\sum\limits_{j=y_1}^{y_2}a_{i,j}\)。这个并不困难:如果\(i\)是奇数,那一行应......
  • LeetCode 27. 移除元素 题解
    题目链接:LeetCode27.移除元素本题大意是要对一个数组进行原地删除数值等于val的元素。双指针算法:通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。快指针(p指针):寻找新数组的元素,新数组就是不含有目标元素的数组慢指针(q指针):指向更新新数组下标的位置当......
  • LeetCode 704. 二分查找 题解
    本题考查的就是一个基本的整数二分查找问题对于整数二分,有单调性一定可以二分,没有单调性的有时候也可以二分。算法思想(分为两种方法):查找结果是在左边区间的情况区间被划分为[l,mid]和[mid+1,r]1、确定分界点,mid=q[(l+r)/2]2、判断是否满足是:区间变成[l,mid]因此:r=mid否......