cstring

CF 1083 B. The Fair Nut and Strings

醉酒当歌 提交于 2020-12-13 11:49:38
B. The Fair Nut and Strings 题目链接 题意:   在给定的字符串a和字符串b中找到最多k个字符串,使得不同的前缀字符串的数量最多。 分析:    建出trie树,给定的两个字符串就是trie树上的两条长度为n路径,那么就是在第n层的所有节点中,找到不大于k个点,(第n层的每个点向上到根的路径的路径上的字符组成一个长度为n字符串)。   两个第n层的节点一共会构成2n-lca个不同的前缀。所有可以根据这个贪心的选。每次尽量选已经走过的路径尽量少的路径。    从n往后枚举,计算长度为答案为i的可以选几个。   注意判断一下最后是否可以选择k个, 和已经选了的路径。 代码: 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #include<cmath> 5 #include<iostream> 6 #include<cctype> 7 #include< set > 8 #include<map> 9 #include<queue> 10 #include<vector> 11 #define fi(s) freopen(s,"r",stdin) 12 #define fo(s) freopen(s,"w",stdout) 13 using namespace std; 14

1083 -- Moving Tables

烂漫一生 提交于 2020-12-13 10:59:11
Moving Tables Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 32929 Accepted: 11032 Description The famous ACM (Advanced Computer Maker) Company has rented a floor of a building whose shape is in the following figure. The floor has 200 rooms each on the north side and south side along the corridor. Recently the Company made a plan to reform its system. The reform includes moving a lot of tables between rooms. Because the corridor is narrow and all the tables are big, only one table can pass through the corridor. Some plan is needed to make the moving efficient. The manager figured

[JZOJ 5910] [NOIP2018模拟10.18] DuLiu 解题报告 (并查集+思维)

萝らか妹 提交于 2020-12-13 10:12:38
题目链接: https://jzoj.net/senior/#contest/show/2530/0 题目: LF是毒瘤出题人中AK IOI2019,不屑于参加NOI的唯一的人。他对人说话,总是满口垃圾题目者也,教人半懂不懂的。因为他姓李,别人便从QQ群上的“毒瘤李Fee”这半懂不懂的话里,替他取下一个绰号,叫做李Fee。 李Fee一到机房,所有做题的人便都看着他笑,有的叫道,“李Fee,你又来出毒瘤题了!”他不回答,对验题人说,“我又出了两道题,给我验验。”便排出一排毒瘤题。大家又故意的高声嚷道,“你又暴露奸商本性拿毒瘤题骗钱剥削验题人了!”李Fee睁大眼睛说,“你怎么这样凭空污人清白……”“什么清白?我前天亲眼见你出了道毒瘤骗钱题,被PTY把std吊着打。” 李Fee便涨红了脸,额上的青筋条条绽出,争辩道,“出题人的题不能算骗……毒瘤!……出题人的题,能算毒瘤骗钱题么?”接连便是难懂的话,什么“多叉splay随机点分治”,什么“树链剖分套分治FFT”之类,引得众人都哄笑起来:机房内外充满了快活的空气。 虽然他的题十分毒瘤,但他的题还总是有买家。李Fee现在有N道毒瘤题,想将这些题出成一组题来骗大钱。然而显而易见的是,一组题的毒瘤程度不仅和每道题的毒瘤程度有关,也跟它们的排列顺序有关,李Fee需要将它们排列成最毒瘤但又最能骗钱的那个顺序。 具体来说,这N道题每题都有一个毒瘤值

Atlantis HDU

天涯浪子 提交于 2020-12-13 06:58:25
扫描线的模板题,先把信息接收,然后排序,记录下上边和下边,然后用一条虚拟的线从下往上扫。如果我扫到的是下边,那么久用线段树在这个区间内加上1,表示这个区间现在是有的,等我扫描到上边的时候在加上-1,把之前的消掉,然后线段树维护区间内的长度,这里不是直接用下标维护,而是需要另一个数组来维护,每次记录我当前的下标在原本的图中的长度。 在update部分用一个点表示我这个点以后的一个长度为1的区间,然后这样算出来的sum[1]就是我现在线段树里包括的区间大小,然后用现在的区间大小去乘上这一部分的高度,然后每次相加,就可以了 #include<map> #include < set > #include <ctime> #include <cmath> #include <stack> #include <queue> #include < string > #include <vector> #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define lowbit(x) (x & (-x)) typedef unsigned long long int ull; typedef long long int ll; const double

