题目链接:

E1:http://codeforces.com/contest/1108/problem/E1

E2:http://codeforces.com/contest/1108/problem/E2

题目大意:

给你n个数,然后给你m个区间,每一个区间代表将给定的n个数这个区间内都减去1,每个区间最多使用一次。然后问你使用哪些区间能够使得这n个数中最大数和最小的差值最大?

首先对于E1:这么小的数据不暴力搞啥??直接问枚举就完事了,每一次枚举的时候保持一个数不变,假设当前的数是最大的,然后其他的只要是不包含这个数的区间,都减去,这样就能让最小的那个位置尽可能的小了。

AC代码:

 #include<bits/stdc++.h>
using namespace std;
# define ll long long
# define inf 0x3f3f3f3f
const int maxn = +;
int a[maxn],b[maxn],sto[maxn];
struct node
{
int le;
int ri;
} q[maxn];
int main()
{
int n,m;
scanf("%d %d",&n,&m);
for(int i=; i<=n; i++)
{
scanf("%d",&a[i]);
}
for(int i=; i<=m; i++)
{
scanf("%d %d",&q[i].le,&q[i].ri);
}
int maxx=-inf,id=;
for(int i=; i<=n; i++)
{
int t1=-inf,t2=inf;
for(int j=; j<=n; j++)
{
b[j]=a[j];
}
for(int j=; j<=m; j++)
{
if(i>=q[j].le&&i<=q[j].ri)
continue;
for(int k=q[j].le; k<=q[j].ri; k++)
{
b[k]-=;
}
}
for(int j=; j<=n; j++)
{
t1=max(t1,b[j]);
t2=min(t2,b[j]);
}
if(t1-t2>maxx)
{
maxx=t1-t2;
id=i;
}
}
// cout<<m<<endl;
printf("%d\n",maxx);
int num=;
// cout<<1<<" "<<num<<endl;
for(int i=; i<=m; i++)
{
if(id>=q[i].le&&id<=q[i].ri)
continue;
// cout<<1<<endl;
sto[++num]=i;
}
// cout<<2<<" "<<num<<endl;
printf("%d\n",num);
for(int i=; i<=num; i++)
{
if(i==)
printf("%d",sto[i]);
else
printf(" %d",sto[i]);
}
printf("\n");
return ;
}

其次对于E2:我们可以寻找最小的数的位置,这个时候为什么不和E1一样去找最大的数的位置呢?因为我们要利用区间的性质,对于每一个节点,我们需要从第一个位置开始。

对于当枚举到第i个节点的时候,需要把包括i的区间都给整上,这个时候求一下最值之差,当枚举到第i+1个节点的时候,我们只需要把不包括第i个节点但是包括第i+1个节点的区间给整上就可以了,这样就能省去很多不必要的操作了。

AC代码:

 #include<bits/stdc++.h>
