栈/队列/分块问卷调查反馈——Weak in the Middle,Cutting Plants,最小公倍数

文章目录

  • Weak in the Middle
    • source
    • solution
    • code
  • Cutting Plants
    • source
    • solution
    • code
  • [HNOI2016]最小公倍数
    • source
    • solution
    • code

Weak in the Middle

source

solution

栈模拟。

天数的计算,可以发现与其参与三元比较的次数有关

对于栈顶,如果被弹出,那么天数就是max⁡(\max(max(栈顶的参与次数,栈中栈顶的下一个的参与次数)+1)+1)+1

code

#include <cstdio>
#include <iostream>
using namespace std;
#define maxn 100005
int T, n;
int sta[maxn], cnt[maxn], ans[maxn], x[maxn];int main() {scanf( "%d", &T );while( T -- ) {scanf( "%d", &n );for( int i = 1;i <= n;i ++ ) {scanf( "%d", &x[i] );ans[i] = cnt[i] = 0;}int top = 0;for( int i = 1;i <= n;i ++ ) {while( top > 1 && x[sta[top]] < x[sta[top - 1]] && x[sta[top]] < x[i] ) {ans[sta[top]] = max( cnt[sta[top - 1]], cnt[sta[top]] ) + 1;cnt[sta[top - 1]] = ans[sta[top]];top --;}sta[++ top] = i;}for( int i = 1;i <= n;i ++ )printf( "%d ", ans[i] );}return 0;
}

Cutting Plants

source

solution

考场上调一个取反符号调完正常,非常好

非常标准的分块可做 只不过实现。。。

首先,先判无解,必须每棵树的目标高度要小于等于高度

nnn棵树分成n\sqrt nn

O(n)O(n)O(n)线性枚举iii,强制要求该操作后至少第iii个都必须达到目标要求

相当于固定操作的区间左端点iii,贪心的,想尽可能右移区间右端点

  • 先从iii开始暴力扫一遍iii​所在的块,并把标记tagtagtag下放

    • 符合要求:所有树的目标高度都小于等于iii的目标高度 且 所有树的当前高度都大于等于iii目标高度,这样才能操作

      • 从下一块开始整块枚举

        为了直接判断整块是否符合要求

        maxxmaxxmaxx记录块中所有树的目标高度的最大值

        hhh​记录块中所有的现在高度的最小值

        满足bi≥maxxj,bi≤hjb_i\ge maxx_j,b_i\le h_jbimaxxj,bihj

        • 满足要求

          更新整块的信息,所有树的当前高度都变成bib_ibi,用tagtagtag记录整块被操作后的同一高度

        • 否则,在当前块break

          再从当前块头开始暴力遍历该块,tagtagtag下放,可能当前块的前一部分是满足操作条件的,暴力操作更新

    • 不符合要求,更新到符合要求的最后一棵树就return

      更新:将jjj树的现在高度,直接变成iii的目标高度;更新块的所有树的现在高度的最小值

code

#include <cmath>
#include <cstdio>
#include <iostream>
using namespace std;
#define maxn 100005
#define maxB 320
int T, n, B;
int a[maxn], b[maxn], block[maxn], maxx[maxB], tag[maxB], h[maxB];void modify( int pos ) {int End = 0;if( tag[block[pos]] ) {for( int i = pos;i <= min( n, B * block[pos] );i ++ )a[i] = tag[block[pos]];tag[block[pos]] = 0;}for( int i = pos;i <= min( n, B * block[pos] );i ++ )if( a[i] < b[pos] || b[pos] < b[i] ) { End = i; break; }else a[i] = b[pos], h[block[pos]] = min( h[block[pos]], a[i] );if( End ) {h[block[pos]] = 2e9, maxx[block[pos]] = 0;for( int i = End;i <= min( n, B * block[pos] );i ++ ) {h[block[pos]] = min( h[block[pos]], a[i] );maxx[block[pos]] = max( maxx[block[pos]], b[i] );}return;}End = 0;for( int i = block[pos] + 1;i <= block[n];i ++ )if( h[i] < b[pos] || b[pos] < maxx[i] ) { End = i; break; }else tag[i] = h[i] = b[pos];if( ! End ) return;if( tag[End] ) {for( int i = ( End - 1 ) * B + 1;i <= min( n, End * B );i ++ )a[i] = tag[End];tag[End] = 0;}for( int i = ( End - 1 ) * B + 1;i <= min( n, End * B );i ++ )if( a[i] < b[pos] || b[pos] < b[i] ) break;else a[i] = b[pos], h[End] = min( h[End], a[i] );
}int main() {scanf( "%d", &T );next :while( T -- ) {scanf( "%d", &n );B = sqrt( n );for( int i = 1;i <= n;i ++ ) {scanf( "%d", &a[i] );block[i] = ( i - 1 ) / B + 1;}for( int i = 1;i <= n;i ++ )scanf( "%d", &b[i] );for( int i = 1;i <= n;i ++ )if( a[i] < b[i] ) { printf( "-1\n" ); goto next; }for( int i = 1;i <= block[n];i ++ ) h[i] = 2e9, maxx[i] = tag[i] = 0;for( int i = 1;i <= n;i ++ ) {maxx[block[i]] = max( maxx[block[i]], b[i] );h[block[i]] = min( h[block[i]], a[i] );}int ans = 0;for( int i = 1;i <= n;i ++ )if( a[i] == b[i] || b[i] == tag[block[i]] ) continue;else modify( i ), ans ++;printf( "%d\n", ans );}return 0;
}