线段树(区间更新,区间求和)

我的梦境 提交于 2020-12-13 01:22:41
1082 线段树练习 3 题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的所有数增加X 2:询问区间[a,b]的数的和。 输入描述 Input Description 第一行一个正整数n,接下来n行n个整数, 再接下来一个正整数Q,每行表示操作的个数, 如果第一个数是1,后接3个正整数, 表示在区间[a,b]内每个数增加X,如果是2, 表示操作2询问区间[a,b]的和是多少。 pascal选手请不要使用readln读入 输出描述 Output Description 对于每个询问输出一行一个答案 样例输入 Sample Input 3 1 2 3 2 1 2 3 2 2 2 3 样例输出 Sample Output 9 数据范围及提示 Data Size & Hint 数据范围 1<=n<=200000 1<=q<=200000 wa了一发,因为求区间和爆int了 #include <iostream> #include <iostream> #include <cstdio> #include < string > #include <cstring> #include <algorithm> #include <stdio.h> #include < string .h> #define rep(i , n) for(int i = 0 ; i

POJ 3264.Balanced Lineup-RMQ(ST)详解

被刻印的时光 ゝ 提交于 2020-12-12 22:42:41
先写一道水题的博客,为后面要写的博客做一个铺垫。 ヾ(◍°∇°◍)ノ゙ RMQ(Range Minimum/Maximum Query),即区间最值查询,对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间的最小/大值。 时间复杂度: 1、朴素(即搜索),O(n)-O(qn) online。 2、 线段树 ,O(n)-O(qlogn) online。 3、ST(实质是 动态规划 ),O(nlogn)-O(q) online。 ST算法(Sparse Table),以求最大值为例,设d[i,j]表示[i,i+2^j-1]这个区间内的最大值,那么在询问到[a,b]区间的最大值时答案就是max(d[a,k], d[b-2^k+1,k]), 其中k是满足2^k<=b-a+1(即长度)的最大的k,即k=[ln(b-a+1)/ln(2)]。d的求法可以用 动态规划 ,d[i, j]=max(d[i, j-1],d[i+2^(j-1), j-1])。 传送门: 一篇写的容易理解的博客 2/21/2018 5:12:00 PM -------------------------------------------------------分割线-------------------------------------------------------

Luogu P3960 列队 线段树

大憨熊 提交于 2020-12-12 15:58:39
题面 线段树入门题。 我们考虑线段树来维护这个矩阵。 首先我们先定n+1棵线段树前n棵维护每行前m-1个同学中没有离队过的同学,还有一棵维护第m列中没有离队过的同学。再定n+1棵线段树前n棵线段树维护每行因一个同学离队而从第m列插♂进来的同学,还有一棵维护到队尾的同学。 具体怎么维护?比如当前的询问是(x,y),先分两种情况: 1.不在第m列。 那么我们就先看看这个同学是不是插♂进来,是的话就在那后n+1棵线段树的第x棵里找,不然就在前n+1棵的第x棵里找。 然后在对应线段树的对应位置里删除离队的同学,将第m列的第x行的那个同学(需要先判断是在前n+1棵里的第n+1棵还是后n+1棵)插♂到后n+1棵线段树的第x棵的最后,再把他原先所在的那个线段树里对应的位置删掉。最后把离队的同学插♂到后n+1棵线段树的第n+1棵的最后。 2.在第m列 先判断是在前n+1棵里的第n+1棵还是后n+1棵,然后他所在的那个线段树里对应的位置删掉,最后把离队的同学插♂到后n+1棵线段树的第n+1棵的最后。 // by zykykyk #include<cstdio> #include <ctime> #include <iostream> #include <algorithm> #include <cmath> #include < string > #include <cstring> #define

[SHOI2017]期末考试

