清北考前刷题day6下午好

/*
贪心 负数一定不取
枚举最高位是1 且答案取为0的 位置, 更新答案。
*/
#include<iostream>
#include<cstdio>
#include<cstring> #define ll long long
#define N 100010 using namespace std;
int n;
ll a[N],ans,sum[N];
char s[N]; ll read()
{
ll x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} int main()
{
freopen("maximum.in","r",stdin);
freopen("maximum.out","w",stdout);
scanf("%d",&n);
for(int i=; i<=n; i++)
{
a[i]=read();
sum[i]=sum[i-];
if(a[i]>)sum[i]=sum[i-]+a[i];
}
scanf("%s",s+);
ll c=;
for(int i=n; i>=; i--)
if(s[i]=='')
{
ans=max(ans,c+sum[i-]);
c+=max(a[i],0LL);
}
ans=max(ans,c);
printf("%I64d\n",ans);
return ;
}

/*
15暴力
*/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm> #define N 1010 using namespace std;
int n,k;
int l,r,mid;
int num[N],tmp[N];
int ans; int minn(int a,int b,int i)
{
if(a<b) return tmp[i-];
else return tmp[i-]+mid;
} bool check()
{
int sum=;
for(int i=; i<=n; i++) tmp[i]=num[i];
for(int i=; i<=n; i++)
if(abs(tmp[i]-tmp[i-])>mid)
{
if(tmp[i+]>tmp[i]) tmp[i]=max(tmp[i],tmp[i-]+mid);
else tmp[i]=minn(abs(tmp[i-]-tmp[i+]),tmp[i-]+mid-tmp[i+],i);
sum++;
}
if(sum>k) return false;
else return true;
} int main()
{
scanf("%d%d",&n,&k);
for(int i=; i<=n; i++) scanf("%d",&num[i]);
l=;
r=;
while(l<=r)
{
mid=(l+r)/;
if(check()) ans=mid,r=mid-;
else l=mid+;
}
printf("%d",ans);
}