using namespace std;
# define ll long long
# define inf 0x3f3f3f3f
# define lson l,m,rt<<
# define rson m+,r,rt<<|
const int maxn = 1e5+;
int minn[maxn<<],maxx[maxn<<],dif[maxn<<];
int lazy[maxn<<];
struct node
{
int le;
int ri;
} edge[+];
int sto[maxn];
int ans1,ans2;
vector<int>q1[maxn],q2[maxn];
void up(int rt)
{
minn[rt]=min(minn[rt<<],minn[rt<<|]);
maxx[rt]=max(maxx[rt<<],maxx[rt<<|]);
dif[rt]=maxx[rt]-minn[rt];// 本来查找最值得差的时候是直接询问到底部的,加了这个就不需要了,学到了!!
}
void build(int l,int r,int rt)
{
if(l==r)
{
int tmp;
scanf("%d",&tmp);
minn[rt]=tmp;
maxx[rt]=tmp;
return ;
}
int m=(l+r)>>;
build(lson);
build(rson);
up(rt);
}
void down(int rt)
{
if(lazy[rt])
{
lazy[rt<<]+=lazy[rt];
lazy[rt<<|]+=lazy[rt];
minn[rt<<]+=lazy[rt];
minn[rt<<|]+=lazy[rt];
maxx[rt<<]+=lazy[rt];
maxx[rt<<|]+=lazy[rt];
lazy[rt]=;
}
}
void update(int l,int r,int rt,int L,int R,int p)
{
if(L<=l&&R>=r)
{
minn[rt]+=p;
maxx[rt]+=p;
lazy[rt]+=p;
return ;
}
down(rt);
int m=(l+r)>>;
if(L<=m)
update(lson,L,R,p);
if(R>m)
update(rson,L,R,p);
up(rt);
}
//int querymax(int l,int r,int rt)
//{
// if(l==r)
// {
// return maxx[rt];
// }
// int t1;
// down(rt);
// int m=(l+r)>>1;
// if(l<=m)querymax(lson);
// if(r>m)querymax(rson);
// up(rt);
//}
//void querymin(int l,int r,int rt)
//{
// if(l==r)
// {
// ans2=min(ans2,minn[rt]);
// return ;
// }
// down(rt);
// int m=(l+r)>>1;
// querymin(lson);
// querymin(rson);
// up(rt);
//}
int main()
{
int n,m,tmp,len;
scanf("%d %d",&n,&m);
build(,n,);
int ans=-inf,id=;
for(int i=; i<=m; i++)
{
scanf("%d %d",&edge[i].le,&edge[i].ri);
q1[edge[i].le].push_back(i);
q2[edge[i].ri].push_back(i);
}
for(int i=; i<=n; i++)
{
len=q2[i-].size();
for(int j=; j<len; j++)
{
tmp=q2[i-][j];
update(,n,,edge[tmp].le,edge[tmp].ri,);
}
len=q1[i].size();
for(int j=; j<len; j++)
{
tmp=q1[i][j];
update(,n,,edge[tmp].le,edge[tmp].ri,-);
}
if(ans<dif[])
{
ans=dif[];
id=i;
}
}
int num=;
printf("%d\n",ans);
for(int i=; i<=m; i++)
{
if(edge[i].le<=id&&edge[i].ri>=id)
{
sto[++num]=i;
}
}
printf("%d\n",num);
for(int i=; i<=num; i++)
{
if(i==)
printf("%d",sto[i]);
else
printf(" %d",sto[i]);
}
printf("\n");
return ;
}

