常州day7
Task1
蛤布斯有一个序列,初始为空。它依次将 1-n 插入序列,其中 i 插到当前第 ai 个数的右边 (ai=0 表示插到序列最左边)。它希望你帮 它求出最终序列。
对于 100%的数据,n<=1000000,0<=ai<i。
倒着做,寻找第ai+1个空位插入即可,用线段树维护,注意卡常
O(nlogn)
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<queue>
#include<set>
#include<map>
#include<vector>
#define re register
#define il inline
using namespace std;
const int N=;
int n,a[N],c[N],m=,ans[N],tot=;
char t[];
il int read(){
re int hs=;re char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)){
hs=(hs<<)+(hs<<)+c-'';
c=getchar();
}
return hs;
}
il void print(re int h){
tot=;
while(h>){
t[++tot]=h%+'';
h/=;
}
for(re int i=tot;i>;--i)
putchar(t[i]);
putchar(' ');
}
int main(){
freopen("sequence.in","r",stdin);
freopen("sequence.out","w",stdout);
n=read();
while(m<n+) m<<=;
for(int i=;i<=n;++i) a[i]=read(),c[i+m]=;
for(int i=m-;i>;--i) c[i]=c[i+i]+c[i+i+];
for(re int i=n,j,k;i>=;--i){
k=a[i]+;
for(re int p=;;){
if(c[p+p]>=k){
p<<=;
}
else{
k-=c[p+p];
p<<=;++p;
}
if(p>m){
j=p-m;break;
}
}
ans[j]=i;
for(c[j+=m]=,j>>=;j;j>>=)
c[j]=c[j<<]+c[(j<<)+];
}
for(int i=;i<=n;i++)
print(ans[i]);
return ;
}
Task2
蛤布斯有 n 个物品和一个大小为 m的背包,每个物品有大小和价 值,它希望你帮它求出背包里最多能放下多少价值的物品。
对于 100%的数据,n<=40,0<=m<=10^18,0<=xi,wi<=10^15。
折半枚举,二分查找
O(2^n*n)
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<string>
#include<string.h>
#include<math.h>
#include<algorithm>
#define il inline
#define re register
using namespace std;
typedef long long ll;
const int N=;
int n,s,t,l,r,mid;
ll W,w[],v[],x,y,tot,ans;
struct data{ll p,q;} a[N],b[N];
il bool cmp(re data a,re data b){
return (a.p!=b.p)?(a.p<b.p):(a.q>b.q);
}
int main(){
freopen("pack.in","r",stdin);
freopen("pack.out","w",stdout);
scanf("%d%I64d",&n,&W);
for(int i=;i<=n;i++)
scanf("%I64d%I64d",&w[i],&v[i]);
s=n/;t=n-s;
for(re int S=(<<s)-;S>;--S){
x=y=;
for(re int i=;i<s;++i)
if(S&(<<i)){
x+=w[i+];
y+=v[i+];
}
a[S].p=x;a[S].q=y;
}
sort(a+,a+(<<s),cmp);
for(re int i=;i<(<<s);++i){
if(a[i].p>W) break;
if(a[i].q>b[tot].q) b[++tot]=a[i];
}
b[].p=b[].q=;
for(re int S=(<<t)-;S>;--S){
x=y=;
for(re int i=;i<t;++i)
if(S&(<<i)){
x+=w[i++s];
y+=v[i++s];
}
if(x>W) continue;
l=;r=tot;
while(l<r){
mid=(l+r+)/;
if(b[mid].p<=W-x) l=mid;
else r=mid-;
}
ans=max(ans,y+b[l].q);
}
cout<<ans;
return ;
}
Task3


