常州day7

Task1

蛤布斯有一个序列,初始为空。它依次将 1-n 插入序列,其中 i 插到当前第 ai 个数的右边 (ai=0 表示插到序列最左边)。它希望你帮 它求出最终序列。

对于 100%的数据,n<=1000000,0<=ai<i。

倒着做,寻找第ai+1个空位插入即可,用线段树维护,注意卡常

O(nlogn)

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<stdlib.h>
 4 #include<string>
 5 #include<string.h>
 6 #include<algorithm>
 7 #include<math.h>
 8 #include<queue>
 9 #include<set>
10 #include<map>
11 #include<vector>
12 #define re register
13 #define il inline
14 using namespace std;
15 const int N=3000001;
16 int n,a[N],c[N],m=1,ans[N],tot=0;
17 char t[31];
18 il int read(){
19     re int hs=0;re char c=getchar();
20     while(!isdigit(c)) c=getchar();
21     while(isdigit(c)){
22         hs=(hs<<3)+(hs<<1)+c-‘0‘;
23         c=getchar();
24     }
25     return hs;
26 }
27 il void print(re int h){
28     tot=0;
29     while(h>0){
30         t[++tot]=h%10+‘0‘;
31         h/=10;
32     }
33     for(re int i=tot;i>0;--i)
34         putchar(t[i]);
35     putchar(‘ ‘);
36 }
37 int main(){
38     freopen("sequence.in","r",stdin);
39     freopen("sequence.out","w",stdout);
40     n=read();
41     while(m<n+2) m<<=1;
42     for(int i=1;i<=n;++i) a[i]=read(),c[i+m]=1;
43     for(int i=m-1;i>0;--i) c[i]=c[i+i]+c[i+i+1];
44     for(re int i=n,j,k;i>=1;--i){
45         k=a[i]+1;
46         for(re int p=1;;){
47             if(c[p+p]>=k){
48                 p<<=1;
49             }
50             else{
51                 k-=c[p+p];
52                 p<<=1;++p;
53             }
54             if(p>m){
55                 j=p-m;break;
56             }
57         }
58         ans[j]=i;
59         for(c[j+=m]=0,j>>=1;j;j>>=1)
60             c[j]=c[j<<1]+c[(j<<1)+1];
61     }
62     for(int i=1;i<=n;i++)
63         print(ans[i]);
64     return 0;
65 }

Task2

蛤布斯有 n 个物品和一个大小为 m的背包,每个物品有大小和价 值,它希望你帮它求出背包里最多能放下多少价值的物品。

对于 100%的数据,n<=40,0<=m<=10^18,0<=xi,wi<=10^15。

折半枚举,二分查找

O(2^n*n)

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<stdlib.h>
 4 #include<string>
 5 #include<string.h>
 6 #include<math.h>
 7 #include<algorithm>
 8 #define il inline
 9 #define re register
10 using namespace std;
11 typedef long long ll;
12 const int N=1200010;
13 int n,s,t,l,r,mid;
14 ll W,w[101],v[101],x,y,tot,ans;
15 struct data{ll p,q;} a[N],b[N];
16 il bool cmp(re data a,re data b){
17     return (a.p!=b.p)?(a.p<b.p):(a.q>b.q);
18 }
19 int main(){
20     freopen("pack.in","r",stdin);
21     freopen("pack.out","w",stdout);
22     scanf("%d%I64d",&n,&W);
23     for(int i=1;i<=n;i++)
24         scanf("%I64d%I64d",&w[i],&v[i]);
25     s=n/2;t=n-s;
26     for(re int S=(1<<s)-1;S>0;--S){
27         x=y=0;
28         for(re int i=0;i<s;++i)
29             if(S&(1<<i)){
30                 x+=w[i+1];
31                 y+=v[i+1];
32             }
33         a[S].p=x;a[S].q=y;
34     }
35     sort(a+1,a+(1<<s),cmp);
36     for(re int i=1;i<(1<<s);++i){
37         if(a[i].p>W) break;
38         if(a[i].q>b[tot].q) b[++tot]=a[i];
39     }
40     b[0].p=b[0].q=0;
41     for(re int S=(1<<t)-1;S>0;--S){
42         x=y=0;
43         for(re int i=0;i<t;++i)
44             if(S&(1<<i)){
45                 x+=w[i+1+s];
46                 y+=v[i+1+s];
47             }
48         if(x>W) continue;
49         l=0;r=tot;
50         while(l<r){
51             mid=(l+r+1)/2;
52             if(b[mid].p<=W-x) l=mid;
53             else r=mid-1;
54         }
55         ans=max(ans,y+b[l].q);
56     }
57     cout<<ans;
58     return 0;
59 }

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)

时间: 2024-10-24 09:15:16

常州day7的相关文章

