judger

[NOIP2018]赛道修建

江枫思渺然 提交于 2021-01-04 08:02:21
闲来无事,特意回味一下去年担当NOIPD1T3 (防AK却没能防住) 之大任的经典好题。 首先看到什么“最短赛道的长度尽可能大”,就知道离不开二分。于是我们想到了一种思路:二分+树上贪心。 二分判定很简单,就是对于二分出来的答案mid,检查树上是否有大于m条不相交的,权值和大于mid的链。而如何凑出尽可能多的权值和大于mid的链并使得它们互不相交,成为了这道题的关键之处。 树上贪心。 贪心策略不是很容易设计,下面给出一种:据题意可知,赛道的构建方式有且只有两种,1)一条链直接作为赛道(如下图中类似于红色的构建方式),2)两条半链(半链的理解对于这个题十分重要,请务必好好理解!)拼成一个赛道(因为不能走回头路因此最多只能两条拼)。我们对于以i为根的子树,先尽可能多的拼出赛道,同时在剩下拼不成整条赛道的情况下,选尽量长的传给父节点,作为父节点半链的候选答案。 根据题意及描述以及样例,易得这是一棵树,我们可以把1号节点作为根,从它开始进行搜索,对于每一个节点i,按照上面的贪心策略进行处理。 同时我们又会遇到一个问题:如何处理半链的拼接呢?显然,当子节点的最优长度加上本条边的长度>=Mid时,直接拼就可以了,如果不能的话,就把它放到multiset中进行维护,二分寻找最短的与当前长度的半链可以拼成整链的半链,如果找不到就打擂台取最大值,把最大的传上去即可。之后我们就可以开心地玩STL了~~

[CTSC2018]暴力写挂——边分树合并

