BZOJ3745 : [Coci2014]Norma】的更多相关文章

考虑枚举右端点,用线段树维护[i,nowr]的答案. 当右端点向右延伸时,需要知道它前面第一个比它大/小的数的位置,这里面的最值将发生改变,这个使用单调队列求出,然后将所有的l都加1. 注意常数优化. #include<cstdio> #define PB int mid=(a+b)>>1,l=x<<1,r=l|1;if(T[x].tx)cmax1(l,T[x].tx),cmax1(r,T[x].tx),T[x].tx=0;if(T[x].tn)cmin1(l,T[x]…
[BZOJ3745]Norma(CDQ分治) 题面 BZOJ 洛谷 题解 这种问题直接做不好做,显然需要一定的优化.考虑\(CDQ\)分治. 现在唯一需要考虑的就是跨越当前中间节点的所有区间如何计算答案了. 从\(mid\)开始向左枚举左端点,考虑右端点的贡献.那么我们在右侧记录两个指针\(p,q\),分别表示左侧的最大值和最小值第一次改变的位置.这两个指针会把整个序列分成三段. 第一段最大值和最小值都是左侧最大最小值,直接计算区间长度和就好了. 第二段是最大值和最小值中一个被改变了,分情况讨论…
Norma Time Limit: 20 Sec  Memory Limit: 64 MB[Submit][Status][Discuss] Description Input 第1行,一个整数N: 第2~n+1行,每行一个整数表示序列a. Output 输出答案对10^9取模后的结果. Sample Input 4 2 4 1 4 Sample Output 109 HINT N <= 500000 1 <= a_i <= 10^8 Solution \begin {align} &a…
Description Input 第1行,一个整数N: 第2~n+1行,每行一个整数表示序列a. Output 输出答案对10^9取模后的结果. 预处理每个位置的数作为最小/大值向左延伸的最大距离,线段树维护序列的前缀的后缀min和后缀max以及这个前缀的后缀对答案的贡献,在前缀末尾加入一个数可以快速维护. #include<cstdio> typedef long long i64; ,P=; ],*ptr=buf-; int _(){ ,c=*++ptr; )c=*++ptr; )x=x…
题意 题目链接 分析 考虑分治,记当前分治区间为 \(l,r\) . 枚举左端点,然后发现右端点无非三种情况: 极大极小值都在左边; 有一个在左边; 极大极小值都在右边; 考虑递推 \(l\) 的同时递推最靠右的满足最大最小值在左边的位置 \(p_1,p_2\). 根据不同的情况计数即可,注意计算以 \(\rm mid\) 作为右端点的情况. 总时间复杂度为\((nlogn)\). 重点:分治算法降低复杂度的原因:根据极大极小值的不同划分数据以及? 代码 #include<bits/stdc++…
链接 bzoj 思路 首先\(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\sum\limits_{k=i}^{j}max(a_k)\)可以用单调队列求解.参见? 求解此题目,我们分治.计算\([l,mid]\)对\([mid+1,r]\)的贡献. 我们从后向前枚举\(mid\)到\(l\),定义为\(x\).(\(A\)为\([x,mid]\)中的最小值,\(B\)为\([x,mid]\)中的最大值) 得到\(p\)(\([mid+1,r]\)中大于等于…
(总计:共66题) 4.18~4.25:19题 4.26~5.2:17题 5.3~5.9: 6题 5.10~5.16: 6题 5.17~5.23: 9题 5.24~5.30: 9题 4.18 [BZOJ3786]星系探索(伪ETT) [BZOJ4337][BJOI2015]树的同构(树的最小表示法) [BZOJ3551][ONTAK2010]Peaks(加强版)(Kruskal重构树,主席树) [CTSC2017]游戏(Bayes定理,线段树) 4.19 [CTSC2017]吉夫特(Lucas定…
[BZOJ3745][Coci2015]Norma Description Input 第1行,一个整数N: 第2~n+1行,每行一个整数表示序列a. Output 输出答案对10^9取模后的结果. Sample Input 4 2 4 1 4 Sample Output 109 [数据范围] N <= 500000 1 <= a_i <= 10^8 题解:最近做这种题好像有点多啊~(虽然我基本上都没A). 比较直接的想法就是找出区间的最大值mid,然后分治处理[l,mid-1]和[mi…
[题解]Norma [COCI2014] [SP22343] 传送门:\(\text{Norma [COCI2014]}\) \(\text{[SP22343]}\) [题目描述] 给定一个整数 \(n\) 和一个长度为 \(n\) 的序列 \(a\),子序列是指原序列中一段连续的序列.子序列的价值定义为它们中的最小值乘以最大值再乘以该子序列长度 .现要计算所有子序列的价值之和,答案对 \(1e9\) 取模. [样例] 样例输入: 3 1 2 样例输出: 16 样例输入: 4 2 4 1 4 样…
浅谈离线分治算法:https://www.cnblogs.com/AKMer/p/10415556.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?id=3745 我们对于所有区间,要么在分治的\(mid\)左边,要么在分治的\(mid\)右边,我们可以递归去处理. 所以我们只需要知道怎么快速统计经过\(mid\)的区间的答案即可. 我们从大到小枚举区间的左端点\(x\),然后计算\(\sum\limits_{y=mid+1}^{r}an…
要命的题目. 写法:分类讨论进行计算. 枚举过每一个\(mid\)的所有区间.对于左端点\(i∈[l, mid - 1]\),向左推并计算\([l,mid]\)范围内的最大\(/\)最小值. 然后右端点\(p\)分三种类型考虑. \(p∈[mid + 1, p1 - 1]\),其中\(p1\)是第一次出现比\(maxw\)大或者比\(minw\)小的数的位置. \(p∈[p1, p2 - 1]\),其中\(p2\)是第二次出现比\(maxw\)大或者比\(minw\)小的数的位置. \(p∈[p…
完全想不到地,考虑分治. 对区间[l,r],将左端点x由mid不断左移,右边记录最右的p满足max[mid+1,p]<=max[x,mid],q满足min[mid+1,q]>=min[x,mid].这样右边被分成三部分,分别统计. 对于p和q左边的位置,这部分的max和min显然是由左边部分决定的,答案非常好算. 对于p和q右边的位置,这部分的max和min显然是由右边部分决定的,可以在分治的一开始预处理一个右区间的前缀len*max*min和max*min,这样就很好算了. 对于p和q中间的…
Norma Description Input Format 第1行,一个整数N: 第2~n+1行,每行一个整数表示序列a. Output Format 输出答案对10^9取模后的结果. Sample Input 4 2 4 1 4 Sample Output 109 解析 可以考虑分治计算贡献,对于一次分治\((l,r,mid)\),我们只需要计算跨过中点\(mid\)的子区间带来的贡献即可. 我们可以枚举一个左端点\(L\in[l,mid]\),然后尝试计算所有的\(R\in[mid+1,r…
T1725 天黑请闭眼 Online Judge:COCI2014/2015 Contest#1 D MAFIJA(原题) Label:基环树,断环+树形Dp,贪心+拓扑 题目描述 最近天黑请闭眼在 C国十分流行!游戏里有两个身份,一个是杀手,另一个是平民.杀手知道哪些人是杀手,而平民对此一无所知.现在为了知道谁是杀手,参与游戏的每个人都指证了一个人为杀手,可以确定的是,杀手一定会指证平民,而平民指证的人有可能是杀手,也有可能是平民.给出每位玩家指证的人,请找出游戏中最多可能的杀手个数. 输入…
d[x][0]表示x点向下走且回到x点的最少代价 d[x][1]表示x点向下走但不回到x点的最少代价 d[x][2]表示x点向下走的最长路 d[x][3]表示x点向下走的次长路 u[x][0]表示x点向上走且回到x点的最少代价 u[x][1]表示x点向上走但不回到x点的最少代价 一遍树形DP即可 ans[i]=min(d[i][0]+u[i][1],d[i][1]+u[i][0]) #include<cstdio> #define N 500010 typedef long long ll;…
日常我们为了让文字内容在一行内显示完,哪怕宽度不够也不能换行,我们可以使用white-space样式,但如果遇到了html br强制换行标签,无论是设置white-space与否都会被<br>强制换行. 昨天仿照娜姐做的标题滚动,自己照着那个js也写了一个,结果发现死活就是不滚动,今天早上发现原来还有一段CSS代码没有看到,这个css代码尤为重要. 其中就是有一个属性: white-space:nowrap; 2.white-space参数:normal : 默认处理方式nowrap : 强制…
Description Solution 考虑分治: 我们要统计跨越 \(mid\) 的区间的贡献 分最大值和最小值所在位置进行讨论: 设左边枚举到了 \(i\),左边 \([i,mid]\) 的最大值为 \(mx\),最小值为 \(mn\) 1.最大值最小值都在左边:\(\sum_{j=mid+1}^{p}mx*mn*(j-i+1)\),可以用等差数列直接算出 2.最大/小值有一个在左边 \(\sum_{j=p}^{q}mx*Mx[j]*(j-i+1)\) 我们可以拆成 \(\sum_{j=p…
Description 给定一个正整数序列 \(a_1,a_2,\cdots,a_n\),求 \[ \sum_{i=1}^n\sum_{j=i}^n(j-i+1)\min(a_i,a_{i+1},\cdots,a_j)\max(a_i,a_{i+1},\cdots,a_j) \] Input 第 \(1\) 行,一个整数 \(n\): 第 \(2\dots n+1\) 行,每行一个整数表示序列 \(a\). Output 输出答案对 \(10^9\) 取模后的结果. Sample Input 4…
题面 洛谷 你有一个长度为n的序列,定义这个序列中每个区间的价值是 \(Cost(i,j)=Min(Ai...Aj)∗Max(Ai...Aj)∗(j−i+1)Cost(i,j)=Min(A_{i}...A_{j})*Max(A_{i}...A_{j})*(j-i+1)\) 其中,\(i,j\)是区间的两个端点. 现在请你求出给定序列所有区间的价值之和. \(n \leq 5e5\) 统计所有子区间 考虑cdq分治 左区间对右区间的贡献如何计算? 用一个cur从mid到L扫左区间 mn,mx表示[…
洛谷题目传送门 这题推式子恶心..... 考虑分治,每次统计跨过\(mid\)的所有区间的答案和.\(i\)从\(mid-1\)到\(l\)枚举,统计以\(i\)为左端点的所有区间. 我们先维护好\([i,mid]\)区间内最小值\(mn\)和最大值\(mx\).我们可以想到,对于某一个左端点,它的右端点\(j\)在一定的范围内,最小值和最大值都不会变.这里就看到一些可以重复利用并快速计算的信息了. 维护两个指针\(p,q\),分别表示\([mid+1,r]\)内元素值第一个小于\(mn/\)大…
Description 现在有一个长度为\(N(N\leq 500000)\)的序列,定义区间\([l,r]\)的价值为\([l,r]\)的最小值乘上\([l,r]\)的最大值乘上\([l,r]\)的长度.问这个序列的所有区间的价值和对\(10^9\)取模的结果. Solution 遇到神仙题考虑分治. 考虑所有经过\(mid\)的区间. 对于小于等于\(mid的\)\(i\),我们要求所有在\(mid\)右边的\(j\)并计算\([i,j]\)的价值. 可以先维护出来\([i,mid]\)的最…
题意 给定一个正整数序列 \(a_1, a_2, \cdots, a_n\) ,求 \[ \sum_{i=1}^{n} \sum_{j=i}^{n} (j - i + 1) \min(a_i,a_{i+1},\cdots,a_j) \max(a_i,a_{i+1},\cdots,a_j) \pmod {10^9} \] \(n \le 5\times 10^5, a_i \le 10^9\) 题解 对于这种求一段区间内所有子区间答案和的东西,我们常常可以考虑分治解决. 通常思路是这样的: 假设我…
Description Input 第1行,一个整数N: 第2~n+1行,每行一个整数表示序列a. Output 输出答案对10^9取模后的结果. Sample Input 4 2 4 1 4 Sample Output 109 [数据范围] N <= 500000 1 <= a_i <= 10^8 Solution 这题目好麻烦 考虑所有子区间问题的贡献可以考虑分治 假设当前到达 \(l,r\) 区间,计算跨过 \(mid\) 的贡献 一个指针 \(x\) 从 \(mid\) 往 \(…
T1:FUNGHI(1s,32M,50pts)得分:50 题意:给你8个数组成一个环,要你求出其中连续的4个数,让它们的和最大 题解:暴力求出每一连续4个数之和,比较一下就好 标签:模拟 C++ Code: #include<cstdio> using namespace std; int s[10],ans,maxn; int main(){ freopen("FUNGHI.in","r",stdin); freopen("FUNGHI.ou…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3745 如果分治,就能在本层仅算过 mid 的区间了. 可以从中间到左边地遍历左边,给右边两个指针,表示第一个更新左边造成的最小值/最大值的位置. 两个位置共同的左边可以公式算长度,用左边的最值算:两个位置共同的右边可以预处理,处理出 算上长度(相对mid的)的最值乘积求和 与 不算长度的最值乘积求和(都是前缀),把前者加到答案里,后者乘上左边到mid的长度加到答案里即可:两个位置夹着的位置…
参考:https://blog.csdn.net/lych_cys/article/details/51203960 真的不擅长这种-- 分治,对于一个(l,r),先递归求出(l,mid),(mid+1,r),然后这个区间对答案贡献的就是经过mid的区间 我们先预处理出mid为l的右端点的mx*mn*len的前缀和与mx*mn的前缀和,然后枚举左端点,右端点维护两个下标j,k,分别表示mn和mx在左端点时的合法右端点 然后分三种情况处理,假设j<k 1.右端点在(mid+1,j)时,直接计算 2…
Mission 2<=N<=300,2<=M<=N∗(N−1) Solution SPFA. 由于只是二元关系,所以条件随便写. 具体来说,如果是u⇒v. 若v的最大领先时间还不是正数,就要使得v的最大领先时间尽量大: 若v的最大领先时间已经是正数,就要使得v的经过道路尽量少: Code #include<iostream> #include<stdio.h> #include<algorithm> #include<string.h>…
题目来自:http://218.5.5.242:9018/JudgeOnline/problem.php?id=1815 题目描述 Mirko在数学课上以一种有趣的方式操作数列,首先,他写下一个数列A,然后他对该数列的前i个数求平均值,得到一个数列B.比如数列A为1,3,2,6,8,那么数列B为:现在,给你第二个数列B,求第一个数列A. 输入 第一行为整数N(1<=n<=100),表示数列B的长度.第二行为n个整数,表示数列B.(1<=Bi<=10^9) 输出 输出仅有一行为n个整…
\(\mathcal{Description}\)   Link.   给定 \(\{a_n\}\),求: \[\sum_{i=1}^n\sum_{j=i}^n(j-i+1)\min_{k=i}^j\{a_k\}\max_{k=i}^j\{a_k\} \]   答案对 \(10^9\) 取模. \(\mathcal{Solution}\)   挺可爱的一道题 w.   静态序列计数问题,可以考虑分治:对于 \([l,r]\)(\(l<r\)),令分割点 \(p=\lfloor\frac{l+r}…
[CF526F]Pudding Monsters 题意:给你一个排列$p_i$,问你有对少个区间的值域段是连续的. $n\le 3\times 10^5$ 题解:bzoj3745 Norma 的弱化版.直接cdq分治,考虑最大值和最小值分别在左右两边的情况.这里就当练练手了. #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespac…