A和B跳过。 C - K Swap 题意 给定长度为\(n\)的数组\(a\),每次可以从\([1, n - k]\)中选择一个\(i\)然后交换\(a_i\)和\(a_{i + k}\),问是否能通过有限次的操作将\(a\)升序排序。 其中\(2 \le n \le 2 \times {10}^5\)。 思路 操作可以看成:模\(k\)同余的位置上的元素两两间可以交
using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace ConsoleApplication12{ class Program { static void Main(string[] args) { for (int x = 0; x < 9; x++) for (int y = -5
概念: 1.整体与局部,贪心算法以局部最优解为目的,做出局部上的最佳选择,希望以此来得到,整体的最优解。 2.贪心算法的难点在于 【 证明 】 ,你怎么知道局部最优,就是整体最优的?有时候,可能只是想当然。 3.贪心和动态规划,目的都是取得最优解,不一定哪个难,因为,贪心压根就没固定解法,,,挺玄学。
看了一眼网上的题解,好像我的做法没有出现(?),并且我的做法好像比较简单易懂(?),不用虚树也不用线段树维护 不难想到,我们可以对于每个副部长的点连成的最短路径(即这个路径里的每条边都是必要的)上+1,然后看有哪些路是\(>=k\)的,但是我们需要不重复不遗漏的把这个路径都走到。于是我们考虑把这
Tautonym Puzzle 题目链接:luogu AT2363 题目大意 要你用至多 100 种字符,构造出一个长度不超过 200 的字符串,使得这个字符串的好的子序列数量恰好为 n。 定义一个串是好的当且仅当它可以由一个非空字符串复制一次得到。 思路 神奇构造题。 考虑复制,再看到字符串长度是字符数的两倍,
import java.io.IOException; import java.util.Scanner; public class Main { static int MOD = 1000000007; public static void main(String[] args) throws IOException { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(
bool SequencLists::Insert(int i,int e){ if (i > this->length +1|| i < 1) { return; } for (int j = this->length; j >= i; j--) {//i是指的第i个位置,j是指的下标,若i=2,j=3,那么循环两次,后移两个数,所以一共移(length-i+1)个数 this->data[j] = t
给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的回文串 。 在构造过程中,请注意 区分大小写 。比如 "Aa" 不能当做一个回文字符串。 示例 1: 输入:s = "abccccdd" 输出:7 解释: 我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。 示例 2: 输入
用tarjan变种求割边的模板题 其实还可以求出所有的边双(用栈),但本题不需要求。 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e5+10; 4 int head[N],nxt[N<<1],to[N<<1],tot; 5 pair<int,int> edge[N]; 6 int dfn[N],low[N],top/*st[N]*/; 7 int cnt,i
\(tarjan\) 大合辑 1.割边: #include<bits/stdc++.h> using namespace std; const int N = 1e5 + 10, M = 1e6 + 10; int hd[N], nt[M], to[M], tot = 1;/////// tot = 1反边 inline void add(int u, int v) { nt[++tot] = hd[u]; hd[u] = tot; to[tot] = v; } int n, m;
import java.util.Scanner; public class Pro5 { public static void main(String[] args) { // TODO Auto-generated method stub Scanner in = new Scanner(System.in); int sum = 0; int a[][] = new int [3][3]; //输入矩阵 System.out.println("请输入一个3*3
char vowels[] = "aeiouAEIOU"; bool isVowel(char c) { // (1) int i; for(i = 0; vowels[i]; ++i) { if(vowels[i] == c) { return true; } } return false; } void swap(char *a, char *b) {
#include <stdio.h> int a[1010]; void Input(int n, int *a) { for(int i = 0; i < n; ++i) { scanf("%d", &a[i]); } } void Output(int n, int *a) { for(int i = 0; i < n; ++i) { if(i) printf(&q
P4690 [Ynoi2016] 镜中的昆虫 区间赋值区间数颜色,\(n \leq 10^5\),值域 \([1,10^9]\),要求线性空间。 sol 首先考虑经典数颜色套路,设 \(pre_i\) 表示上一个与 \(a_i\) 相同的数的位置。 对于区间赋值操作,我们发现性质:\(\forall i\in(l,r],pre_i ←i-1\),对于 \(i=l\) 或区间外的情况
P3242 [HNOI2015] 接水果 整体二分练手题。 考虑一条路径 \((x,y)\) 被另一条路径 \((u,v)\) 包含的本质。 考虑 dfs 序,设 \(st_x=dfn_x\),$$ed_x=dfn_x+siz_x-1$。 不妨设 \(st_x<st_y\)。 \(\operatorname{LCA}(x,y)=x\) 则 \(u\in [1,st_z-1]\) 或 \(u \in[ed_z+1,n]\),\(v \in
D - Congruence Points 计算几何 给出两个点集 S,T,判断 S 点集的点是否可以通过平移、绕原点旋转变成 T 先求出两个点集的重心,将 S,T 中点的坐标都变成相对重心的坐标(也可以认为是平移到重心是原点的地方) 这时若 S 可旋转变成 T,则就可以 可枚举 \(S[i]\) 变成 \(T[0]\), 然后
6-5 日期类的设计与实现 分数 30 作者 范鹏程 单位 内蒙古师范大学 使用重载运算符(++,+=,<<等)实现日期类的操作。功能包括: 1)设置日期,如果日期设置不符合实际,则设置为默认日期(1900年1月1日) 2)在日期对象中向日期添加1或者加若干天(加入日期值后根据实际的日期进行月份、年份的变化) 3)重
CLion 是一款专为开发C及C++所设计的跨平台IDE。CLion 2022适用于C和C ++的跨平台IDE!旨在为用户提供智能工具和更便捷的功能,从而消除了繁琐的工作,让开发人员能够专注的进行开发和代码工作!CLion具有智能的编辑器,增强了远程开发的现有工作流、Docker、CMake 项目和 CUDA 调试,并
自己最开始的想法是:先把和求出来,如果不能被4整除就false;然后可以的话边长就是a=和/4。 然后再次遍历,对于给定数组中的每个数字i,若i>a,就false;若i=a,就和-i;若i<a,就和-(a-i)。 然后得到最后经过减法的和等于0(这会只考虑到两个数拼成一个边), 然后修改当多边拼的时候,会导致最后的和小于0,且
原题传送门 1. 题目描述 2. Solution 1 1、思路分析 DFS. 可以将二维网格看成一个无向图,竖直或水平相邻的1之间有边相连。为了求出岛屿的数量,可以扫描整个二维网格,如果一个位置为1,则以其为起始结点进行深度优先搜索。在深度优先搜索的过程中,每个搜索到的1都会被重新标记为0。 最
删除排序数组中的重复项 给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。 由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项
1.电影 链接 题目描述 有n个科学家,编号从1~10^9,我们要为他们准备电影,如果能听懂电影的语音最开心,能看懂电影的字幕比较开心,听不懂以及看不懂的不开心,我们要找出最开心的观看电影编号,没有则任意输出即可。 第一行输入一个整数 n,代表科学家的数量。 第二行输入 n 个整数 a1,a2…an,其
Java自增自减运算符的使用-附带面试题 基本使用 自增:++ 自减:-- 简单的理解为+1 -1 只能改变变量的值 -- ++ 放在位置前后都可以 在表达式中是不同运算方式 在Java中 1++ 1-- 这种表达式是不被允许的 可以int a = 1; a++; 前后缀自增自减单独使用时并没有什么区别 都是+1 -1
使用关联容器 使用map map<string,size_t> word_count; string word; int n = 0; while(n++ <= 5){ cin >> word; ++ word_count[word]; } for( const auto & w : word_count) cout << w.first <<" "<<w.second<<en
链接:Codeforces Round #789 (Div. 2) A. Tokitsukaze and All Zero Sequence 题目大意: 给定长度为\(n\)的数组,可以进行两种操作:1、如果\(a_i = a_j\),则使其中一个等于\(0\);2、使\(a_i=a_j=min(a_i,a_j)\)。问用最少的步数使数组均为\(0\)。 解题思路: 如果数组中存在\(0\),则使其余