不会分块
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <ctime>
using namespace std;
const int maxn = ;
const int len = ;
int n, A, B,m;
int a[maxn],b[maxn],l[maxn],r[maxn],lb[maxn],tot;
int answer[][];
int rt[][maxn], lt[][maxn],d[maxn];
//int root[maxn*len], ll[maxn*len], rr[maxn*len],data[maxn*len];
int find(int x)
{
for (int l = , r = m; l < r;)
{
int mid = (l + r) / ;
if (b[mid] == x) return mid;
if (b[mid]>x) r = mid;
else l = mid + ;
}
return -;
}
/*int build(int l, int r)
{
if (l == r)
{
tot++;
ll[tot] = rr[tot] = 0;
data[tot] = d[l];
return tot;
}
tot++;
int tmp = tot;
ll[tmp] = build(l, (l + r) / 2);
rr[tmp] = build((l + r) / 2 + 1, r);
data[tmp] = min(data[ll[tmp]], data[rr[tmp]]);
return tmp;
}
int change(int i, int l, int r,int x)
{
if (l == x && r == x)
{
tot++;
ll[tot] = rr[tot] = 0;
data[tot] = n + 1;
return tot;
}
tot++;
int tmp = tot;
ll[tot] = ll[i];
rr[tot] = rr[i];
if (l <= x && x <= (l + r) / 2) ll[tmp] = change(ll[i], l, (l + r) / 2, x);
else rr[tmp] = change(rr[i], (l + r) / 2 + 1, r, x);
data[tmp] = min(data[ll[tmp]], data[rr[tmp]]);
return tmp;
}
int check(int i, int l, int r, int x, int &ans)
{
if (l > x) return 0;
if (1 <= l && r <= x)
{
ans = min(ans, data[i]); return 0;
}
check(ll[i], l, (l + r) / 2, x, ans);
check(rr[i], (l + r) / 2 + 1, r, x, ans);
return 0;
}*/
int main()
{
double ti = clock();
freopen("sequence.in", "r", stdin);
freopen("sequence.out", "w", stdout);
scanf("%d%d%d", &n, &A, &B);
a[] = ;
for (int i = ; i <= n; i++)
{
char c;
for (scanf(" %c", &c); c != 'A' && c != 'B'; scanf(" %c", &c));
if (c == 'A') a[i] = a[i - ] + B;
else a[i] = a[i - ] - A;
}
for (int i = ; i <= n; i++) b[i] = a[i];
sort(b, b + n + );
m = unique(b, b + n + ) - b;
for (int i = ; i <= n; i++)
{
a[i] = find(a[i]);
if (a[i] == -)
{
printf("???\n");
return ;
}
}
n++;
int k = n / len;
for (int i = ; i <= k; i++)
{
int ans = ;
tot++;
for (int j = i*len; j < n; j++)
{
if (j%len == )
{
answer[i][j / len] = ans;
}
if (lb[a[j]] != tot)
{
lb[a[j]] = tot;
l[a[j]] = j;
}
ans = max(ans, j - l[a[j]]);
}
}
for (int i = ; i < n; i++) r[i] = -;
for (int i = ; i < n; i++)
{
r[a[i]] = i;
if (i%len == len - )
{
int tmp = i / len;
for (int j = ; j < n; j++)
rt[tmp][j] = r[j];
}
}
for (int i = ; i < n; i++) l[i] = -;
for (int i = n - ; i >= ; i--)
{
l[a[i]] = i;
if (i%len == )
{
int tmp = i / len;
for (int j = ; j < n; j++)
lt[tmp][j] = l[j];
}
}
int q;
scanf("%d", &q);
int ans = ;
for (; q; q--)
{
int L, R;
scanf("%d%d", &L, &R);
L--;
int kl = L / len, kr = R / len;
ans = ;
if (kl == kr)
{
tot++;
for (int i = L; i <= R; i++)
{
if (lb[a[i]] != tot)
{
lb[a[i]] = tot;
l[a[i]] = i;
}
ans = max(ans, i - l[a[i]]);
}
}
else
{
ans = answer[kl + ][kr];
tot++;
int tmp = min(n, (kl + )*len);
for (int i = L; i < tmp; i++)
{
if (lb[a[i]] != tot)
{
lb[a[i]] = tot;
l[a[i]] = i;
ans = max(ans, rt[kr - ][a[i]] - i);
}
}
tmp = min(R + , n);
for (int i = kr*len; i < tmp; i++)
{
if (lb[a[i]] != tot)
{
if (lt[kl + ][a[i]] != -) ans = max(ans, i - lt[kl + ][a[i]]);
}
else ans = max(ans, i - l[a[i]]);
}
}
printf("%d\n", ans);
}
/*int q;
for (scanf("%d", &q); q; q--)
{
// if (q % 5000 == 0) cerr << q << endl;
int L, R;
tot++;
scanf("%d%d", &L, &R);
int ans = 0;
for (int i = L - 1; i <= R; i++)
{
if (lb[a[i]] != tot)
{
lb[a[i]] = tot;
l[a[i]] = i;
}
ans = max(ans, i - l[a[i]]);
}
printf("%d\n", ans);
}*/
/*for (int i = 0; i <= n; i++)
{
if (lb[a[i]] == 0)
{
lb[a[i]] = 1;
l[a[i]] = i;
d[i] = n + 1;
}
else
{
r[l[a[i]]] = i;
d[i] = i - l[a[i]];
l[a[i]] = i;
}
}
root[0] = build(1, n);
for (int i = 1; i <= n; i++)
{
if (r[i-1] != 0) root[i] = change(root[i - 1], 1, n, r[i-1]);
else root[i] = root[i - 1];
}
int q;
for (scanf("%d", &q); q; q--)
{
int L, R;
scanf("%d%d", &L, &R);
L--;
int ans = n + 1;
check(root[L], 1, n, R, ans);
if (ans == n + 1) printf("-1\n"); else printf("%d\n", ans);
}*/
/* int q;
int tans = 0;
for (scanf("%d", &q); q; q--)
{
int L, R;
scanf("%d%d", &L, &R);
L--;
tot++;
int ans = n + 1;
for (int i = L; i <= R; i++)
{
if (lb[a[i]] != tot)
{
lb[a[i]] = tot;
l[a[i]] = i;
}
else
{
ans = min(ans, i - l[a[i]]);
l[a[i]] = i;
}
}
if (ans == n + 1) printf("-1\n"); else {
printf("%d\n", ans);
tans = max(tans, ans);
}
}
cerr << clock()-ti << " "<<tans<<" "<<A<<" "<<B<<endl;*/
return ;
}
std
清北考前刷题day6下午好的更多相关文章
- 清北考前刷题day1下午好
水题(water) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK出了道水题. 这个水题是这样的:有两副牌,每副牌都有n张. 对于第一副牌的每张牌长和宽 ...
- 清北考前刷题da7下午好
三向城 /* 原图一定是一棵完全二叉树. 根节点是x,左节点是x*2,右节点是x*2+1 转化为二进制往左右走就很明显了. */ #include<iostream> #include&l ...
- 清北考前刷题day3下午好
/* 可以并查集维护 可以发现,某个联通快出现大于等于2个环,一定无法分配. 有解要么一个环,要么没有环. 一个环时答案等于点数乘2(顺时针或逆时针). 没有环是树,对于一个n个点的树,方案一定有n种 ...
- 清北考前刷题da5下午好
/* (4,1)*(3,1)*(2,1)的话1变成2然后一直是2 2变成1然后变成3 3变成1然后变成4 4变成1 */ #include<iostream> #include<cs ...
- 清北考前刷题day4下午好
/* 辗转相除,每次计算多出现了几个数. */ #include<iostream> #include<cstdio> #include<cstring> #inc ...
- 清北考前刷题day2下午好
#include<iostream> #include<cstdio> #include<cstring> #include<stack> #defin ...
- 清北考前刷题day6早安
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #d ...
- 清北考前刷题day4早安
LI /* 没有考虑次大值有大于一个的情况 */ #include<iostream> #include<cstdio> #include<cstring> # ...
- 清北考前刷题day7早安
随机推荐
- IDEA-基本设置
目录: 1.设置内存 2.设置编码格式 3.设置换行符 4.设置新建Class文档说明 5.添加自定义注释 6.设置自己的maven 工欲善其事,必先利其器,设置好基础的设置才能事半功倍!少踩坑!以下 ...
- C51 keil 注意事项
下载程序需要生成hex文件 仿真 蜂鸣器 音调:频率 音量:高低电平占空比 有源:上面没有加号,只需高低电平即可发声 无源:上面有加号,不仅要电平,还要, 的频率
- 关于Web服务接口测试的一些问题及答案
本篇主要是像想要了解并且学习接口测试的朋友,做一个入门的简单介绍 1.什么是接口 答:接口就是内部模块对模块,外部系统对其他服务提供的一种可调用或者连接的能力的标准,就好比usb接口,他是系统向外接提 ...
- Python模块:Re模块、附软件开发目录规范
Re模块:(正则表达式) 正则表达式就是字符串的匹配规则 正则表达式在多数编程语言里都有相应的支持,Python里面对应的模块时re 常用的表达式规则:(都需要记住) “ . ” # 默认匹配除 ...
- spring boot 学习-创建方式
spring boot是什么 spring boot 是一个快速开发框架,适合小白快速上手开发,它集成了很多优秀的和常用的第三方框架,它简化了xml配置,完全采用注解方式,内部集成了Tomcat.Je ...
- 【.Net 学习系列】-- Windows服务定时运行,判断当前时间是否在配置时间段内
/// <summary> /// 判断程序是否在设置运行时间内 /// </summary> /// <param name="startTime" ...
- dubbo安装和使用
转载:http://blog.csdn.net/zjcjava/article/details/78766095 背景 Dubbo的开源人梁飞在内部的交流会上宣布重启dubbo的维护和更新,具体PPT ...
- how to get geometry type of layer using IMapServer3 and IMapLayerInfo? (C#)
http://forums.arcgis.com/threads/11481-how-to-get-geometry-type-of-layer-using-IMapServer3-and-IMapL ...
- struts2学习笔记(二)—— 获取登录信息及计算在线人数
实现目的: 1.点击"Login"的超链接.进入登录页面 2.填写登录信息.提交表单,将用户信息保存进Session 3.显示用户名,并计算在线 ...
- react 项目实战(八)图书管理与自动完成
图书管理 src / pages / BookAdd.js // 图书添加页 /** * 图书添加页面 */ import React from 'react'; // 布局组件 import H ...