对于 100%的数据,n<=5000,m<=100000
显然如果一条线段树上的线段如果和一个查询有重叠,那么就会被这个查询访问一次。
容易得到暴力动规方程令f[i][j]表示选取区间[i,j]作为线段树上一节点的答案,g[i][j]为[i,j]与多少个查询重叠
f[i][j]=min(f[i][k]+f[k][j]+g[i][j])
显然这满足四边形不等式优化。
时间复杂度O(n^2)
常州day7的更多相关文章
- [日常训练]常州集训day7
T1 Description 给定一个序列,初始为空.依次将$1-n$插入序列,其中$i$插到当前第$a_i$个数的右边($a_i=0$表示插到序列最左边).求最终序列. Input 第一行一个整数$ ...
- 常州培训 day7 解题报告
最后一天..有些感慨,这七天被虐的感动万分 第一题: 题目大意: 求出 n*i(i=1,2,3....n) mod p的逆元 n<p<=3000000 ,p是质数. 之前写过了,懒得再写 ...
- 【2016常州一中夏令营Day7】
序列(sequence)[题目描述]蛤布斯有一个序列,初始为空.它依次将 1-n 插入序列,其中 i插到当前第 ai 个数的右边 (ai=0 表示插到序列最左边).它希望你帮它求出最终序列.[输入数据 ...
- day7
本节作业: 选课系统 角色:学校.学员.课程.讲师要求:1. 创建北京.上海 2 所学校2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开3. ...
- Python之路,Day7 - Python基础7 面向对象
本节内容: 面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法. 引子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战> ...
- Python Day7
概述 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 静态方法 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法 ...
- Python之路,Day7 - 面向对象编程进阶
本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 经典类vs新式类 把下面代 ...
- 冲刺阶段day7
day7 项目进展 又是一个周三,有轮到我写东西了.首先我们对昨天的成果调试了几遍,改了几个小Bug之后就没有什么问题了,完善了登录界面的代码,学生管理这部分终于被敲定下来,并且正式完工了.然后还生下 ...
- python学习之路-day7
本节内容: 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 面向对象高级语法部分 静态方法 ...
随机推荐
- 【Excel函数】如何在excle区分一列数字是否连续
需求:区分这批卡号,哪些在一个号段 数据源: 89860616090033685544898606160900336855518986061609003368556989860616090033685 ...
- C#之Ref,Out以及TryParse()的用法
ref和out用法很简单,我记下来也提醒自己要用更好的方式去写代码,不要让代码过于臃肿,让人看得头痛.直接写 ref:ref关键字就是让参数进行传递,但是需要初始化,而out不需要初始化参数 ref用 ...
- Java普通编程和Web网络编程准备工作
一.工具下载 链接:https://pan.baidu.com/s/1geOdq3h 密码:pzl5 二.Java普通编程 解压下载的资料,并按readme.txt安装jdk和Eclipse. 三.J ...
- HDU-2844:Coins(多重背包+二进制优化)
链接:HDU-2844:Coins 题意:给你n个种类的钱和对应的数量,同统计一下从1到m能够凑成的钱有多少个. 题解:C[i] = 1 + 2 + 4 + ··· + 2^k + a (0 < ...
- Spring 定时任务Scheduled 开发详细图文
Spring 定时任务Scheduled 开发 文章目录 一.前言 1.1 定时任务 1.2 开发环境 1.3 技术实现 二.创建包含WEB.xml 的Maven 项目 2.1 创建多模块项目task ...
- 这才是球王应有的技艺,他就是C罗
四年一度的世界杯在本周四拉开了帷幕,俄罗斯以5:0碾压沙特阿拉伯,让我们惊呼战斗名族的强大,其后的摩洛哥VS伊朗,摩洛哥前锋布哈杜兹将足球顶入自家球门,这......咳,咳,本来是为了解围,没想到成就 ...
- [转]oracle数据库定时任务dbms_job的用法详解
这篇文章给大家详细介绍了dbms_job的用法,用于安排和管理作业队列,通过使用作业,可以使ORACLE数据库定期执行特定的任务.有需要的朋友们可以参考借鉴. 一.dbms_job涉及到的知识点 ...
- 第5章 首次登录与在线求助man page
首次登录系统 centos默认图像界面为GNOME. Linux默认情况下会提供6个Terminal来让用户登录,切换方式为ctrl+alt+[F1-F6],系统将这六个操作界面命名为tty1-tty ...
- 1104 文法产生这段C程序的推导过程
- 【第二周】【作业五】Scrum 每日站会
1.首先来看一下什么是Scrum: Scrum是一种敏捷软件开发的方法学,用于迭代式增量软件开发过程.Scrum在英语是橄榄球运动中争球的意思. 虽然Scrum是为管理软件开发项目而开发的,它同样可以 ...