链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do? problemCode=3888 Twelves Monkeys Time Limit: 5 Seconds      Memory Limit: 32768 KB James Cole is a convicted criminal living beneath a post-apocalyptic Philadelphia. Many years ago, the Earth's sur…
题目链接:ZOJ 3888 Twelves Monkeys 题意:题目描写叙述起来比較绕,直接讲案例 9 3 3 9 1 6 1 4 1 6 7 2 输入n,m,q.n限制了你询问的年份,m台时光机,q个询问. 接下来m行,描写叙述从第9年回到第1年. 接下里就是三个询问. 第一个询问6的答案是5. 1.从第6年回到第1年 (6-1)直接做时光机2,(6-7-8-9-1)过3年之后能够做时光机3. 有两个路径能够走(题目中要求至少两条路径).所以是有效的方案. 2.从第6年回到第2年 .....…
题目描述 给你一个长度为 $n$ 的序列,支持五种操作: $1\ l\ r\ x$ :将 $[l,r]$ 内的数加上 $x$ :$2\ l\ r\ x$ :将 $[l,r]$ 内的数减去 $x$ ,并与 $0$ 取 $\text{max}$ :$3\ l\ r\ x$ :将 $[l,r]$ 内的数变为 $x$ :$4\ y$ :询问第 $y$ 个数的值:$5\ y$ :询问第 $y$ 个数的历史最大值. $n,m\le 5\times 10^5,0\le x\le 10^9$ 题解 线段树维护历…
题目描述 给你一个序列,支持4种操作:1.查询区间最大值:2.查询区间历史最大值:3.区间加:4.区间赋值. 输入 第一行一个正整数T,表示Bob需要监视CPU的总时间. 然后第二行给出T个数表示在你的监视程序执行之前,Bob干的事让CPU在这段时间内每个时刻的使用率达已经达到了多少. 第三行给出一个数E,表示Bob需要做的事和询问的总数. 接下来E行每行表示给出一个询问或者列出一条事件: Q X Y:询问从X到Y这段时间内CPU最高使用率 A X Y:询问从X到Y这段时间内之前列出的事件使CP…
题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array is [1 3 -1 -3 5 3 6 7], and k = 3. 输入输出格式 输入格式: 输入一共有两行,第一行为n,k. 第二行为n个数(<INT_MAX). 输出格式: 输出共两行,第一行为每次窗口滑动的最小值 第二行为每次窗口滑动的最大值 说明 50%的数据,n<=10^5 100%的数…
当初竟然看成子串了$qwq$,不过老师的$ppt$也错了$qwq$ 由于子序列一定是的排列,所以考虑插入$1$到$m$到$n-m+1$到$n$; 如何判断呢?可以用哈希$qwq$: 我们用线段树维护哈希值,合并时用就把左子树的哈希值$x[ls]$在$B$进制下左移$sum[rs]$位,即$x[tr]=x[ls]*p[sum[rs]]+x[rs]$; 此时就可以向上更新哈希值. #include<cstdio> #include<iostream> #include<algor…
题目描述 虽不能至,心向往之. $Treap=Tree+Heap$ 椎$=$树$+$堆 小$\pi$学习了计算机科学中的数据结构$Treap$. 小$\pi$知道$Treap$指的是一种树. 小$\pi$还知道$Treap$节点上有两个权值$k$和$w$,其中$k$满足二叉搜索树性质.$w$满足堆性质. 小$\pi$还知道在$k$和$w$都各不相同的时候,$Treap$的形态是固定的. 但是小$\pi$不知道这道题目的做法. 这道题目要求你维护一个大根堆$Treap$,要求支持$n$个操作: $…
都说这题是 GSS 系列中最难的,今天做了一下,名副其实 首先你可以想到各种各样的在线乱搞想法,线段树,主席树,平衡树,等等,但发现都不太可行. 注意到题目也没有说强制在线,因此可以想到离线地去解决这道题. 我们把询问按照右端点从小到大排序.假设当前询问的右端点为 \(i\). 定义 \(s_j\) 为 \([j,i]\) 中不重复数字的和.我们建一棵线段树维护 \(s_j\) 的最大值. 这样修改起来就比较自然了,当右端点从 \(i-1\) 变到 \(i\) 的时候,记 \(a_i\) 上一次…
Twelves Monkeys Time Limit: 5000ms Memory Limit: 32768KB This problem will be judged on ZJU. Original ID: 388864-bit integer IO format: %lld      Java class name: Main   James Cole is a convicted criminal living beneath a post-apocalyptic Philadelphi…
题目:http://uoj.ac/problem/164 把操作改成形如 ( a,b ) 表示加上 a 之后对 b 取 max 的意思. 每个点维护当前的 a , b ,还有历史最大的 a , b 即 ma , mb . 因为最后的答案是 tp[ x ] + ma , mb 中的一个,所以这样维护.之所以不直接维护 max{ tp[ x ]+ma , mb } ,是为了方便转移. 转移 a , b 的时候就是 \( max{max{x+a,b}+a',b'} <=> max{x+a+a',ma…
Prime Query Time Limit: 1 Second      Memory Limit: 196608 KB You are given a simple task. Given a sequence A[i] with N numbers. You have to perform Q operations on the given sequence. Here are the operations: A v l, add the value v to element with i…
Description You have a string and queries of two types: replace i'th character of the string by character a; check if substring sj...sk is a palindrome. Input The first line contains a string consisting of n small English letters. The second line con…
发现最近碰到好多次二分结果的题目,上次多校也是,被我很机智的快速过了,这个思想确实非常不错.在正面求比较难处理的时候,二分结果再判断是否有效往往柳暗花明. 这个题目给定n个数字的序列,可以操作m次,每次要操作w个连续的数字,每次的操作将使得该段连续数字的数都+1,最后求整个序列最小值的最大值 求最小值最大,明显的二分结果的题目,我一开始还是在ACdream那个群里看到这个题,说是二分+线段树的题目,我就来做了一下..首先二分部分很容易,下界就是初始序列的最小值,上界就是 下界+m,至于怎么判断这…
Another LIS Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1244    Accepted Submission(s): 431 Problem Description There is a sequence firstly empty. We begin to add number from 1 to N to the s…
题目大意 有一个简单有向图.每个点有点权. 有三种操作: 修改点权 删除一条边 询问和某个点在同一个强连通分量中的点的前 \(k\) 大点权和. \(n\leq 100000,m,q\leq 200000\) 题解 把操作反过来,每次只有加边操作. 用线段树维护同一个强连通分量内的点的点权. 用整体二分去计算每条边的两个端点被合并的时间. 每次把加入时间 \(\leq tmid\) 的边拿出来跑一次 tarjan,就可以知道哪些边在 \(\leq tmid\) 的时间内被缩掉了. 用带撤回的并查…
luogu1415 拆分数列的加强版 先考虑弱化版怎么做 设f[i]表示某一串数,最后一个数的右端点是i时,它的左端点的最大值(也就是说,这一串数的最后一个数尽量小) 那么有$f[j]=max\{i+1|num[i+1,j]>num[f[i],i]\}$ 这样推下去,f[N]就是最后一个数的最小值 然后我们把它钦定住,再用类似的方式推回来,算出来最前面数的最大值 直接做的话,转移$O(n)$,判断两数是否相等$O(n)$,所以总共是$O(n^3)$的 显然过不了加强版,考虑如何优化. 可以发现这…
题目链接:https://cn.vjudge.net/contest/283920#problem/J 题目大意:首先给你n个门的高度,然后q次询问,每一次询问包括两种操作,第一种操作是将当前的门的高度提高到某一个值,第二种操作是给你一个起点,以及最大的跨越高度d,问你最远能走到哪里(如果能从a到达b则说明|Ha-Hb|<=d). 具体思路:用线段树维护每一个区间的最大值,对于操作1就是单点修改了,对于操作二的话,用二分+线段树的方法查询最远能到达的地方就可以了. AC代码: #include<…
https://codeforces.com/contest/1132/problem/D 二分 + 线段树(弃用结构体型线段树) 题意 有n台电脑,只有一个充电器,每台电脑一开始有a[i]电量,每秒消耗b[i]电量,充电器每秒可以给一台电脑充x电,假如有一台电脑在某一秒末电量<0,则会关机,问最小的x使得在k秒内没有任何电脑关机 题解 二分答案x,线段树维护区间[1,n]最小天数,枚举k天每天单点修改天数最小的点 代码 #include<bits/stdc++.h> #define M…
这题说的给了n个点m条边要求保证是一个有向无环图,可以删除至多k条边使得这个图的拓扑序的字典序最大,我们知道如果我们要排一个点的时候一定要考虑比他大的点是否可以.通过拆边马上拆出来,如果可以拆当然是拆,肯定保证字典序最大,如果不能拆,就不拆留着以后拆,当初这个比他大的点度数小于k的,最大是多少,这个方法我一直想不出,后来看了题解,二分加线段树,可以做到,线段树维护每个点的d[i],然后通过二分找出小于k的最大点是多少. #include <iostream> #include <algo…
传送门 线段树简单题. 二分答案+线段树排序. 实际上就是二分答案mid" role="presentation" style="position: relative;">midmid,然后把比mid" role="presentation" style="position: relative;">midmid小的全部变成0" role="presentation"…
给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数字,我们都想知道此时最长上升子序列长度是多少? 由于序列是顺序插入的,所以当前插入的数字对之前的数字形成的最长上升子序列没有任何影响,所以只需要计算出当前的这个数字结尾的上升子序列长度. 由于$dp[i]=max(dp[j])+1(j<i)$,所以可以用线段树维护. 这样就需要预先计算出来这个序列的最后的状态,考虑从n到1倒着算,二分这个数字出现的位置. 因此总时间复杂度为$O(nlogn…
题目链接 对于序列上每一段连续区间的数我们都可以动态开点建一棵值域线段树.初始时就是\(n\)棵. 对于每次操作,我们可以将\([l,r]\)的数分别从之前它所属的若干段区间中分离出来,合并. 对于升序与降序,只需要维护一个标记,若为降序,则给左区间大的那部分. 具体实现还要用set存下每棵线段树维护的区间左端点,便于快速查找包含\([l,r]\)的区间:对每个区间维护其右端点便于快速得到区间大小. 时间.空间复杂度都是\(O((n+m)\log n)\). 但是在洛谷上要么RE要么MLE..其…
Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这个全排列序列进行m次局部排序,排序分为两种:1:(0,l,r)表示将区间[l,r]的数字升序排序2:(1,l,r)表示将区间[l,r]的数字降序排序最后询问第q位置上的数字. Input 输入数据的第一行为两个整数n和m.n表示序列的长度,m表示局部排序的次数.1 <= n, m <= 10^5第二…
/** 题目:hdu6070 Dirt Ratio 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6070 题意:给定n个数,求1.0*x/y最小是多少.x表示一段区间内不同数字的个数,y表示区间长度. 思路:二分+线段树 二分答案x/y. 找一段区间满足 size(l,r)/(r-l+1) <= mid , size(l,r)表示[l,r]内不同数的个数. size(l,r)<=mid(r-l+1) => size(l,r)+mid*l<…
题解: 考虑用线段树维护楼的最大值,然后这个问题就很简单了. 每次可以向左二分出比x高的第一个楼a,同理也可以向右二分出另一个楼b,如果a,b都存在,答案就是b-a-1. 注意到二分是可以直接在线段树上进行的,所以复杂度是O(nlogn). 当然这里是用分块做的,更暴力一些. #include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace st…
题面 传送门 思路 首先看看我们到底要干什么:有$1e6$次询问,遍历$i$,每次要求一个形如$b_i \ast a_j - a_i \ast b_j$的东西的最大值 考虑如果一个$j$的决策在当前的$i$上比$k$这个位置更优会得到什么: $b_i \ast a_j - a_i \ast b_j > b_i \ast a_k - a_i \ast b_k$ $b_i \ast (a_j-a_k) > a_i \ast (b_j-b_k)$ $\frac{b_i}{a_i} > \fra…
要点 序列是n个不同的数,则新学到的一种策略就是二分这个位置的答案,然后可以上下调. 神奇地只关注大于还是小于mid并赋值0.1,这样m个操作的排序就能用线段树维护了! #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn = 1e5 + 5; int n, m, a[maxn], op…
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1287 题意:中文题诶- 解法1:b[i] 存储 max(a[0], ....., a[i]),显然 b 是单调不减的,所以直接二分 x,再更新 a 和 b 数组即可: 代码: #include <iostream> #include <stdio.h> using namespace std; ; int a[MAXN], b[MAXN], x;…
题目传送门 题意:已知每个人的独一无二的身高以及排在他前面或者后面比他高的人数,问身高字典序最小的排法 分析:首先对身高从矮到高排序,那么可以知道每个人有多少人的身高比他高,那么取较小值(k[i], n - i - k[i]),若后者小于0则无解.然后可以理解为每个人前面要留出p + 1个位子给高个的人,可用线段树维护,s[rt] 表示当前线段还能空出的位子数.当然也能用树状数组+二分查找位子的方法. /**********************************************…
前言 刚开始看着两道题感觉头皮发麻,后来看看题解,发现挺好理解,只是代码有点长. BZOJ 3672[NOI2014]购票 中文题面,题意略: BZOJ 3672[NOI2014]购票 设f(i)f(i)f(i)表示iii点所花的最小费用,可以写出方程式f(i)=min{ f(j)+pi(disi−disj)+qi }f(i)=min\{\ f(j)+p_i(dis_i-dis_j)+q_i\ \}f(i)=min{ f(j)+pi​(disi​−disj​)+qi​ }其中jjj是iii的祖先…