- 博客(90)
- 收藏
- 关注
原创 Codeforces Round #898 (Div. 4)
给出一个正整数数组,如果在两边加一个高度为h的边界,那么它就可以容纳一定体积的水。问最多有体积x的水,要装满,h最少为多少。这题很有意思,给出一个无向图,A和B所在的点,A想要抓B,B在A行动前马上可以知道然后逃跑。当时做的时候想的是如果A和B都在环里面,B就可以一直不被抓到;给出一个01串和一个数字k,你每次最多可以选择连续的k个元素让它们全部变成0,问最少需要多少次操作。注意到第一种操作B会能左边连续的A消掉,第二种操作B能把右边连续的A消掉。首先庆祝自己上了绿名🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄。
2023-09-24 10:54:06
594
原创 Codeforces-895 (Div3)
和两个整数x,y;如果数组下标i(从 1开始)和x能整除那么分数要加a[i],如果下标j能和y整除那么分数要减去a[j]。优先把大的排在和x整除,而且不和y整除的位置;优先把小的排在和y整除,而且不和x整除的位置上,其他的无所谓。一个动物A害怕另一个动物B,我们尽量要让A排在B前面,这样可以获得c[i]的额外奖励;看了别人的题解,后面两步其实可以简化,直接从环的最短边dfs,不用把环破掉再拓扑一次。给出一个长度为n的数组a和一个长度也为n的01串s。让a=n,b=x-n,刚好可以满足两个要求。
2023-09-20 22:27:41
321
原创 codeforce 894
an, 我们要根据题目给出的序列b1…关于n=5的时候怎么找到x=3,我这里用了二分,但是看别人的题解好像直接从1开始找也行。然后题目问你,如果把它转置之后(行转成列,列变成行)是否能得到一样的柱状图。给出n*m的矩阵,从左到右每列最多取一个字母,问能否取出"vika"现在假设有x个材料,刚好能制作出n冰淇淋。构造出一个符合条件的序列即可。现在给出b序列,要求输出a序列。,比如要制作5种,那么就得构造。,那么n=5对应的x就是5。转置之后的高度序列为。也就是说n=5的时候,,那么对应的b序列是。
2023-08-26 10:21:17
303
原创 codeforces补题
要使得这个式子最大我们首先得选出最优ai和aj。容易发现如果ai和aj相同的话是最好的,如果没有相同的那么就相同的二进制位越多越好(低位优先。当时不会求ai和aj,看了题解之后发现是使用01Tire树求出来的。对着01Trie树模板改一改即可。an,和一个参数k,求i,j,x使得x
2023-08-23 23:51:16
164
原创 6.824-lab2
准备读一遍文章翻到Figure 2那一页代码有些多,就不贴上了。2Alab2A属于leader election部分。这一部分看着并好好按照文章上面的要求做就能做出来,可以先不用管log,只看term,谁term高就选谁。步骤:计时器 timeout,自增term,成为candidate,给开始发起选举给自己 投票,并向所有server发送RequestVoteRPC请求server收到请求之后,如果term比自己高,那么将状态设为follower,并重置计时器;如果状态至少不落后
2022-04-09 15:10:27
446
原创 6.824-lab1
实验结果代码coordinator.gotype Coordinator struct { // Your definitions here. lock sync.Mutex nMap int nReduce int // max reduce task bucket mapCh chan string // unsigned map task reduceC
2022-02-12 18:39:48
487
原创 文件分片读取
将多个文件分割成m部分,并随机读取每个部分。package utilsimport ( "bufio" "io" "log" "os" "strings")// SplitableFile/*** accurate to one line.* @author delicious*/type SplitableFile struct { m int files []string // for one partition, begin with offsetF
2021-09-05 13:54:12
453
原创 Git 学习
git mergeMerging in Git creates a special commit that has two unique parents. A commit with two parents essentially means “I want to include all the work from this parent over here and this one over here, and the set of all their parents.”比如我想将bugFix分支合并
2021-05-24 15:39:01
128
原创 CountDownLatch和CyclicBarrier 解析
CountDownLatch和CyclicBarrier都是线程同步的方式,比如多线程有特定的作业顺序的场景.CountDownLatch如何使用doSomethingElse(); // don't let run yetstartSignal.countDown(); // let all threads proceeddoSomethingElse();doneSignal.await(); // wait for all to fini
2021-05-18 15:39:00
96
原创 netty入门
一提起netty,一般都能想到NIO,callback。NIO的核心就是epoll,channel,buffer。今天从netty官网上一个简单的例子来入门netty。内容是一个回显服务器,客户端给服务器发送消息,服务器对这些消息进行回复。我相信经过手写这个简单的例子,能对netty一些基本的概念更加熟悉,方便以后的学习。public class TelnetServer { public static void main(String[] args) throws CertificateExce
2021-05-14 21:49:40
140
1
原创 BlockingQueue源码阅读
接下来我准备阅读BlockingQueue的源码。BlockingQueue,顾名思义,线程安全的队列。有多种实现,不同实现适用于不同的场景。下面这张图是对阻塞队列方法的总结,分为 会抛出异常的/返回特定值的/阻塞的/超时返回的。Java的线程安全集合类都保证了这一happens before语义:如果写入的结果保证对另一线程可见,必须要保证写happens-before读。...
2021-05-14 16:12:19
1064
2
原创 Java 设计模式
中介者模式定义:定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。通过使对象明确地相互引用来促进松散耦合,并允许独立地改变它们的交互。类型:行为型理解:将各个对象之间的交流封装在中介中,各个对象只和中介交流,从而使得维护变得简单。服务注册中心就体现了中介者模式思想。远程调用不是直接调物理主机而是首先和注册中心交流,此时注册中心相当于一个中介。状态模式定义:允许对象在内部状态改变时,改变它的行
2021-05-13 16:53:38
87
原创 Mutiny-初识
Mutiny、Project-Reactor好像都挺冷门的,人气不高,相关资料也不多。不过其实整个Java Reactive都不是很热门,国内用的人不是很多。我个人觉得这些Reactive库都非常优秀,值得学习。这篇博客主要是Mutiny的Hello World,重点是初步认识Mutiny和如何使用Mutiny API。对于Vertx core我还是比较熟悉的,但是对Mutiny和Reactor这些基于Reactive-Stream的还不是很了解。相比较而言Mutiny和Reactor提供了更强大、更炫
2021-03-25 11:03:17
1789
原创 ThreadPoolExecutor 源码阅读
ThreadPoolExecutor多线程编程基本上都要用到线程池。首先为什么需要线程池,而不是每次都new一条线程?任务与线程解耦复用线程,减小创建和销毁的开销利于管理线程,线程是一种创建、维护和销毁都要比较谨慎的资源从最顶层接口开始,看看结构是怎么样的。ExecutorExecutor接口只有一个excute方法,就是一个可以执行任务的执行器。ExecutorService提交异步任务后返回的是Future提供了一些管理该执行器的方法AbstractExecutorS
2021-03-11 17:27:01
128
原创 AQS原理解析
AQSAQS这个类定义了一套多线程访问共享资源的同步器框架,AQS是整个JUC包的基石,JUC包内几乎所有线程间同步的组件都依赖于AQS。AQS建议实现类定义为非public的内部类。因为AQS其实是一个抽象的同步器,一个同步框架,封装了通用的同步逻辑,大多数时候实现类可以看成一个适配器,比如ReentrantLock中的Sync修饰关键字为static final.CLH队列CLH队列是AQS的核心组件。AQS将每个等待锁的线程封装成Node结点,并维护由这些Node组成的CLH队列(可以看成一
2021-03-03 14:23:42
132
原创 ReentrantLock源码解读
ReentrantLock就是一个可重入的、互斥的锁。可重入性ReentrantLock是一个可重入的锁。获取锁的方法基本上都有这么一段代码:尝试重入,如果重入次数超过最大值则抛出异常。公平与非公平ReentrantLock 持有一个AQS同步器,AQS同步器Sync是一个抽象类,有公平和非公平两种实现,所以ReentrantLock可以是公平锁也可以是非公平锁。ReentrantLock的主要逻辑都在同步器Sync中实现。tryLock()方法是立即返回的,如果获取锁成功返回true否则
2021-02-28 14:07:24
180
原创 JUC源码分析-序章
注意到ReentrantLock 内定义了一个抽象内部类Sync,所以先从Sync开始分析。Sync类图:顶级接口 AbstractOwnableSynchronizerAbstractOwnableSynchronizerpublic abstract class AbstractOwnableSynchronizer implements java.io.Serializable { private static final long serialVersionUID = 3
2021-02-24 21:10:14
122
原创 PAT(甲级)2019年冬季考试
A题 Good in C (20分)When your interviewer asks you to write “Hello World” using C, can you do as the following figure shows?Input Specification:Each input file contains one test case. For each case, the first part gives the 26 capital English letters A-Z
2020-07-23 11:47:54
634
1
原创 PAT---A1115 Counting Nodes in a BST (30分)
题意给出n个整数依次插入BST,求最后两层的节点数并按照要求输出。‘思路构造BST,然后遍历一遍得到各层的节点数。Sample Input:925 30 42 16 20 20 35 -5 28Sample Output:2 + 4 = 6#include "bits/stdc++.h"using namespace std;struct Node{ int v; Node *l{nullptr}; Node *r{nullptr};};Node* i
2020-07-21 16:16:10
93
原创 PAT---A1114 Family Property (25分)
题意给出n行信息,每行信息包括id,父母id,孩子id和自己拥有的estate和area。统计每个家族的平均estate和平均area,按照平均area降序输出(重复则按照id升序)。将家族中的id最小成员的id作为家族的id。思路并查集。要注意的是最小id优先作为首领的处理。Sample Input:106666 5551 5552 1 7777 1 1001234 5678 9012 1 0002 2 3008888 -1 -1 0 1 10002468 0001 0004 1 22
2020-07-21 15:43:17
107
原创 PAT---A1112 Stucked Keyboard (20分)
题意On a broken keyboard, some of the keys are always stucked. So when you type some sentences, the characters corresponding to those keys will appear repeatedly on screen for k times.Now given a resulting string on screen, you are supposed to list all the
2020-07-21 10:58:43
114
原创 PAT---A1119 Pre- and Post-order Traversals (30分)
题意给定二叉树的先序和后序遍历,要求判断二叉树是否唯一,并输出任意一种的中序遍历。思路仿照先序+中序的思路建树,但是由于不能确定左右子树的位置,所以对左子树的长度进行枚举,如果有两种以上情况的长度都合适,说明不唯一,取其中一种继续下去即可。Sample Input1:71 2 3 4 6 7 52 6 7 4 5 3 1Sample Output1:Yes2 1 6 4 7 3 5Sample Input2:41 2 3 42 4 3 1Sample Output2:N
2020-07-20 22:51:40
93
原创 PAT---A1118 Birds in Forest (25分)
题意给出n张照片,每张照片有若干个鸟,假设一张照片中的鸟都在一棵树上,要求输出树的数目和鸟的总数。并给出q个问题,每个问题询问两只鸟是否在一棵树上。思路典型并查集。Sample Input:43 10 1 22 3 44 1 5 7 83 9 6 4210 53 7Sample Output:2 10YesNo#include "bits/stdc++.h"using namespace std;const int N = 10005;int father[N]
2020-07-20 18:21:27
87
原创 PAT---A1122 Hamiltonian Cycle
题意给出一个无向图, n个顶点(顶点id从1开始), m条边.输入k组顶点集, 判断是否为Hamiltonian cycle.Hamiltonian cycle: a simple cycle that contains every vertex in a graph.思路判断Hamiltonian cycle:该顶点集一定包含n+1个顶点首尾一定相等连通性检查Sample Input:6 106 23 41 52 53 14 11 66 31 24 567
2020-07-20 14:48:23
153
原创 PAT---A1127 ZigZagging on a Tree (30分)
题意给定二叉树的后序和中序遍历,要求输出特定的层次遍历,即间隔一层反转.思路主要是如何实现间隔一层反转.方法一:下一层的节点一定在遍历完上一层之后才遍历到, 可以根据这个特点进行处理: 设置一个buffer, 这个buffer仅仅存储该层的节点, 遍历到不属于该层的节点的时候处理该层: 如果层数为奇数就reverse, 然后输出 buffer的全部节点并清空buffer, 继续遍历.方法二:将节点分层存储起来, 统一处理.(方法二更好.)Sample Input:812 11 20 17
2020-07-20 11:39:20
84
原创 PAT---A1124 Raffle for Weibo Followers (20分)
题意给出m条评论,开始抽奖,中奖id从s开始,id从1开始,间隔n条评论,中过奖的不能再次中奖。如果没有人中奖,输出 Keep going…思路此题不难,但是如果不充分理解题意,处理不好会变得很麻烦。处理中间id从s开始:先输入s条,忽略处理间隔n个,且中过奖的不能再次中奖:设置一个计数器,加map判重。Sample Input1:9 3 2Imgonnawin!PickMePickMeMeMeeeLookHereImgonnawin!TryAgainAgainTryAga
2020-07-19 21:29:20
104
原创 PAT---A1131 Subway Map (30分)
题意给出n条线路,输入k组起点,终点,要求输出最优路径的信息。最优路径:经过的站点最少,若站点数量相同则选择转乘最少的。思路看到题目就知道是比较繁琐的一题。最优路径选取:dfs 选择最优路径,有两种方法:一种是记录所有的路径,最后再遍历选出最优的路径;一种是直接选取,这里我选择的是第二种方法。输出最优路径信息是最繁琐的过程。Sample Input:47 1001 3212 1003 1204 1005 1306 77979 9988 2333 1204 2006 2005 2004
2020-07-19 16:27:33
98
原创 PAT---A1129 Recommendation System (25分)
题意输入n个用户搜索的商品,每输入一个商品,输出推荐的不超过k个商品,推荐的算法是用户主动搜索次数多的排在前面,如果搜索次数相同则按照商品的id 升序排列。思路明显需要动态排序,数据结构用set,输入一个就重新将商品插入到set中,达到动态排序的效果。Sample Input:12 33 5 7 5 5 3 2 1 8 3 8 12Sample Output:5: 37: 3 55: 3 5 75: 5 3 73: 5 3 72: 5 3 71: 5 3 28: 5 3 1
2020-07-19 14:30:05
112
原创 PAT---A1139 First Contact (30分)
题意A暗恋B,让朋友C传话给B的朋友D,D再传话给B。A.gender == C.genderB.gendre == D.genderC是A的朋友,不能是B本身D是B的朋友,不能是A本身这样A暗恋B,需要两个朋友才能传话给B,找出所有对这样的朋友,从小到大输出。思路很明显遍历一下就能得出答案,注意到从小到大输出,map有排序功能,所以就用map。注意输入要用string 输入来判断性别,否则输入0无法判断性别。Sample Input:10 18-2001 1001-2002 -
2020-07-18 20:58:17
219
原创 PAT --- A1142 Maximal Clique (25分)
题意给出一个无向图,给出m组顶点集,判断。思路cnt[id]非常关键,否则后面遍历cnt对该组进行判定的时候,cnt可能会不包含in_vertices中的某些key,而算法正确的前提是cnt要包含in_vertices中所有的key。#include "bits/stdc++.h"using namespace std;const int N = 210;vector<int> links[N];int main(){// freopen("input.txt","r"
2020-07-17 18:58:44
97
原创 PAT---A1151 LCA in a Binary Tree (30分)
题意给出一棵二叉树的中序和先序遍历,输入两个key a和b,求a和b的lca,即最近的祖先节点。思路此题参考了别人的思路。首先处理not found的情况,然后处理两个节点都在二叉树的情况。从根节点开始,如果根节点在a和b之间,说明根节点就是答案如果根节点是a和b中的一个,得到答案如果根节点在a和b的左边,则将根节点变为右子树的根节点,重复上述过程如果根节点在a和b的右边,则将根节点变为左子树的根节点,重复上述过程。用一个map来存储每个key对应的节点在中序遍历数组中的位置。然而用m
2020-07-16 16:21:24
135
原创 PAT---A1151 Travelling Salesman Problem (25分)
题意给出一个无向图,边权,判断TS simple cycle, TS cycle, Not a TS cycle三种情况,首先这里 “环” 定义为访问到1-n每一个节点,而且首尾相接的路径。最后输出最短的环,和路径长度。三种情况如下:TS simple cycle:简单环,除了首尾访问每个城市刚好一次TS cycle:非简单环Not a TS cycle:不是环思路理解了三种情况之后,我们发现三种情况是依次减弱的,于是按照顺序进行排除即可。Sample Input:6 106 2
2020-07-16 11:01:33
89
原创 PAT---A1048 Werewolf - Simple Version (20分)
题意狼人杀,给出n个玩家的断言(即认定某人是狼人或者人类),狼人总共有两个,而且恰好有1个狼和一个人类撒了谎。如果有多个答案就输出”最小“的那个。此题是20分的题,但是第一次看到的时候还是非常懵不知道如何下手,所以记录一下。思路此题其实就是简单的枚举题。枚举每一种情形,如果符合条件就是答案了。由于是多个答案选择 ”最小“的那个,就按照从小到大的顺序枚举就行了。Sample Input:5-2+3-4+5+4Sample Output:1 4#include "bits/stdc
2020-07-15 22:40:34
85
原创 PAT-A1149 Dangerous Goods Packaging (25分)
题意给出已知的不能放在一起的物品,然后输入几组物品,判断是否合理。思路题目没什么难的,难在时间复杂度和空间复杂度之间的权衡,任何一方面把握不好就ac不了。我觉得我的思路挺好,所以分享一下。大致思路是准备一个充分大的数组,对于每一组,物品一个一个的放进去,同时也将其不兼容的物品全部放进这个数组,一旦放入新的物品时发现这个位置已经是 1,说明这个物品不能放进去。Sample Input:6 320001 2000220003 2000420005 2000620003 2000120005
2020-07-15 22:32:36
104
原创 PAT----A1155
题意给出一颗完全二叉树的层次遍历,要求输出所有从根节点到叶子节点的所有路径(右子树优先),判断是否为最大堆或者最小堆。思路遍历的时候记录路径,遇到叶子节点就输出这条路径遍历二叉树,同时进行判断是否为最大堆或者最小堆#include "bits/stdc++.h"using namespace std;vector<int> temp;int a[1010];int n;void show(){ bool blank = false; for(int t:t
2020-07-15 17:52:52
99
原创 Spring Cloud Stream入门demo
前言本文提供一个Spring Cloud Stream极简的入门demo。概念Spring Cloud Stream是什么Spring Cloud Stream使我们不再需要关注具体的消息中间件的细节,而只需要用一种适配绑定的方式,修改配置文件,就能自动的在各种消息中间件内切换,它能屏蔽底层消息中间件的差异,降低切换成本,统一消息的编程模型,这使得Spring Cloud Stream具有很大的吸引力。编程模式:Spring Cloud Stream提供了三个开箱即用的预定义接口。Sour
2020-06-01 23:31:20
666
1
原创 jdk源码分析-集合-Collection
这里写目录标题前言类图IterableCollectionCollection.toArray()Collection.toArray(T[] a)Collection.toArray(IntFunction前言最近开始学习一些源码,netty、spring、springboot都在计划内,先从jdk源码开始吧。jdk版本为14。类图Iterable * Implementing this interface allows an object to be the target of the enh
2020-05-30 11:05:28
334
原创 二叉树常见问题
前言最近在复习数据结构,将一些习题以代码的形式记录,作为笔记。不使用STL,算法题中假设栈、队列的maxSize足够大。会持续更新。求非空二叉树的宽度(最多节点那层的节点数)利用队列进行层次遍历,同时统计每一层的节点数 int solve(Node *node){ int ans_cnt = 0, cnt = 0; Node *last = node; // 定义last指向当前层的最右边那个节点 Node* q[maxSize]; in
2020-05-24 22:49:19
730
原创 二叉树寻找节点的最近公共祖先
问题寻找p和q的最近公共祖先思路用栈对二叉树后序遍历,遍历时栈有如下特性:栈中的节点都是当前遍历节点的祖先,(最近的祖先是最近被弹出的节点)。基于这个性质,在遍历的时候如果p和q都已经遍历过了,则她们的共同祖先就是最近被弹出栈的那个节点。struct Node { int data{0}; Node *l{nullptr}; Node *r{nullptr};} Node* solve(Node *root,Node *p1,Node *p2){
2020-05-24 20:17:52
684
原创 二叉树寻找节点x的所有祖先
现在需要寻找链式二叉树节点元素为x的所有祖先并输出。思路利用栈进行后序遍历,设立两个栈in 和 out,in用来遍历二叉树,out用来存储输出的信息,仅仅是为了将遍历的节点存起来最后一起输出。利用栈进行后序遍历的步骤如下:节点p从根节点开始一直往右下走并进栈,直到null若p为null,则令p = stack.top().left,栈顶的那个元素已经没用了,所以并弹出一个元素。若p为null而且栈为空,说明遍历完成。struct Node { int data{0}; N
2020-05-24 19:53:35
4384
6
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人