当前位置: 首页 > news >正文

济南市网站建设_网站建设公司_版式布局_seo优化

做网站创业故事,企业网站的制作与维护,织梦古典网站模板,非凡软件站目录 descriptionsolutionaccepted codedetailsdescription 请你维护一个序列#xff0c;支持两种操作#xff1a; #xff08;1#xff09;某个区间 [x, y] 内的数同时加上一个增量 k。 #xff08;2#xff09;询问某一个区间 [x, y] 中从 1 开始的最大前缀和。 input … 目录 descriptionsolutionaccepted codedetails description 请你维护一个序列支持两种操作 1某个区间 [x, y] 内的数同时加上一个增量 k。 2询问某一个区间 [x, y] 中从 1 开始的最大前缀和。 input 第一行给出一个整数 n。n 100000。接下来一行 n 个整数表示序列的初始值。 第三行给出一个整数 mm 100000。接下来 m 行每行一个操作。 1 0 x y k表示给区间 [x, y] 同时加上 k。 2 1 x y询问区间 [x, y]。output 对于每个询问输出一个整数表示最大前缀和。 sample input 5 1 8 -8 3 -7 3 1 1 5 0 1 3 6 1 2 4sample output 9 22 solution 我们考虑直接维护前缀和序列则操作2就是在查询区间最大值。 而对于操作1我们相当于两部分操作 对于 x i y给 i 位置加上 (i-x1)*k对于 y i给 i 位置加上 (y-x1)*k。 前一个可以拆成 (-x1)*k i*k是常数 系数*位置的形式后面那个也可以看成这种形式只是位置前面的系数为 0。 看起来还是不好维护但是我们可以注意到这样一件事情对于某一个位置 i它的值总是形如 k*i b 的形式。 直线解析式。所以我们考虑用几何方法来维护这种东西。几何方法当然首先想到凸包。 每次操作相当于给区间内所有点的斜率与截距同时加上增量手算一下会发现这个区间相邻两点之间的斜率也会同时增加 k这样也就是说这个区间的凸包形状不会变化。 线段树不太好搞况且这道题时限 50s 我们考虑使用分块算法来维护凸包。 修改时散块暴力修改并重构凸包整块打标记记录这个区间整体的斜率与截距变化量。 查询时散块暴力求答案整块凸包上二分。 时间复杂度 \(O(n\sqrt{n}\log n)\) accepted code #includecstdio #includealgorithm using namespace std; typedef long long ll; const int MAXN 100000; const int BLOCK 320; const ll INF (1ll62); ll sp[BLOCK 5], b1[MAXN 5], b2[BLOCK 5]; int le[BLOCK 5], ri[BLOCK 5], num[MAXN 5]; int stk[MAXN 5], tp[BLOCK 5], n, m, bcnt 0; ll get_ans(int x) {return sp[num[x]]*x b1[x] b2[num[x]]; } ll query(int x) {int l le[x], r tp[x];while( l r ) {int mid (l r) 1;if( get_ans(stk[mid]) get_ans(stk[mid1]) ) r mid;else l mid 1;}return get_ans(stk[r]); } void push_tag(int x) {for(int ile[x];iri[x];i)b1[i] get_ans(i);sp[x] b2[x] 0; } void build(int x) {tp[x] le[x] - 1;for(int ile[x];iri[x];i) {while( tp[x] le[x] (get_ans(i) - get_ans(stk[tp[x]]))*(stk[tp[x]] - stk[tp[x] - 1]) (get_ans(stk[tp[x]])-get_ans(stk[tp[x] - 1]))*(i - stk[tp[x]]) )tp[x]--;stk[tp[x]] i;} } void init() {for(int i0;in;i) {if( i % BLOCK 0 ) {num[i] (bcnt);le[num[i]] ri[num[i]] i;sp[num[i]] b2[num[i]] 0;}else ri[num[i] bcnt];} } int main() {scanf(%d, n); init();for(int i0;in;i)scanf(%lld, b1[i]), b1[i] b1[i-1];for(int i1;ibcnt;i)build(i);scanf(%d, m);for(int i1;im;i) {int op, x, y; ll k;scanf(%d%d%d, op, x, y);x--, y--;if( op 0 ) {scanf(%lld, k);if( num[x] ! num[y] ) {push_tag(num[x]), push_tag(num[y]);for(int ix;iri[num[x]];i)b1[i] k*(i-x1);for(int ile[num[y]];iy;i)b1[i] k*(i-x1);for(int iy1;iri[num[y]];i)b1[i] k*(y-x1);build(num[x]), build(num[y]);for(int inum[x]1;inum[y]-1;i)sp[i] k, b2[i] k*(-x1);}else {push_tag(num[x]);for(int ix;iy;i)b1[i] k*(i-x1);for(int iy1;iri[num[y]];i)b1[i] k*(y-x1);build(num[x]);}for(int inum[y]1;ibcnt;i)b2[i] k*(y-x1);}else {ll ans -INF;if( num[x] ! num[y] ) {for(int ix;iri[num[x]];i)ans max(ans, get_ans(i));for(int ile[num[y]];iy;i)ans max(ans, get_ans(i));for(int inum[x]1;inum[y]-1;i)ans max(ans, query(i));}else {for(int ix;iy;i)ans max(ans, get_ans(i));}printf(%lld\n, ans);}} } details 突然发现这是我第一次写分块原来我以前从来没写过这种东西 把分块的左端点右端点以及每个点属于哪个块先预处理出来感觉比较好写。 并且把块的大小设置为常数也是一个不错的懒人做法虽然想想都知道这样肯定常数大。转载于:https://www.cnblogs.com/Tiw-Air-OAO/p/10262494.html
http://www.lebaoying.cn/news/109349.html

相关文章:

  • 个人网站用什么程序学什么技术比较有发展
  • 短视频软件开发数字营销网站主页优化
  • 备案可以不关闭网站吗深圳域名服务器地址
  • 网站seoapp丹阳seo公司
  • 更改网站模板内容移动应用开发女生学难不难
  • 公司制作一个网站价格企业展厅设计公司盛世笔特
  • 省级精品课程网站建筑工程水平防护网
  • 购物网站建设价位备案网站域名被抢注
  • 网站与网页的区别与联系wordpress 文章美化
  • 官方网站制作网络设计工程师是干什么的
  • 重庆做网站开发的公司100个免费邮箱号码
  • php网站开发路线上海青浦房地产网站建设
  • 网站模板 修改个人网站制作软件哪个好
  • 网站想做个链接怎么做百度游戏风云榜
  • 百度识图识别seo实战密码第四版电子书
  • 四平网站建设404页面对网站的好处及设置方法环球贸易网站
  • 济南专业的网站建设公司wordpress 系列教程
  • 模板王网站官网专业团队为您服务的句子
  • 苏州网站工作室俄文淘宝网站建设
  • 网站做常规优化广州网站搭建
  • h5网站开发哪个好宝塔面板wordpress安装
  • 专业做网站排名浙江省建设厅 网站是多少
  • 电商运营 网站运营家居设计网站推荐
  • o2o型网站昆明网站建设建站模板
  • 最好的wordpress 网站企业网站包含哪些页面
  • 免费广告设计网站响应式视频网站
  • 建设二手网站的建设费用包括自己做营销网站
  • 乐陵seo网站优化东莞网站设计排行榜
  • 找郴州一家做网站的公司电话上传网站信息问题
  • 怎么打开自己做的网站百度推广账户登录