并查集
合并集合一共有 n 个数,编号是 1∼n,最开始每个数各自在一个集合中。
现在要进行 m 个操作,操作共有两种:
M a b,将编号为 a 和 b 的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作;
Q a b,询问编号为 a 和 b 的两个数是否在同一个集合中;
输入格式第一行输入整数 n 和 m。
接下来 m 行,每行包含一个操作指令,指令为 M a b 或 Q a b 中的一种。
输出格式对于每个询问指令 Q a b,都要输出一个结果,如果 a 和 b 在同一集合内,则输出 Yes,否则输出 No。
每个结果占一行。
数据范围1≤n,m≤1e5
输入样例:1234564 5M 1 2M 3 4Q 1 2Q 1 3Q 3 4
输出样例:123YesNoYes
个人代码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748#include<bits/stdc++.h>using namespace std;const int ...
Trie
在给定的 N 个整数 A1,A2……AN中选出两个进行 xory(异或)运算,得到的结果最大是多少?
输入格式第一行输入一个整数 N.
第二行输入 N个整数 A1~AN。
输出格式输出一个整数表示答案。
数据范围1≤N≤105,0≤Ai<2e31
输入样例:1231 2 3
输出样例:13
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374#include<bits/stdc++.h>using namespace std;#define ll long long//地址指针int indexs = 0;// 构建树如果有值1来表示int chile[3300010][2];// 对于每一个节点 都可以延伸为32位的字节 2E31 最大的数 bool cnt[100010];ll maxG = INT_MIN;// 考虑 int占用 3 ...
KMP
KMP字符串给定一个字符串 S,以及一个模式串 P,所有字符串中只包含大小写英文字母以及阿拉伯数字。
模式串 P在字符串 S 中多次作为子串出现。
求出模式串 P 在字符串 S 中所有出现的位置的起始下标。
输入格式第一行输入整数 N,表示字符串 P 的长度。
第二行输入字符串 P。
第三行输入整数 M,表示字符串 S 的长度。
第四行输入字符串 S。
输出格式共一行,输出所有出现位置的起始下标(下标从 00 开始计数),整数之间用空格隔开。
数据范围1≤N≤1E51≤M≤1E6
输入样例:12343aba5ababa
输出样例:10 2
个人代码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566#include<bits/stdc++.h>using namespace std;string tool;string aim;vector<int>pre;void ...
栈
模拟栈实现一个栈,栈初始为空,支持四种操作:
push x – 向栈顶插入一个数 x;
pop – 从栈顶弹出一个数;
empty – 判断栈是否为空;
query – 查询栈顶元素。
现在要对栈进行 M个操作,其中的每个操作 3和操作 4 都要输出相应的结果。
输入格式第一行包含整数 M,表示操作次数。
接下来 M 行,每行包含一个操作命令,操作命令为 push x,pop,empty,query 中的一种。
输出格式对于每个 empty 和 query 操作都要输出一个查询结果,每个结果占一行。
其中,empty 操作的查询结果为 YES 或 NO,query 操作的查询结果为一个整数,表示栈顶元素的值。
数据范围1≤M≤100000;1≤x≤109;所有操作保证合法。
输入样例:123456789101110push 5querypush 6popquerypopemptypush 4queryempty
输出样例:1234555YES4NO
个人代码1234567891011121314151617181920212223242526272829303132333435 ...
移动窗口
滑动窗口给定一个大小为 n≤1e6 的数组。
有一个大小为 k 的滑动窗口,它从数组的最左边移动到最右边。
你只能在窗口中看到 k 个数字。
每次滑动窗口向右移动一个位置。
以下是一个例子:
该数组为 [1 3 -1 -3 5 3 6 7],k 为 3。
窗口位置
最小值
最大值
[1 3 -1] -3 5 3 6 7
-1
3
1 [3 -1 -3] 5 3 6 7
-3
3
1 3 [-1 -3 5] 3 6 7
-3
5
1 3 -1 [-3 5 3] 6 7
-3
5
1 3 -1 -3 [5 3 6] 7
3
6
1 3 -1 -3 5 [3 6 7]
3
7
你的任务是确定滑动窗口位于每个位置时,窗口中的最大值和最小值。
输入格式输入包含两行。
第一行包含两个整数 n 和 k,分别代表数组长度和滑动窗口的长度。
第二行有 n个整数,代表数组的具体数值。
同行数据之间用空格隔开。
输出格式输出包含两个。
第一行输出,从左至右,每个位置滑动窗口中的最小值。
第二行输出,从左至右,每个位置滑动窗口中的最大值。
输入样例:128 31 3 -1 ...
单调栈
单调栈给定一个长度为 N的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 −1。
输入格式第一行包含整数 N,表示数列长度。
第二行包含 N 个整数,表示整数数列。
输出格式共一行,包含 N 个整数,其中第 i 个数表示第 i 个数的左边第一个比它小的数,如果不存在则输出 −1。
数据范围1≤N≤1e51≤数列中元素≤10e9
输入样例:1253 4 2 7 5
输出样例:1-1 3 -1 2 2
123456789101112131415161718192021#include<bits/stdc++.h>using namespace std;int main() { stack<int> st; int n;cin>>n; while(n--){ int n;cin>>n; while(!st.empty() && st.top() >= n){ st.pop(); } if (st.empty()) printf("%d &qu ...
队列
模拟队列实现一个队列,队列初始为空,支持四种操作:
push x – 向队尾插入一个数 x;
pop – 从队头弹出一个数;
empty – 判断队列是否为空;
query – 查询队头元素。
现在要对队列进行 M 个操作,其中的每个操作 3 和操作 4 都要输出相应的结果。
输入格式第一行包含整数 M,表示操作次数。
接下来 M 行,每行包含一个操作命令,操作命令为 push x,pop,empty,query 中的一种。
输出格式对于每个 empty 和 query 操作都要输出一个查询结果,每个结果占一行。
其中,empty 操作的查询结果为 YES 或 NO,query 操作的查询结果为一个整数,表示队头元素的值。
数据范围1≤M≤1000001≤x≤1e9,所有操作保证合法。
输入样例:123456789101110push 6emptyquerypopemptypush 3push 4popquerypush 6
输出样例:1234NO6YES4
个人代码12345678910111213141516171819202122232425262728293031323 ...
链表
单链表实现一个单链表,链表初始为空,支持三种操作:
向链表头插入一个数;
删除第 k 个插入的数后面的数;
在第 k 个插入的数后插入一个数。
现在要对该链表进行 M 次操作,进行完所有操作后,从头到尾输出整个链表。
注意:题目中第 k 个插入的数并不是指当前链表的第 k 个数。例如操作过程中一共插入了 n 个数,则按照插入的时间顺序,这 n 个数依次为:第 11 个插入的数,第 22 个插入的数,…第 n 个插入的数。
输入格式第一行包含整数 M,表示操作次数。
接下来 M 行,每行包含一个操作命令,操作命令可能为以下几种:
H x,表示向链表头插入一个数 x。
D k,表示删除第 k 个插入的数后面的数(当 k为 0 时,表示删除头结点)。
I k x,表示在第 k 个插入的数后面插入一个数 x(此操作中 k 均大于 0)。
输出格式共一行,将整个链表从头到尾输出。
数据范围1≤M≤100000
所有操作保证合法。
输入样例:123456789101110H 9I 1 1D 1D 0H 6I 3 6I 4 5I 4 5I 3 4D 6
输出样例:16 4 6 5
个人 ...
小众
位运算二进制中1的个数给定一个长度为 n 的数列,请你求出数列中每个数的二进制表示中 11 的个数。
输入格式第一行包含整数 n。
第二行包含 n 个整数,表示整个数列。
输出格式共一行,包含 n 个整数,其中的第 i 个数表示数列中的第 i 个数的二进制表示中 11 的个数。
数据范围1≤n≤1000000≤数列中元素的值≤1e9
输入样例:1251 2 3 4 5
输出样例:11 1 2 1 2
个人1234567891011121314151617181920#include<bits/stdc++.h>using namespace std;int main() { int n;cin>>n; for(int i=0;i<n;i++){ int v; cin>>v; int cnt = 0; while(v){ cnt += v%2; v/=2; } printf("%d ",cnt); } }/*51 2 3 4 5*/
板 ...
前缀和差分
前缀和输入一个长度为 n� 的整数序列。
接下来再输入 m� 个询问,每个询问输入一对 l,r�,�。
对于每个询问,输出原序列中从第 l� 个数到第 r� 个数的和。
输入格式第一行包含两个整数 n� 和 m�。
第二行包含 n� 个整数,表示整数数列。
接下来 m� 行,每行包含两个整数 l� 和 r�,表示一个询问的区间范围。
输出格式共 m� 行,每行输出一个询问的结果。
个人代码1234567891011121314151617181920212223242526272829303132#include<bits/stdc++.h>using namespace std;int main() { int n,m; cin>>n>>m; vector<int>num(n,0); for(int i=0;i<n;i++){ cin>>num[i]; } for(int i=1;i<n;i++){ num[i] += num[i-1]; } int lef ...