E1. Array and Segments (Easy version)(暴力) && E2. Array and Segments (Hard version)(线段树维护)的更多相关文章

  1. Light oj-1100 - Again Array Queries,又是这个题,上次那个题用的线段树,这题差点就陷坑里了,简单的抽屉原理加暴力就可以了,真是坑~~

                                                                              1100 - Again Array Queries ...

  2. HDU - 4366 Successor DFS序 + 分块暴力 or 线段树维护

    给定一颗树,每个节点都有忠诚和能力两个参数,随意指定一个节点,要求在它的子树中找一个节点代替它,这个节点要满足能力值大于它,而且是忠诚度最高的那个. 首先,dfs一下,处理出L[i], R[i]表示d ...

  3. CF719E. Sasha and Array [线段树维护矩阵]

    CF719E. Sasha and Array 题意: 对长度为 n 的数列进行 m 次操作, 操作为: a[l..r] 每一项都加一个常数 C, 其中 0 ≤ C ≤ 10^9 求 F[a[l]]+ ...

  4. Codeforces Round #373 (Div. 2) E. Sasha and Array 线段树维护矩阵

    E. Sasha and Array 题目连接: http://codeforces.com/contest/719/problem/E Description Sasha has an array ...

  5. 线段树维护矩阵【CF718C】 Sasha and Array

    Description 有一个长为\(n\)的数列\(a_{1},a_{2}...a_{n}\),你需要对这个数列维护如下两种操作: \(1\space l \space r\space x\) 表示 ...

  6. CF718C Sasha and Array(线段树维护矩阵)

    题解 (不会矩阵加速的先去学矩阵加速) 反正我想不到线段树维护矩阵.我太菜了. 我们在线段树上维护一个区间的斐波那契的列矩阵的和. 然后询问时提取每个符合题意列矩阵的答案项(不是列矩阵存了两项吗,一个 ...

  7. Codeforces 671C - Ultimate Weirdness of an Array(线段树维护+找性质)

    Codeforces 题目传送门 & 洛谷题目传送门 *2800 的 DS,不过还是被我自己想出来了 u1s1 这个 D1C 比某些 D1D 不知道难到什么地方去了 首先碰到这类问题我们肯定考 ...

  8. 2019年CCPC网络赛 HDU 6703 array【权值线段树】

    题目大意:给出一个n个元素的数组A,A中所有元素都是不重复的[1,n].有两种操作:1.将pos位置的元素+1e72.查询不属于[1,r]中的最小的>=k的值.强制在线. 题解因为数组中的值唯一 ...

  9. 【Codeforces718C】Sasha and Array 线段树 + 矩阵乘法

    C. Sasha and Array time limit per test:5 seconds memory limit per test:256 megabytes input:standard ...

随机推荐

  1. 11.10 Daily Scrum

    工作进度有点拖后,之后几天要加快步伐了.   Today's tasks  Next week 丁辛 餐厅列表UI设计 餐厅列表事件处理             李承晗             实现指 ...

  2. Daily Scrum NO.7

    工作概况 今日由于时间比较充裕,没有编译作业的干扰,团员们的进度喜人.线程池.动态爬取.异常清理这三个主要开发工作已经步入尾声.其中线程池开发工作的代码已经签入,现主要在测试和优化.动态爬取今日也签入 ...

  3. Linux内核分析-构造一个简单的Linux系统MenuOS

    构造一个简单的Linux系统MenuOS linux内核目录结构 arch目录包括了所有和体系结构相关的核心代码.它下面的每一个子目录都代表一种Linux支持的体系结构,例如i386就是Intel C ...

  4. scrapy 爬虫怎么写入日志和保存信息

    写入日志: 首先我的爬虫 name= article scrapy crawl article -s LOG_FILE=wiki.log 输出为不同格式: scrapy crawl article - ...

  5. Daily Scrum - 11/25

    今天是Sprint 2的最后一天,我们在下午的课上对之前两个Sprint作了比较详尽的Review,并在课后Daily Scrum上讨论制订了Sprint 3的任务安排.具体Task会在明天更新在TF ...

  6. Daily Scrum 10.21

    然后由于服务器端有变化,另外具体IDE已经确定,接下来对已经分配下去的任务做些细节补充: 10.20日晚所有人必须完成AS的配置,统一版本为1.3.2,安卓版本为4.4.0,可视化界面手机为Nexus ...

  7. 在eclipse中编译调试ns3

    1首先把ns3项目导入eclipse 然后把上面的的ns3按照上面的提示即可导入成功.   然后可以运行一下 ./waf configure     2 配置C/C++ Build 右键工程,选择属性 ...

  8. HTTP协议(1)

    HTTP 协议笔记 1. HTTP 传输机制 HTTP 是一个应用层协议,位于 TCP 的层次之上,并且是基于 TCP 协议进行通信的,也就是说 HTTP 在每一次通信之前都要先建立 TCP 连接来保 ...

  9. HDU 2020 绝对值排序

    http://acm.hdu.edu.cn/showproblem.php?pid=2020 Problem Description 输入n(n<=100)个整数,按照绝对值从大到小排序后输出. ...

  10. Django_基于模块的单例模式

    基于模块的单例模式  原理: Python 的独有特性 : 模块的导入只能生效一次. 再重复导入只要基于一套环境都是使用的 最初 的那份资源.  示例: 文档结构: # mysingleton.py ...