末鹿安然 提交于 2020-12-12 01:04:07
题目描述 有n位同学,每位同学都参加了全部的m门课程的期末考试,都在焦急的等待成绩的公布。 第i位同学希望在第ti天或之前得知所有课程的成绩。如果在第ti天,有至少一门课程的成绩没有公布,他就会等待最后公布成绩的课程公布成绩,每等待一天就会产生C不愉快度。对于第i门课程,按照原本的计划,会在第bi天公布成绩。 有如下两种操作可以调整公布成绩的时间: 1、将负责课程X的部分老师调整到课程Y,调整之后公布课程X成绩的时间推迟一天,公布课程Y成绩的时间提前一天;每次操作产生A不愉快度。 2、增加一部分老师负责学科Z,这将导致学科Z的出成绩时间提前一天;每次操作产生B不愉快度。 上面两种操作中的参数X;Y;Z均可任意指定,每种操作均可以执行多次,每次执行时都可以重新指定参数。 现在希望你通过合理的操作,使得最后总的不愉快度之和最小,输出最小的不愉快度之和即可。 输入: 第一行三个非负整数 A; B; C ,描述三种不愉快度,详见【问题描述】; 第二行两个正整数 n; m(1 ≤ n; m ≤ 10^5) ,分别表示学生的数量和课程的数量; 第三行 n 个正整数 ti ,表示每个学生希望的公布成绩的时间; 第四行 m 个正整数 bi ,表示按照原本的计划,每门课程公布成绩的时间。 输出: 输出一行一个整数,表示最小的不愉快度之和。 这道题好多其他人都写的三分

蓝桥杯——寒假作业

懵懂的女人 提交于 2020-12-08 04:27:03
题目地址 现在小学的数学题目也不是那么好玩的。 看看这个寒假作业: 每个方块代表1~13中的某一个数字,但不能重复。 比如: 6 + 7 = 13 9 - 8 = 1 3 * 4 = 12 10 / 2 = 5 以及: 7 + 6 = 13 9 - 8 = 1 3 * 4 = 12 10 / 2 = 5 就算两种解法。(加法,乘法交换律后算不同的方案) 你一共找到了多少种方案? 输出 请填写表示方案数目的整数。 【方法一】 用 stl 中的 next_permutation函数 ,全排列,然后判断是否符合情况,符合则++ #include<iostream> #include <ctime> #include <cmath> #include <bits/stdc++.h> using namespace std; bool f( int a[]){ if (a[ 0 ]+a[ 1 ]!=a[ 2 ]) return false ; if (a[ 3 ]-a[ 4 ]!=a[ 5 ]) return false ; if (a[ 6 ]*a[ 7 ]!=a[ 8 ]) return false ; if (a[ 9 ]!=a[ 10 ]*a[ 11 ]) return false ; return true ; } int main() { int a[ 13 ] = { 1 ,

详解DLX及其应用

梦想与她 提交于 2020-12-05 04:30:13
<h1>什么是DLX?</h1> 让我们看看百度百科上的解释:在 计算机科学 中, Dancing Links ,舞蹈链, 也叫 DLX, 是由 Donald Knuth 提出的数据结构,目的是快速实现他的 X算法.X算法是一种递归算法,时间复杂度不确定, 深度优先, 通过回溯寻找精确覆盖问题所有可能的解。有一些著名的精确覆盖问题,包括铺砖块,八皇后问题,数独问题。 <h1>X算法</h1> <h2>概念</h2> X算法用由0和1组成的矩阵A来表示精确覆盖问题,目标是选出矩阵的若干行,使得其中的1在所有列中出现且仅出现一次。(出自度娘) <h2>实现步骤</h2> 1.如果矩阵A为空(没有任何列),则当前局部解即为问题的一个解,返回成功;否则继续。 2.根据一定方法选择第c列。如果某一列中没有1,则返回失败,并去除当前局部解中最新加入的行。 3.选择第r行,使得A[r,c]=1(该步是不确定的)。 4.将第r行加入当前局部解中。 5.对于满足A[r,j]=1的每一列j,从矩阵A中删除所有满足A[i,j]=1的行,最后再删除第j列。 6.对所得比A小的新矩阵递归地执行此算法。 <h2>图解</h2> >例如有一个这样的矩阵A: $$ \mathbf{A} = \left( \begin{array}{ccc} {0} & {0} & {1} & {0} & {1} & {1} &