块池是属于单个命名空间的一组块。

块池( Block Pool)     块池是属于单个命名空间的一组块.     每一个datanode为所有的block pool存储块.     Datanode是一个物理概念,而block pool是一个重新将block划分的逻辑概念.     同一个datanode中可以存着属于多个block pool的多个块.     Block pool允许一个命名空间在不通知其他命名空间的情况下为一个新的block创建Block ID.     一个Namenode失效不会影响其下的datanod

【2016常州一中夏令营Day7】

序列(sequence)[题目描述]蛤布斯有一个序列,初始为空.它依次将 1-n 插入序列,其中 i插到当前第 ai 个数的右边 (ai=0 表示插到序列最左边).它希望你帮它求出最终序列.[输入数据]第一行一个整数 n.第二行 n 个正整数 a1~an.[输出数据]输出一行 n 个整数表示最终序列,数与数之间用一个空格隔开.[样例输入]50 1 1 0 3[样例输出]4 1 3 5 2[数据范围]对于 30%的数据,n<=1000.对于 70%的数据,n<=100000对于 100%的数据,

Python之路,Day7 - 面向对象编程进阶

本节内容 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业开发一个支持多用户在线的FTP程序 面向对象高级语法部分 静态方法 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法什么是静态方法呢其实不难理解普通的方法可以在实例化后直接调用并且在方法里可以通过self.调用实例变量或类变量但静态方法是不可以访问实例变量或类变量的一个不能访问实例变量和类变量的方法其实相当于跟类本身已经没什么关系了它与类唯一的关联就是需要通过

python_way.day7 模块(configparser,xml,shutil,subprocess)、面向对象(上)(创建类,类的构成,函数式编程与面向对象编程的选择,类的继承)

python_way.day7 1.模块 configparser,xml,shutil,subprocess 2.面向对象(上) 创建类,类的构成,函数式编程与面向对象编程的选择,类的继承 1.模块 configparser 用于处理特定格式的文件,其本职上使用open来操作,只能是  [test1] 特定的格式 [test1] k1 = 123 k2 = True [test2] k1 = 123 k2 = v1 文件内容 1.获取 import configparser #打开文件找到文件

常州培训 day6

第一题: 题目大意: 给出一个N*N的矩阵,矩阵元素均为0或1.定义矩阵权值为sum(F[i][j]*F[j][i]); 给出K个操作: 询问矩阵的权值mod 2. 将矩阵的某一行元素取反(0变成1,1变成0). 将矩阵的某一列元素取反. N<=1000,K<=10^5 解题过程: 一开始看到K的范围有点大,肯定不能模拟,想到前几天N皇后那题大神讲了可以用60位压成一个long long优化,于是就傻乎乎的把每一行每一列都60位压缩.然后各种麻烦的操作,写到最后发现写不下去了,顿时心情糟透了,

day7 面向对象进阶

面向对象高级语法部分 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名来调用这个方法. class SchoolMember(object): def __init__(self,name,age,sex):

常州培训 day3 解题报告

第一题: 给出数轴正半轴上N个点的坐标和其权值,给出初始体力值M,人一开始在位置0,体力值会随着走过路程的增加而增加,走多少个单位的路消耗多少体力值.到每个点可以打掉,消耗的体力值就是其权值.求 最多能打掉多少点. N<=10000,其他<=10^18; 解题过程: 1.一开始就直接想到是贪心,首先人是不可能往左走的,否则不会最优.枚举最后停在哪个点,减去到这个点需要的体力,然后把这个点之前的所有点(包括这个店)的权值排个序,从小到大一个一个打,打到体力没有为止.复杂度分析:枚举N次,每次快拍

常州一中B.1

差不多有一个星期左右没有刷题啦>< 就随便抓了一套水了一遍 T1,T3,T4纯模拟,我就不吐槽啦 T2还有点意思,略带数学思想 这种题目以后不用慌呀,自己拿笔好好算算,总会找到规律的呀╮(╯▽╰)╭ 之后要开始刷题啦 暑假作业三天之内写完了= =好像有点快? 之后就是预习啦,五三刷起来~\(≧▽≦)/~ 当然还有oi呀..... 退役的最后一些日子里 常州一中B.1,布布扣,bubuko.com

python自动化运维之路~DAY7

python自动化运维之路~DAY7 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.客户端/服务器架构 C/S 架构是一种典型的两层架构,其全称是Client/Server,即客户端服务器端架构,其客户端包含一个或多个在用户的电脑上运行的程序,而服务器端有两种,一种是数据库服务器端,客户端通过数据库连接访问服务器端的数据:另一种是Socket服务器端,服务器端的程序通过Socket与客户端的程序通信. C/S 架构也可以看做是胖客户端架构.因为客户端需要实现绝大多数的业务