UVALive - 3938:"Ray, Pass me the dishes!"】的更多相关文章

优美的线段树 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #include<cmath> #define MAXN 500000+10 #define ll long long #define pii pair<int,int> #define mp make_pair using namespace std; int a[MAXN]…
                        "Ray, Pass me the dishes!" Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu [Submit]   [Go Back]   [Status] Description   After doing Ray a great favor to collect sticks for Ray, Poor Neal bec…
"Ray, Pass me the dishes!" UVA - 1400 题意就是线段树区间子段最大和,线段树区间合并,但是这道题还要求输出最大和的子段的左右端点.要求字典序最小,要求左右端点尽量靠左. 比如: 3 3 3 -9 3 3 3 输出的是1 3,而不是1 7 3 3 3 -9 3 3 4 输出的是1 7,而不是5 7 大体意思就是这样. 有一个坑,我没读好题,输出Case是每一组样例输出一个,而不是每查询一次就输出一次Case... 其他没什么了.具体代码写了注释. 代码…
UVA 1400 - "Ray, Pass me the dishes!" option=com_onlinejudge&Itemid=8&page=show_problem&category=501&problem=4146&mosmsg=Submission+received+with+ID+13958986" target="_blank" style="">题目链接 题意:给定一个序…
原题链接 Description After doing Ray a great favor to collect sticks for Ray, Poor Neal becomes very hungry. In returnfor Neal's help, Ray makes a great dinner for Neal. When it is time for dinner, Ray arranges all the dishes he makes in a single line (a…
题意:求q次询问的静态区间连续最大和起始位置和终止位置 输出字典序最小的解. 思路:刘汝佳白书 每个节点维护三个值 pre, sub, suf 最大的前缀和, 连续和, 后缀和 然后这个题还要记录解的位置所以还要区间总和sum #include<iostream> #include<string> #include<algorithm> #include<cstdlib> #include<cstdio> #include<set>…
题目链接:https://cn.vjudge.net/problem/UVALive-3938 参考刘汝佳书上说的: 题意: 给出一个长度为n的序列, 再给出m个询问, 每个询问是在序列 $[a,b]$ 之间的最大连续和. 要你计算出这个这个区间内最大连续和的区间 $[x,y](a \le x \le y \le b)$: 思路: 1.构造线段树,其中每个结点维护3个值,最大连续子列和 $max\_sub$,最大前缀和 $max\_prefix$,最大后缀和 $max\_suffix$. 具体来…
题意:求一个动态区间的最大连续和. 静态版本的O(n)算法显示不适用了,但是可以用线段树分治,因为一个连续和要在两边的区间,要么跨越两边,对于一个结点维护最大前缀和,后缀和,子区间连续和. 题目要求输出区间,所以还要保存连续和最大的区间,以及前缀和,后缀和的位置.为了维护最大前缀和以及后缀和还需要一个区间和. 写的时候稍微麻烦一点,更新写成一个函数会方便很多.还好一遍过了... #include<bits/stdc++.h> using namespace std; ; typedef lon…
题目传送门 题意:动态最大连续子序列和,静态的题目 分析:nlogn的归并思想.线段树维护结点的三个信息,最大前缀和,最大后缀和,该区间的最大和的两个端点,然后答案是三个的better.书上用pair保存端点,用自带的<来得到最优. #include <bits/stdc++.h> using namespace std; #define lson l, mid, rt << 1 #define rson mid + 1, r, rt << 1 | 1 typed…
求一个区间的最大连续子序列,基本想法就是分治,这段子序列可能在区间的左半边,也可能在区间的右半边,也有可能是横跨区间中点,这样就是左子区间的最大后缀加上右子区间的最大前缀之和. 线段树维护三个信息:区间最大前缀.最大后缀.最大连续子区间的下标. 最大前缀可以通过递推来求:要么是左子区间的最大前缀和.要么是左子区间的和 加上 右子区间的最大前缀和 最大后缀和的递推类似. 递推之前要预处理整个序列的前缀和. #include <cstdio> #include <cstring> #i…
哈哈,原来题意看错了,但有多个解的时候,输出起点靠前的,如果起点一样,则输出终点靠前的,修改后AC的代码如下: #include <cstdio> #include <iostream> #include <algorithm> using namespace std; ; typedef long long int64; int dish[MAXN]; int64 dish_sum[MAXN]; int64 get_sum(int L, int R) { ]; } c…
uvaLive3938:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1939 题意:给你n个数,然后给你一个区间,让你查询这个区间内最大和连续子区间. 题解:哎.智商是硬伤啊,虽然线段树也做过不少题目,但是遇到这样的题目还是不会处理啊,看了别人的代码才明白了怎么做.用那个线段树维护区间最大前缀,最大后缀,以及真正的最大区间…
AC得相当辛苦的一道题.似乎不难,可是须要想细致, 開始的时候的错误思路----是受之前做过的区间最长连续子串影响http://blog.csdn.net/u011026968/article/details/38357157 区间合并的时候,我直接依照---假设(左子树的最大前缀和长度==左子树的长度 && 右子树的前缀和>0).就合并左前缀,这想法有两个错误:1.右子树的前缀和==0的时候是不是要合并区间呢?题目要求x尽量小,假设x同样y尽量小(x是ans的区间左端点.y是Ans…
题目链接:https://vjudge.net/problem/UVA-1400 题意:给一串序列,求最大子段,如果有多个,输出字典序最小的那个的左右端点 思路: 之前写过类似的,这个麻烦点需要输出左右端点,我们直接再开几个数组维护左右边界就好了,因为pushup和查询都需要合并操作,我们可以改下pushup传的参数,让查询的时候也可以用pushup合并区间信息. 字典序最小的只要合并和查询的时候都优先向左就好了. 实现代码; #include<bits/stdc++.h> using nam…
又是一道线段树区间更新的题: #include<cstdio> #include<algorithm> #include<cstring> #define ll long long #define maxn 500005 using namespace std; ll sum[maxn]; struct tree { int l,r; int ml,mr; int pre,suf; tree *left,*right; } tr[maxn*]; int trcount;…
思路 线段树维护最大子段和,只不过这题还要维护左右端点 还是维护pre,suf,sum,ans,只不过每个再多出一个维护端点的变量即可 注意多解讨论的大于号和大于等于号 代码 #include <cstdio> #include <algorithm> #include <cstring> #define int long long using namespace std; const int MAXN = 500100; struct Node{ int premax…
并发 1. 并发和并行 并发:两个或多个任务在同一时间段内运行.关注点在任务分割. 并行:两个或多个任务在同一时刻同时运行.关注点在同时执行. 本文大多数情况下不会严格区分这两个概念,默认并发就是指并行机制下的并发. 2. 好处 随着多核处理器的出现,并发编程可以提高程序的性能(吞吐量和响应能力). 3. 并发实现方式 共享内存模型 因为并发能提高程序的性能,为了解决并发的需求,许多编程语言提供了共享内存通信机制(本文称为共享内存模型),体现是引入了Thread(线程)等概念.线程的出现解决了两…
pass the hash原理: 在Windows系统中,通常会使用NTLM身份认证,NTLM认证不使用明文口令,而是使用口令加密后的hash值,hash值由系统API生成(例如LsaLogonUser) ,其中hash(哈希)分为LM hash和NT hash,如果密码长度大于15,那么无法生成LM hash. 从Windows Vista和Windows Server 2008开始,微软默认禁用LM hash,如果攻击者获得了hash,就能够在身份验证的时候模拟该用户(即跳过调用API生成h…
思路:详细分析见训练指南.注意可能答案的起点在左区间,终点在右区间 AC代码 #include <stdio.h> #include <algorithm> using namespace std; typedef long long LL; typedef pair<int, int> pii; const int maxn = 500000+5; int dish[maxn]; LL psum[maxn]; LL sum(int l, int r) { return…
题意:给定一棵带权树,Q次询问,每次询问路径上的中位数. 思路:中位数分边数奇偶考虑,当当边数为num=奇时,结果就算路径第num/2+1大,用主席树做即可... (做了几道比较难的主席树,都wa了...只有来刷刷水题,准备晚上的CF了) #include<bits/stdc++.h> using namespace std; ; int Laxt[maxn],Next[maxn],To[maxn],cost[maxn],cnt; ][],dep[maxn],rt[maxn],tot; str…
题目链接 题意 给出n个王国和n*n的矩阵,mp[i][j] 代表第 i 个王国欠第 j 个王国 mp[i][j] 块钱.如果当前的王国处于负债状态,那么这个王国就会被消除,和它相连的王国的债务都会被清除.因此会产生连锁反应,使得最后可能只剩下一个王国.输出对于每种情况,最后可能只剩下的王国有哪些. 思路 一开始的想法就是DFS+状压,但是TLE了,队友和我说没记录状态,那样的复杂度差不多是O(n!)的.后面队友写了一个,疯狂WA. 想了好久都没发现的错误:当时做法是全局记录一个原始的图和一个当…
http://acm.hdu.edu.cn/showproblem.php?pid=3938 Portal Problem Description   ZLGG found a magic theory that the bigger banana the bigger banana peel .This important theory can help him make a portal in our universal. Unfortunately, making a pair of po…
pro:有D个字母,每个字母有自己的权值,现状需要用它们拼出N个单词,使得这些单词互相不为另外一个的前缀. 且单词的权值和最小.D<=200; N<=200; sol:如果建立字典树,那个每个单词的权值权值救赎根到叶子的路径权重和. 感觉有点想哈夫曼树,但是没什么大的关系,因为不能倒推. 由于ND比较小,我们直接贪心,维护一个大小为N+D的数组b[],一直更新,原则如下:每次排序b[],把 b[1]替换为b[1]+a[]:一直操作,直到不能再变小为止. #include<bits/std…
Kerberos协议传送门:https://www.cnblogs.com/zpchcbd/p/11707302.html 1.黄金票据 2.白银票据…
题意:就是相当于动规里面的求最大连续子串,不同的是,这里需要读入一个区间x,y,输出的区间 a,b 且x<=a<=b<=y,使得a b的连续子串最长,而且询问次数达到了10的五次方. 我是在大白书上看到这个题,一开始想简单了,就照着刘汝佳的思路写,线段树里只存了前缀最大和,后缀最大和,总最大和,但题目要求输出区间,明显的需要添加记录维护区间位置的,而且不止要存储 a,b,还要存pre suf,前缀 后缀的边界位置.我第一次写的时候意识到了,但是那个时候已经有点混乱了,我以为在查询的时候,…
用KMP里面的next数组即可,原理就是next数组的原理 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #include<vector> #define MAXN 1000000+10 #define ll long long using namespace std; char s[MAXN]; int n; int nxt[MAXN]; voi…
发现字典里面的单词数目多且长度短,可以用字典树保存 f[i]表示s[i~L]的分割方式,则有f[i]=∑f[i+len(word[j])]   其中word[j]为s[i~L]的前缀 注意字典树又叫前缀树,所以用前缀更方便,否则按顺序dp的话就要把字符倒序了 复杂度O(L*l) L为字符串长度,l为单词长度 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #de…
加权并查集 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #define MAXN 20000+10 #define pii pair<int,int> using namespace std; int fa[MAXN]; int d[MAXN]; int n; int Abs(int x){ ?x:-x); } pii find(int x){…
dp 可以发现,对于(i,j),要么把它运上去,那么把它运到左边,枚举一下即可 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #define MAXN 505 using namespace std; int f[MAXN][MAXN]; int a[MAXN][MAXN],b[MAXN][MAXN]; int s[MAXN][MAXN],t[MAXN][MA…
约瑟夫环 f[i]表示有i个人先处理第k个人,最后被处理的人是谁 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #define MAXN 10005 using namespace std; int f[MAXN]; int n,m,k; int main() { ){ scanf("%d%d%d",&n,&k,&m…