[HNOI2016]最小公倍数

source

solution

分块。

答案为yes说明从uuuvvv有一条路径上的aaa的最大值和bbb的最大值恰好等于询问给定的a,ba,ba,b

先将所有aaa​从小到大排序,然后将所有询问bbb从小到大排序

分块,把所有询问挂在 最大的 满足小于等于询问的aaa 的边 所在的块

  • 具体而言就是枚举块iii,然后枚举询问,把aaa大于等于这个块的块头的aaa,且小于下个块块头的aaa的询问拎出来

将这个块前面的所有块的边重新按bbb排序

枚举拎出来的询问(因为最开始的操作,所以按bbb​​递增)

将满足bbb​​小于等于询问的bbb​​​的边加入并查集合并(先前的操作保证aaa一定小于等于询问的aaa

然后暴力枚举本块中满足的边,并查集合并(判断a,ba,ba,b都满足才行)

更新枚举的询问的答案,要判断a,ba,ba,b和最大值相等以外,还要保证两点u,vu,vu,v连通(父亲相同)

最后把暴力枚举的边,回退掉

所以是可撤销并查集,不能路径压缩

块的大小为nlog⁡m\sqrt{n\log m}nlogm

code

#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std;
#define maxn 100005
struct node {int u, v, a, b, id;node(){}node( int U, int V, int A, int B, int ID = 0 ) {u = U, v = V, a = A, b = B, id = ID;}
}g[maxn], E[maxn], Q[maxn], MS[maxn];
int n, m, q, top;
int f[maxn], siz[maxn], maxA[maxn], maxB[maxn], ans[maxn];int find( int x ) {return x == f[x] ? x : find( f[x] );
}void merge( int u, int v, int a, int b ) {u = find( u ), v = find( v );if( siz[u] < siz[v] ) swap( u, v );MS[++ top] = node( u, v, maxA[u], maxB[u], siz[u] );if( u ^ v ) {f[v] = u;siz[u] += siz[v];maxA[u] = max( maxA[u], maxA[v] );maxB[u] = max( maxB[u], maxB[v] );}maxA[u] = max( maxA[u], a );maxB[u] = max( maxB[u], b );
}int main() {scanf( "%d %d", &n, &m );int block = sqrt( m * log2( n ) );for( int i = 1, u, v, a, b;i <= m;i ++ ) {scanf( "%d %d %d %d", &u, &v, &a, &b );E[i] = node( u, v, a, b );}sort( E + 1, E + m + 1, []( node x, node y ) { return x.a == y.a ? x.b < y.b : x.a < y.a; } );scanf( "%d", &q );for( int i = 1, u, v, a, b;i <= q;i ++ ) {scanf( "%d %d %d %d", &u, &v, &a, &b );Q[i] = node( u, v, a, b, i );}sort( Q + 1, Q + q + 1, []( node x, node y ) { return x.b == y.b ? x.a < y.a : x.b < y.b; } );for( int k = 1;k <= m;k += block ) {for( int i = 1;i <= n;i ++ )f[i] = i, siz[i] = 1, maxA[i] = maxB[i] = -1;int cnt = 0;for( int i = 1;i <= q;i ++ )if( E[k].a <= Q[i].a && ( k + block > m || Q[i].a < E[k + block].a ) )g[++ cnt] = Q[i];if( ! cnt ) continue;else sort( E + 1, E + k, []( node x, node y ) { return x.b == y.b ? x.a < y.a : x.b < y.b; } );for( int i = 1, j = 1;i <= cnt;i ++ ) {for( ;j < k && E[j].b <= g[i].b;j ++ )merge( E[j].u, E[j].v, E[j].a, E[j].b );top = 0;for( int w = k;w <= min( m, k + block - 1 );w ++ )if( E[w].a <= g[i].a && E[w].b <= g[i].b )merge( E[w].u, E[w].v, E[w].a, E[w].b );int u = find( g[i].u ), v = find( g[i].v );ans[g[i].id] = ( u == v && maxA[u] == g[i].a && maxB[u] == g[i].b );for( int w = top;w;w -- ) {u = MS[w].u;v = MS[w].v;f[v] = v;maxA[u] = MS[w].a;maxB[u] = MS[w].b;siz[u] = MS[w].id;}top = 0;}}for( int i = 1;i <= q;i ++ )if( ans[i] ) printf( "Yes\n" );else printf( "No\n" );return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317257.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我的十年创业路

记十年创业的心路历程和我的创业思辨导读1 为什么写这篇文章2 详细的总结和思辨 2.01 感恩 2.02 为什么创业 2.03 十年流水账 2.04 经历了哪些失败 2.05 重要的职场基础 2.06 持续的学习和进步 2.07 创业与兴趣 2.08 价值观的碰撞和选择 2.09 合作与…

C - And and Pair

C - And and Pair 题意&#xff1a; 问有多少组(i,j)满足要求。 要求为&#xff1a; 0<j<i<n i&ni i&j0 答案mod 1e97 题解&#xff1a; 这个和我的思路时一样的&#xff0c;且讲的更清楚 i&ni说明n为0的地方&#xff0c;i必须为0&#xff1b;n为1的地…

CF850F Rainbow Balls(数学、期望)

解析 二倍相邻项&#xff0c;就要想裂项 纯数学题 一道黑色的小凯的疑惑 设总球数为 sss 我们先钦定一种颜色留到最后&#xff0c;那么其他颜色可以等价考虑 设 fif_{i}fi​ 为钦定的颜色的球有 iii 个&#xff0c;涂完需要的期望次数 则有&#xff1a; fi(fi−1fi1)pfi(1−2p…

pjudge#21652-[PR #4]到底有没有九【数位dp】

正题 题目链接:http://pjudge.ac/problem/21652 题目大意 给出一个正整数kkk&#xff0c;求第nnn个xxx满足x(10k−1)x\times (10^k-1)x(10k−1)中没有一个数位为999。 1≤n≤1018,1≤k≤181\leq n\leq 10^{18},1\leq k\leq 181≤n≤1018,1≤k≤18 解题思路 首先是从高位到低…

专题突破二之优先队列、st表——,Running Median,Sequence,Buy Low Sell High,数据备份,超级钢琴,ZQC的手办

文章目录Running MedianSequenceBuy Low Sell High[APIO/CTSC 2007] 数据备份[NOI2010] 超级钢琴「LibreOJ β Round」ZQC 的手办Running Median source 对顶栈 用大根堆和小根堆一起维护 若元素小于等于大根堆栈顶&#xff0c;放入大根堆否则放入小根堆 大根堆维护的就是…

G - Eating Plan

G - Eating Plan 题意&#xff1a; 一个1到n组成的排列&#xff0c;每个数的价值为其阶乘&#xff0c;有m个询问ki&#xff0c;要求你在排列中选取连续的一块&#xff0c;使得价值和mod 998857459 后&#xff0c;大于ki&#xff0c;问最短区间长度&#xff0c;如果不存在输出…

P4770:你的名字(SAM、线段树合并)

文章目录前言解析前言 1000A快乐&#xff01;&#xff01;&#xff01;awa 没有想象中的那么恶心。 解析 先考虑每次都询问 [1,n][1,n][1,n] 如何做。 正难则反&#xff0c;用T所有本质不同串数量减去是S串子串又是T的子串的数量 前者很好求&#xff0c;关键是后者 首先可以…

DotNetty 实现 Modbus TCP 系列 (一) 报文类

Modbus TCP/IP 报文报文最大长度为 260 byte (ADU 7 byte MBAP Header 253 byte PDU)Length Unit Identifier 长度 PDU 长度MBAP HeaderPDUPDU 由两部分构成&#xff1a;Function Code(功能码) 和 Data 组成Function Code部分功能码&#xff1a;报文类ModbusHeaderModbusHe…

AT2377-[AGC014E]Blue and Red Tree【启发式合并】

正题 题目链接:https://www.luogu.com.cn/problem/AT2377 题目大意 有两棵树T1,T2T_1,T_2T1​,T2​。T1T_1T1​树上的边开始时都是蓝色的&#xff0c;我们每次选择一条蓝色边路径(x,y)(x,y)(x,y)&#xff0c;然后删掉路径上一条边&#xff0c;连接一条xxx到yyy的红色边。 要…

B - A Funny Bipartite Graph

B - A Funny Bipartite Graph 题意&#xff1a; 一个二分图&#xff0c;左右各有n个点&#xff0c;左边第i个点有一个属性mi&#xff0c;它在一个图中的价值为midi,其中di为它在图中的度数(特殊的&#xff0c;如果度数为0&#xff0c;则价值为0)&#xff0c;求一个该二分图的…

专题突破三之并查集Ⅰ——Portal,parity,食物链,程序自动分析,Almost Union-Find,洞穴勘测

文章目录Portalparity[NOI2001] 食物链程序自动分析UVA11987 Almost Union-Find[SDOI2008] 洞穴勘测Portal source 百度翻译简直就是个鬼…(((m -__-)m 离线 将边和询问按权值排序&#xff0c;指针&#xff0c;将所有权值不超过当前询问iii的边全加进去 答案路径自然是不连…

C# 未来新特性:静态委托和函数指针

C# 每发布一次新版本&#xff0c;都会增加一些底层相关的新特性&#xff0c; 这些特性对大多数商业程序来说并没什么实际用处&#xff0c;主要用于那些对性能有很高要求的代码&#xff0c;如图形处理、机器学习以及数学工具包&#xff0c;等等。接下来的两个提案&#xff0c;主…

CF700E Cool Slogans(SAM,dp)

解析 好题。 首先&#xff0c;我们每次都令 sis_isi​ 是 si1s_{i1}si1​ 的后缀&#xff0c;肯定是不劣的 问题就可以转化到 fail 树上了 首先肯定要线段树合并处理出endpos集合 朴素想法&#xff1a;设父亲 fafafa 的结束位置为 posfapos_{fa}posfa​&#xff0c;若 [posfa−…

pjudge#21651-[PR #4]猜猜看【交互】

正题 题目链接:http://pjudge.ac/problem/21651 题目大意 有一个1∼n1\sim n1∼n的排列&#xff0c;每次你可以询问 iii和jjj的大小关系i,j,ki,j,ki,j,k的中位数 现在要求在222次111操作和2n2n2n次222操作内得到这个排列。 50≤n≤510550\leq n\leq 5\times 10^550≤n≤5105…

JavaWeb --第一章Web基本概念

JavaWeb --第一章Web基本概念 文章目录基本概念前言web开发&#xff1a;web应用程序静态web动态webweb服务器技术讲解web服务器基本概念 前言 web开发&#xff1a; web&#xff0c;网页的意思静态web a. html&#xff0c;css b. 提供给所有人看的数据始终不会发生改变动态we…

DotNetty 实现 Modbus TCP 系列 (二) ModbusFunction 类图及继承举例

DotNetty 实现 Modbus TCP 系列 (一) 报文类ModbusFunction 类图如下&#xff1a;如前文所述&#xff0c;所有请求/相应的 PDU 均继承自 ModbusFunction&#xff0c;其子类传入对应的 Function Code 并实现三个方法&#xff1a;CalculateLength&#xff1a;Data 部分的长度(该方…

AT2366-[AGC012F]Prefix Median【dp】

正题 题目链接:https://www.luogu.com.cn/problem/AT2366 题目大意 有一个长度为2n−12n-12n−1的序列aaa&#xff0c;你可以将其重新排列&#xff0c;定义bib_ibi​为a1∼2i−1a_{1\sim 2i-1}a1∼2i−1​的中位数。 询问有多少种不同的可能的bbb序列。 1≤n≤501\leq n\leq…

专题突破三之并查集Ⅱ——星球大战,In Touch,方格染色,Junk-Mail Filter,关押罪犯,Silver Woods,Must Be Rectangular!

文章目录[JSOI2008]星球大战In Touch方格染色Junk-Mail Filter[NOIP2010 提高组] 关押罪犯Silver WoodsMust Be Rectangular![JSOI2008]星球大战 source 非常套路的&#xff0c;正着打击星球&#xff0c;逆着就是添加星球以及关系&#xff0c;并查集维护此时连通块个数 就是…

模板:整体二分

所谓整体二分&#xff0c;就是对整体进行二分 &#xff08;逃&#xff09; 前言 又是一个狂艹树套树的小清新分治算法 但是树套树不需要动脑啊 整体二分有一些比较重要的条件&#xff1a; 修改对判定答案的贡献互相独立&#xff0c;修改之间互不影响效果修改如果对判定答案有…

JavaWeb --第二章 Tomact详情

JavaWeb --第二章 Tomact详情 文章目录Tomcat安装TomcatTomcat启动和配置配置发布一个web网站Tomcat 安装Tomcat 去官方下载 https://tomcat.apache.org Tomcat启动和配置 文件夹作用&#xff1a; 启动/关闭 Tomcat&#xff1a; 文件夹bin/startup.bat 开启 网址&#x…