此生再无相见时 提交于 2020-11-27 06:16:16
[CTSC2018]暴力写挂 题面不错 给定两棵树,两点“距离”定义为:二者深度相加,减去两棵树上的LCA的深度(深度指到根节点的距离) 求最大的距离。 解决多棵树的问题就是降维了。 经典的做法是 边分树合并 。 边分树结构类似0/1 trie 就是把边分树对于每个点拆开路径 合并两棵边分树同时可以得到两个边分树之间点对的路径的信息 感觉有点类似线段树合并。 根据“猫树”思想,两点间的路径一定经过边分树上LCA的那条边。(u,v不相等) 我们考虑在这个LCA处统计贡献 具体地,先对1树进行边分治 每个点初始的边分树是一条链,考虑对每个点构造出这个边分树。 开始只有根。 其实就是记录分治时候是在那个位置。 定义连接分治重心root深度较小的连通块为右部点,另一个为左部点 保存每个点作为左部点还是右部点 在每个之前最后一个加入位置lasi 下面加入左儿子或者右儿子。 在lasi位置保留这个信息vl,vr。初始是-inf 表示子树里所有的真实点在边分治这一层的左部、右部最大值。 左部点贡献权值:dis[x] 右部点贡献:dis[x]-dis[lca] 因为lca一定在右部点。 在第二棵树上枚举LCA z ,子树边分树合并上来(就类似树上的线段树合并) 合并时候max(vl(x)+vr(y)-dis'[z],vr(x)+vl(y)-dis'[z])更新答案。 然后vl(x)=max(vl

2020年7月第2题 PAT甲级真题 The Judger (25分)

99封情书 提交于 2020-10-03 19:28:27
A game of numbers has the following rules: at the beginning, two distinct positive integers are given by the judge. Then each player in turn must give a number to the judge. The number must be the difference of two numbers that are previously given, and must not be duplicated to any of the existed numbers. The game will run for several rounds. The one who gives a duplicate number or even a wrong number will be kicked out. Your job is to write a judger program to judge the players' numbers and to determine the final winners. Input Specification: Each input file contains one test case. For each

2020记录PAT甲级春季考试 1、 Prime Day 2、 The Judger 3、Safari Park 4、Replace Selection

旧城冷巷雨未停 提交于 2020-08-08 12:46:48
总结: 按这个出题的风格,历年的题应该没啥常考价值了,没有模板体,都得靠平时编码积累。 一、Prime Day 1、题意:给你一个日期字符串,判断字符串及其后缀字符串所对应的数字是否是一个素数。 如果全是素数的话还要输出一个 All Prime!,还有一个测试样例忘记了。 思路:就是利用stoi()和 substr()可以几分钟直接过了这题。 Input Sample 20191231 Output Sample 20191231 Yes 0191231 Yes 191231 Yes 91231 No 1231 Yes 231 No 31 Yes 1 No # include <bits/stdc++.h> using namespace std ; bool isprime ( int x ) { if ( x < 2 ) return false ; for ( int i = 2 ; i * i <= x ; i ++ ) { if ( x % i == 0 ) return false ; } return true ; } int main ( ) { # ifdef ONLINE_JUDGE # else freopen ( "Text.txt" , "r" , stdin ) ; # endif // DEBUG string str ; cin >> str ;

全栈之路-微信小程序-SKU开发(代码)

末鹿安然 提交于 2020-08-05 03:45:11
  SKU开发是小程序中最难的一部分,思路在分析中已经记录过了,这里主要看一下代码的实现,感觉老师写的代码太棒了,很优雅!主要想记录一下写代码的思路,对面向对象编程的实践。 一、代码结构的分析 1、说明几个关键词 搞清楚sku的概念,搞清楚我们抽象出来的realm组件、fence组件、cell组件以及他们对应的模型类,这里模型类放到models文件夹中 realm组件 --- fence-group.js中的FenceGroup模型 fence组件 --- fence.js中的Fence模型 cell组件 --- cell.js中Cell模型 除此之外,还有 矩阵的处理模型:matrix.js中的Matrix模型 总控制模型(负责方法的调用):judger.js中的Judger模型 sku-code处理模型:sku-code.js中的SkuCode模型 2019年12月10日11:04:41截止,可能后续还会有处理sku规格值的状态的模型,后续再补充... 2、分析他们之间的联系(做的图示) 说明: 图中所示的箭头的流向是从用户的角度来看,当点击规格值进行选择时,数据的流向 感想总结:这个结构这样抽象出来,感觉太清晰了,彼此之前是独立的,可扩展的,但是彼此之间是有联系的,各司其职,哇,感觉这样写出来的代码太美好了,原来写代码可以这么舒服,好的代码,好的架构真的让人耳目一新

洛谷 1440 求m区间内的最小值

早过忘川 提交于 2020-05-08 03:10:10
             洛谷 1440  求m区间内的最小值 题目描述 一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值。若前面的数不足m项则从第1个数开始,若前面没有数则输出0。 输入输出格式 输入格式: 第一行两个数n,m。 第二行,n个正整数,为所给定的数列。 输出格式: n行,第i行的一个数ai,为所求序列中第i个数前m个数的最小值。 题解: 偷偷告诉你,我超级喜欢暴力的。所以看到这个题的第一反应,就是打暴力 1 // luogu-judger-enable-o2 2 #include<iostream> 3 #include<cstdio> 4 #include<cstdlib> 5 #include<cstring> 6 #include<cmath> 7 using namespace std; 8 int a[ 2000010 ],n,m; 9 int main(){ 10 scanf( " %d%d " ,&n,& m); 11 for ( int i= 1 ;i<=n;i++ ) 12 scanf( " %d " ,& a[i]); 13 cout<< 0 << endl; 14 for ( int i= 2 ;i<=n;i++ ){ 15 int s=i-m,minn= 999999999 ; 16 if (s< 1 )

LOJ——#6277. 数列分块入门 1

无人久伴 提交于 2020-05-04 06:44:25
~~推荐播客~~ 「分块」数列分块入门1 – 9 by hzwer 浅谈基础根号算法——分块 博主蒟蒻,有缘人可直接观摩以上大佬的博客。。。 #6277. 数列分块入门 1 题目大意: 给出一个长为 $n$ 的数列,以及 $n$ 个操作,操作涉及区间加法,单点查值。 分块入门,区间修改+单点查询 所谓分块,实际上是一种优美的暴力,算是一种数据结构吧。。。 将区间分成许多大小相同的块,对于多出来的部分暴力去做,一般块的大小为$√n$ 看了大佬们的代码,有点儿懵逼=_= 来模拟一下流程吧,可能会清晰一点儿 如图所示,暴力地将一段长度为$10$的序列分成了$4$块,其中$3$块是大小为$√n$的块。 每个数所属块的标号显然是$bl[i]=(i-1)/blo+1$,其中$blo$为块的大小(手推一下即可) 假如你暴力修改某个区间,假设为$[2,7]$,( 算了,自己暴力模拟吧 ) 你首先要做的是暴力修改小区间,此时小区间为$[2.3]$和$[7,7]$ 这里小区间一般有两个,即最左边不在整个块中的数,和最右边不在整个块中的数 手推一下,暴力修改的左边区间为$[l,min(bl[l]*blo],r)$ emmmmm,我知道暴力修改左边区间的右端点就是$bl[l]*blo]$,为什么还要和给定修改的区间右端点去$min$呢? 。。。思考一下?( 大佬说显然嘛 ) 有可能这个待修改区间$[l,r

【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解

假装没事ソ 提交于 2020-04-30 04:22:59
  今天是 [LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧。 T1: P5248 [LnOI2019SP]快速多项式变换(FPT)   一看这题就很手软,没有告诉具体多项式到底有多少项,只好一个一个暴力枚举,但是这也不现实,于是小编就开始骗分,还一分也没骗着。赛后小编看到的题解,才明白这是一道转进制的题,将十进制转换成m进制,m^0,m^1,m^2这不刚好对应上m进制的单位吗?所得结果刚好就是问题的解。那么用短除法模拟算出m进制下f(m)的每一位,输出即可,代码如下: 1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int m,f,a[ 10000 ],k= 0 ; 5 int main() 6 { 7 scanf( " %d%d " ,&m,& f); 8 // cin>>m>>f; 9 for ( int i= 1 ;;i++ ) 10 { 11 a[++k]=f% m; 12 f/= m; 13 if (f== 0 ) break ; 14 15 } 16 printf( " %d \n " ,k); 17 // cout<<k<<endl; 18 for ( int i= 1 ;i<=k;i++ ) 19 printf( " %d