7.9T2EASY(easy)
EASY(easy)
sol:非常经典的题,取了一次之后,把线段树上这一段变成相反数 然后再贪心取和最大的。 重复以上操作,发现最后一定有对应的解,且根据贪心过程一定 是最大的 线段树上维护区间和最大/小及位置,左/右连续最大/小及位置, 取反标记
除了写起来特别麻烦之外都还好
#include <bits/stdc++.h>
using namespace std;
typedef int ll;
inline ll read()
{
ll s=;
bool f=;
char ch=' ';
while(!isdigit(ch))
{
f|=(ch=='-'); ch=getchar();
}
while(isdigit(ch))
{
s=(s<<)+(s<<)+(ch^); ch=getchar();
}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<)
{
putchar('-'); x=-x;
}
if(x<)
{
putchar(x+''); return;
}
write(x/);
putchar((x%)+'');
return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=;
int n,m,a[N];
#define Mp make_pair
#define c1 (x<<1)
#define c2 (x<<1|1)
struct Record{int l,r,Zhi;};
inline Record min(Record a,Record b) {return (a.Zhi<b.Zhi)?a:b;}
inline Record max(Record a,Record b) {return (a.Zhi>b.Zhi)?a:b;}
struct Node
{
pair<int,int>Mxl,Mnl,Mxr,Mnr;
Record Mx,Mn;
int Sum,Rev;
}T[N<<];
inline void Rev(Node &b)
{
swap(b.Mnl,b.Mxl); swap(b.Mnr,b.Mxr); swap(b.Mn,b.Mx);
b.Mnl.first*=-; b.Mnr.first*=-; b.Mn.Zhi*=-;
b.Mxl.first*=-; b.Mxr.first*=-; b.Mx.Zhi*=-;
b.Sum*=-; b.Rev^=;
}
inline void Down(int x)
{
if(!T[x].Rev) return;
Rev(T[c1]); Rev(T[c2]); T[x].Rev^=;
}
inline Node Merg(Node b1,Node b2)
{
Node Res;
Res.Rev=;
Res.Mnl=min(b1.Mnl,Mp(b1.Sum+b2.Mnl.first,b2.Mnl.second));
Res.Mxl=max(b1.Mxl,Mp(b1.Sum+b2.Mxl.first,b2.Mxl.second));
Res.Mnr=min(b2.Mnr,Mp(b2.Sum+b1.Mnr.first,b1.Mnr.second));
Res.Mxr=max(b2.Mxr,Mp(b2.Sum+b1.Mxr.first,b1.Mxr.second));
Res.Mn=min((Record){b1.Mnr.second,b2.Mnl.second,b1.Mnr.first+b2.Mnl.first},min(b1.Mn,b2.Mn));
Res.Mx=max((Record){b1.Mxr.second,b2.Mxl.second,b1.Mxr.first+b2.Mxl.first},max(b1.Mx,b2.Mx));
Res.Sum=b1.Sum+b2.Sum;
return Res;
}
inline void Build(int x,int l,int r)
{
if(l==r)
{
T[x].Mnl=T[x].Mxl=T[x].Mnr=T[x].Mxr=Mp(a[l],l);
T[x].Mn=T[x].Mx=(Record){l,l,a[l]};
T[x].Sum=a[l]; T[x].Rev=;
return;
}
int mid=(l+r)>>;
Build(c1,l,mid); Build(c2,mid+,r);
T[x]=Merg(T[c1],T[c2]);
}
inline void Change(int x,int l,int r,int Pos,int Val)
{
if(l==r)
{
T[x].Mnl=T[x].Mxl=T[x].Mnr=T[x].Mxr=Mp(Val,l);
T[x].Mn=T[x].Mx=(Record){l,l,Val};
T[x].Sum=Val;
return;
}
Down(x);
int mid=(l+r)>>;
if(Pos<=mid) Change(c1,l,mid,Pos,Val);
else Change(c2,mid+,r,Pos,Val);
T[x]=Merg(T[c1],T[c2]);
}
inline void Reverse(int x,int l,int r,int ql,int qr)
{
if(l==ql&&r==qr) {Rev(T[x]); return;}
int mid=(l+r)>>;
Down(x);
if(qr<=mid) Reverse(c1,l,mid,ql,qr);
else if(ql>mid) Reverse(c2,mid+,r,ql,qr);
else Reverse(c1,l,mid,ql,mid),Reverse(c2,mid+,r,mid+,qr);
T[x]=Merg(T[c1],T[c2]);
}
inline Node Query(int x,int l,int r,int ql,int qr)
{
if(l==ql&&r==qr) return T[x];
int mid=(l+r)>>;
Down(x);
if(qr<=mid) return Query(c1,l,mid,ql,qr);
else if(ql>mid) return Query(c2,mid+,r,ql,qr);
else
{
Node b1=Query(c1,l,mid,ql,mid),b2=Query(c2,mid+,r,mid+,qr);
return Merg(b1,b2);
}
}
int tot=;
pair<int,int>Ans[];
int main()
{
freopen("easy.in","r",stdin);
freopen("easy.out","w",stdout);
int i,opt,Pos,Val,l,r,k,Sum;
R(n);
for(i=;i<=n;i++) R(a[i]);
R(m);
Build(,,n);
while(m--)
{
R(opt);
if(!opt)
{
R(Pos); R(Val); Change(,,n,Pos,Val);
}
else
{
R(l); R(r); R(k); tot=Sum=;
for(i=;i<=k;i++)
{
Node Res=Query(,,n,l,r);
if(Res.Mx.Zhi<=) break;
Ans[++tot]=Mp(Res.Mx.l,Res.Mx.r);
// printf("%d %d %d\n",Ans[tot].first,Ans[tot].second,Res.Mx.Zhi);
Sum+=Res.Mx.Zhi;
Reverse(,,n,Ans[tot].first,Ans[tot].second);
}
for(i=;i<=tot;i++) Reverse(,,n,Ans[i].first,Ans[i].second);
Wl(Sum);
// return 0;
}
}
return ;
}
/*
input
9
9 -8 9 -1 -1 -1 9 -8 9
3
1 1 9 1
1 1 9 2
1 4 6 3
output
17
25
0 input
15
-4 8 -3 -10 10 4 -7 -7 0 -6 3 8 -10 7 2
15
1 3 9 2
1 6 12 1
0 6 5
0 10 -7
1 4 9 1
1 7 9 1
0 10 -3
1 4 10 2
1 3 13 2
1 4 11 2
0 15 -9
0 13 -9
0 11 -10
1 5 14 2
1 6 12 1
output
14
11
15
0
15
26
18
23
8
*/
7.9T2EASY(easy)的更多相关文章
- leetcode 1.回文数-(easy)
2019.7.11leetcode刷题 难度 easy 题目名称 回文数 题目摘要 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 思路 一些一定不为回文数的 ...
- LeetCode--LinkedList--141.Linked List Cycle(Easy)
141. Linked List Cycle(Easy)2019.7.10 题目地址https://leetcode.com/problems/linked-list-cycle/ Given a l ...
- LeetCode:14. Longest Commen Prefix(Easy)
1. 原题链接 https://leetcode.com/problems/longest-common-prefix/description/ 2. 题目要求 给定一个字符串数组,让你求出该数组中所 ...
- LeetCode:12. Roman to Integer (Easy)
1. 原题链接 https://leetcode.com/problems/roman-to-integer/description/ 2. 题目要求 (1)将罗马数字转换成整数:(2)范围1-399 ...
- 【leetcode】Happy Number(easy)
Write an algorithm to determine if a number is "happy". A happy number is a number defined ...
- 54. Search a 2D Matrix && Climbing Stairs (Easy)
Search a 2D Matrix Write an efficient algorithm that searches for a value in an m x n matrix. This m ...
- 572. Subtree of Another Tree(easy)
Given two non-empty binary trees s and t, check whether tree t has exactly the same structure and no ...
- 刷题向》一道简单的思路题BZOJ1800(EASY+)
这道题其实并不难,主要原因是数据范围很小,当然数据如果大来也可以优化,但重点是在做的时候用的思路很通用, 所以本题是一道思想题(当然思想也不难) 标题里的“+”体现在一些边界处理中. 直接甩题目 De ...
- 值得一做》关于一道暴搜BZOJ1024(EASY+)
为什么要写这道题的DP捏? 原因很简单,因为为原来在openjudge上有一道题叫分蛋糕,有一个思路和这道题很像:“分锅”. 分锅:即为考虑计算当前情况的最优解时,把当前状态结果,分散为考虑当前状态的 ...
随机推荐
- eclipse 创建Java web项目 Cannot change version of project facet Dynamic web module to xxx
问题描述: 用Eclipse创建Java web项目时选择的Artifact Id为maven-artchetype-webapp,由于这个archetype比较老,用的servlet还是2.3的. ...
- [C#]访问共享文件夹或者磁盘(需要用户名密码)
有项目要求使用对方本地管理员访问访问对方D盘,网上找到一段API,刚开始可以使用一段时间,升级到1903就失效了,一脸懵逼啊 using System; using System.Collection ...
- centos7配置rsync+inotify数据实时共享
关于centos7版本上面搭建rsync服务并且实现实时同步之前一直是在6版本上面搭建rsync服务,在7版本上面折腾了半天.此处总结下inotify下载地址:http://github.com/do ...
- 利用宏方便地书写raw string literals
以前一直没用过标准库的regex,今天写一个hlsl的解析工具的时候用了一下,发现用字符串字面值写regular expression的时候非常不方便,特别是每个“\”字符都要被识别为转义,只能写成“ ...
- 不支持javascript的浏览器将JS脚本显示为页面内容
不支持javascript的浏览器将JS脚本显示为页面内容.为了防止这种情况发生,您可以使用这样的HTML注释标记:<html ><体><script type=“tex ...
- mac 下安装mysql
1.安装mysql 使用 brew 进行安装: brew install mysql 2.安装完成: 3.如果开机启动服务 执行:brew services start mysql 否则:mysql. ...
- JavaMaven【一、概述&环境搭建】
课程概述 JavaMaven[一.概述&环境搭建] JavaMaven[二.目录结构&HelloMaven] JavaMaven[三.常用指令] JavaMaven[四.坐标& ...
- IPC之sem.c源码解读
// SPDX-License-Identifier: GPL-2.0 /* * linux/ipc/sem.c * Copyright (C) 1992 Krishna Balasubramania ...
- task_struct原码解读
该结构体在linux中的路径为如下,如果是本地也可以根据以下子目录找到task_struct结构体,该结构体源码中在600多行 https://github.com/torvalds/linux/bl ...
- Beta冲刺版本第三天
该作业所属课程:https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2 作业要求地址:https://edu.cnblogs.com ...