cf自训6
cf946D 背包+区间dp 好题
/*
先预处理出每行消去i个1后可以的到的最小时间:
先求每行的前缀和,枚举左端点和右端点,消去的1 cost=tot-sum[r]+sum[l-1],区间长度=r-l+1
time[cost]=min(time[cost],len)
然后再进行行间处理:
就是n行删k个,转化为n组物品,然后总代价是k
分组背包做一下完事
dp[i][j]表示到第i行删了j个的最少上课时间
*/
#include<bits/stdc++.h>
using namespace std;
#define maxn 505
int n,m,K,mp[maxn][maxn];
int t[maxn][maxn],sum[maxn][maxn],dp[maxn][maxn]; void init(){
memset(t,0x3f,sizeof t);
for(int i=;i<=n;i++){
t[i][sum[i][m]]=;//全删完的情况
for(int l=;l<=m;l++)
for(int r=l;r<=m;r++){
int len=r-l+;
int cost=sum[i][m]-(sum[i][r]-sum[i][l-]);
t[i][cost]=min(t[i][cost],r-l+);
}
}
/*for(int i=1;i<=n;i++){
for(int j=0;j<=sum[i][m];j++)
cout<<t[i][j]<<" ";
puts("");
}*/
}
int main(){
cin>>n>>m>>K;
char ch;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++){
cin>>ch;
mp[i][j]=ch-'';
sum[i][j]=sum[i][j-]+mp[i][j];
}
init(); memset(dp,0x3f,sizeof dp);
for(int j=;j<=K;j++)dp[][j]=t[][j];
for(int i=;i<=n;i++)
for(int j=;j<=K;j++)
for(int c=;c<=j;c++)
dp[i][j]=min(dp[i][j],dp[i-][j-c]+t[i][c]); int ans=0x3f3f3f3f;
for(int j=;j<=K;j++)
ans=min(ans,dp[n][j]);
cout<<ans<<endl;
}
cf893d 线段树区间更新,可以傻逼贪心做
/*
在每个0之前都要变成非负,这个非负数要尽量大。。
先求前缀和数组,从左往右扫,找到第一个在0前的负值点,将其提高到允许的最大值x,然后后面统一+x
线段树维护区间最大前缀和,然后从左往右扫,扫到ai=0时进行询问
如果该点前缀和小于0那么将其提高,提高的上限lim=d-后面区间最大前缀和,如果lim+当前值<0,那么不可行
反之不进行操作
对前缀和先判一下。。
*/
#include<bits/stdc++.h>
using namespace std;
#define maxn 100005
#define ll long long
ll ans,n,d,a[maxn],sum[maxn],flag; #define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
ll Max[maxn<<],lazy[maxn<<];
void pushup(int rt){Max[rt]=max(Max[rt<<],Max[rt<<|]);}
void pushdown(int rt){
if(lazy[rt]){
lazy[rt<<]+=lazy[rt];lazy[rt<<|]+=lazy[rt];
Max[rt<<]+=lazy[rt];Max[rt<<|]+=lazy[rt];
lazy[rt]=;
}
}
void build(int l,int r,int rt){
if(l==r){Max[rt]=sum[l];return;}
int m=l+r>>;
build(lson);build(rson);
pushup(rt);
}
void update(int L,int R,ll val,int l,int r,int rt){
if(L<=l &&R>=r){lazy[rt]+=val;Max[rt]+=val;return;}
int m=l+r>>;
pushdown(rt);
if(L<=m)update(L,R,val,lson);
if(R>m)update(L,R,val,rson);
pushup(rt);
}
ll query(int L,int R,int l,int r,int rt){
if(L<=l && R>=r)return Max[rt];
pushdown(rt);
int m=l+r>>;ll res=-0x3f3f3f3f;
if(L<=m)res=query(L,R,lson);
if(R>m)res=max(res,query(L,R,rson));
return res;
}
int main(){
cin>>n>>d;
for(int i=;i<=n;i++)cin>>a[i];
for(int i=;i<=n;i++){sum[i]=sum[i-]+a[i];if(sum[i]>d)flag=;}
if(flag){
puts("-1");
return ;
}
build(,n,);
for(int i=;i<=n;i++){
if(a[i]==){
int tmp=query(i,i,,n,);
if(tmp>=)continue;
else{
int Max=query(i,n,,n,);
int lim=d-Max;
if(tmp+lim< || flag){
puts("-1");
return ;
}
else {
update(i,n,lim,,n,);
ans++;
}
}
}
}
cout<<ans<<endl;
}
cf797E 复杂度均摊成根号n级别,新题
#include<bits/stdc++.h>
using namespace std;
#define maxn 120005
int q,n,a[maxn];
int dp[maxn][];//dp[i][j]表示在位置i(p=i),k=j时的跳跃步数,dp[i][j]=dp[i+a[i]+j][j]+1
void init(){
for(int j=;j<=;j++)
for(int i=n;i>=;i--){
if(i+a[i]+j>n)dp[i][j]=;
else dp[i][j]=dp[i+a[i]+j][j]+;
}
}
int main(){
cin>>n;
for(int i=;i<=n;i++)cin>>a[i];
init(); cin>>q;
while(q--){
int ans=,p,k;
cin>>p>>k;
if(k<=){
cout<<dp[p][k]<<'\n';
continue;
}
while(p<=n){
p+=a[p]+k;
ans++;
}
cout<<ans<<'\n';
}
}
cf46D 线段树区间合并沙比提。。一个vector下标搞错弄了好久
#include<bits/stdc++.h>
using namespace std;
#define maxn 120005
int q,n,a[maxn];
int dp[maxn][];//dp[i][j]表示在位置i(p=i),k=j时的跳跃步数,dp[i][j]=dp[i+a[i]+j][j]+1
void init(){
for(int j=;j<=;j++)
for(int i=n;i>=;i--){
if(i+a[i]+j>n)dp[i][j]=;
else dp[i][j]=dp[i+a[i]+j][j]+;
}
}
int main(){
cin>>n;
for(int i=;i<=n;i++)cin>>a[i];
init(); cin>>q;
while(q--){
int ans=,p,k;
cin>>p>>k;
if(k<=){
cout<<dp[p][k]<<'\n';
continue;
}
while(p<=n){
p+=a[p]+k;
ans++;
}
cout<<ans<<'\n';
}
}
cf自训6的更多相关文章
- cf自训4.10
cf933A dp题 一开始看错是连续子序列了,然后样例刚好能过.. 然后正解没想出来,网上看了题解:感觉正解是枚举2开始的位置,然后再枚举翻转的区间,pos左右两侧分别求出贡献最大的那个区间,左右两 ...
- 【春训团队赛第四场】补题 | MST上倍增 | LCA | DAG上最长路 | 思维 | 素数筛 | 找规律 | 计几 | 背包 | 并查集
春训团队赛第四场 ID A B C D E F G H I J K L M AC O O O O O O O O O 补题 ? ? O O 传送门 题目链接(CF Gym102021) 题解链接(pd ...
- ATC/TC/CF
10.25 去打 CF,然后被 CF 打了. CF EDU 75 A. Broken Keyboard 精神恍惚,WA 了一发. B. Binary Palindromes 比赛中的憨憨做法,考虑一个 ...
- Java企业实训 - 01 - Java前奏
前言: 虽然个人专攻.NET方向,不过由于个人是干教育行业的,方方面面的东西,不能说都必须精通,但肯定多少都会涉及到. 一个菜鸟学员,从啥都不会,经过一步步学习,最后到企业上手掌管一个模块甚至一个项目 ...
- ORA-00494: enqueue [CF] held for too long (more than 900 seconds) by 'inst 1, osid 5166'
凌晨收到同事电话,反馈应用程序访问Oracle数据库时报错,当时现场现象确认: 1. 应用程序访问不了数据库,使用SQL Developer测试发现访问不了数据库.报ORA-12570 TNS:pac ...
- cf之路,1,Codeforces Round #345 (Div. 2)
cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅..... ...
- cf Round 613
A.Peter and Snow Blower(计算几何) 给定一个点和一个多边形,求出这个多边形绕这个点旋转一圈后形成的面积.保证这个点不在多边形内. 画个图能明白 这个图形是一个圆环,那么就是这个 ...
- ARC下OC对象和CF对象之间的桥接(bridge)
在开发iOS应用程序时我们有时会用到Core Foundation对象简称CF,例如Core Graphics.Core Text,并且我们可能需要将CF对象和OC对象进行互相转化,我们知道,ARC环 ...
- [Recommendation System] 推荐系统之协同过滤(CF)算法详解和实现
1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...
随机推荐
- 【tmos】字段create_time如何动态的生成
1.数据库create_time字段默认值设置为CURRENT_TIMESTAMP,实体类中不映射createTime字段,在用jpa的save()方法时,会自动生成,如果你传了null值到数据库,是 ...
- Django学习手册 - admin后台 切换成中文显示/添加数据表
Django admin后台管理 切换成中文界面: 站点显示为中文: 在setting 里面修改 LANGUAGE_CORE = 'zh-Hans' 字段名显示中文 class Test(models ...
- 手写代码注意点--java.util.Stack相关
1-Stack的基本函数为: 注意: 取栈顶的函数为peek(),不是top()... 测试stack是否为空的函数为empty(),不是isEmpty()...
- Thymeleaf模板布局
⒈定义片段 1.使用th:fragment <div th:fragment="copy"> © 2019 <a href="http://www.co ...
- VC常用小知识
(1) 如何通过代码获得应用程序主窗口的 指针?主窗口的 指针保存在CWinThread::m_pMainWnd中,调用AfxGetMainWnd实现.AfxGetMainWnd() ->Sho ...
- vc++基础班[28]---动态数组及动态链表的讲解
C++中也有相应的动态数组.动态链表.映射表的模板类,就是STL中的:vector.list.map 他们属于C++标准中的一部分,对于程序的移植性来说也是不错的,但是在MFC编程中使用 CArray ...
- IOT相关协议
MQTT协议的入门 入门教程; 发布/订阅(Pub/Sub)模式,方便消息在传感器之间传递; 这意味着发布者和订阅者之间并不需要直接建立联系; 消息类型 MQTT拥有14种不同的消息类型: CONNE ...
- Alpha 冲刺 (4/10)
目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:冲刺4 团队部分 后敬甲 过去两天完成了哪些任务 文字描述 主页部分图标的替换 -拍照按钮的设计和测试 GitHub代码 ...
- 用KendoGrid控件 快速做CRUD
先看效果: 主要引用的文件: <link href="/css/kendo/2014.1.318/kendo.common.min.css" rel="styles ...
- Swap交换分区概念
什么是Linux swap space呢?我们先来看看下面两段关于Linux swap space的英文介绍资料: Linux divides its physical RAM (random acc ...