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 ...
随机推荐
- 剑指Offer题解索引
数组 数组中重复的数字 二维数组中的查找 构建乘积数组 字符串 替换空格 字符流中第一个不重复的字符 表示数值的字符串 递归和循环 斐波那契数列 跳台阶 变态跳台阶 矩形覆盖 链表 从尾到头打印链表 ...
- (4)java数据结构--集合类及其数据结构归纳-有大图
Java集合类及其数据结构归纳 - s小小的我 - 博客园http://www.cnblogs.com/shidejia/p/6433788.html ---------大图可以 在新标签中打开图片 ...
- 二叉查找树(Binary Search Tree)
二叉树的一个重要的应用是他们在查找中的使用. 以下是二叉查找树的查找代码 #include <stdio.h> int main() { typedef struct Node{ int ...
- 2017-2018-2 20165221 实验三《敏捷开发与XP实践》实验报告
实验报告封面 姓名:谭笑 学号:20165221 班级:1652班 实验名称: JAVA--敏捷开发与XP实践 指导老师:娄嘉鹏 试验时间:15:35--17:15 实验性质:选修 实验组次:21 实 ...
- python中的多重循环
列表中会经常用到多重循环. if __name__=='__main__': names = ['xiaoming','wangwu','lisi'] ages = ['] for name,age ...
- 用ARX自定义实体
本文介绍了构造自定义实体的步骤.必须继承的函数和必须注意的事项 1.新建一个从AcDbEntity继承的类,如EntTest,必须添加的头文件: "stdarx.h",&quo ...
- boost.log在项目中应用
//头文件#pragma once #include <string> #include <boost/log/trivial.hpp> using std::string; ...
- struts2框架之输入校验(参考第二天学习笔记)
输入校验: 1. 分类 客户端校验:javascript,它是用户体验而已,可以绕开. 服务器端校验 * 代码校验 1). 要求Action必须继承ActionSupport 2). 重写Action ...
- 带jdk15类似的jar配置
针对部分jar文件名带有jdk15结尾的依赖配置时,需要添加<classifier>标签进行区分 比如针对:json-lib-2.4-jdk15.jar的jar依赖配置 <depen ...
- Cassandra索引详解
转自: https://www.cnblogs.com/bonelee/p/6278943.html 1.什么是二级索引? 我们前面已经介绍过Cassandra之中有各种Key,比如Primary K ...