/*
做法一:按h sort一遍,对于一段区间[i,j],高度花费就是h[j]-h[i]
然后枚举区间,把区间内C排序,一个一个尽量选即可。
n^3logn
标算:n^3 dp
高度排序,保证从前往后调。
f[i][j]表示当前在第i栋楼,已经跳了j次楼的最小话费。转移枚举下一次跳那座楼。
f[k][j+1]=min(f[i][j],f[i][j]+h[k]-h[i]+c[k]);最后枚举f[i][j]<T,ans=max(ans,j)。
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm> #define N 510 using namespace std;
int T,n,ans,cnt;
int f[N][N];//当前处于第i座楼房已经跳了j次楼最小花费
struct node{
int h,c;
bool operator < (const node a) const{
return h<a.h;
} }L[N]; inline int read()
{
int 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()
{
n=read();
for(int i=;i<=n;i++) L[i].c=read();
for(int i=;i<=n;i++) L[i].h=read();
T=read();
sort(L+,L+n+); memset(f,/,sizeof f);
f[][]=f[][]=L[].c;
for(int i=;i<=n;i++)
for(int j=;j<=n+;j++)
for(int k=i+;k<=n;k++)
f[k][j+]=min(f[k][j+],f[i][j]+L[k].h-L[i].h+L[k].c); for(int i=;i<=n;i++)
for(int j=;j<=n+;j++)
if(f[i][j]<=T) ans=max(ans,j);
printf("%d\n",ans);
return ; }

 
/*
考虑最后要求的数 a1,a2,..an假定从小到大
给定了b1,b2......bn 从小到大排序
性质一:a1+a2=b1
性质二:a1+a3=b2
假设a2+a3=x,可以解出a1,a2,a3,并可以在b中b1,b2,x删除。则剩下的最小的一定是a1+a4。由于a1已知,a4可解。这个过程可以反复下去。
枚举a2+a3=b里面哪个数就好
*/
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm> using namespace std; const int N=; int n,m,res[N],ans[N][N],z[N*N],cnt; bool use[N*N]; void check(int p)
{
memset(use,false,sizeof(use));
if ((z[]+z[]+z[p])&) return;
res[]=(z[]+z[]+z[p])/-z[p];
res[]=z[]-res[];
res[]=z[]-res[];
use[]=use[]=use[p]=true;
for (int a=,b=;a<=n;a++)
{
while (b<=m && use[b]) b++;
if (b>m) return;
res[a]=z[b]-res[];
use[b]=true;
for (int c=;c<a;c++)
{
if (res[c]>res[a]) return;
int v=res[c]+res[a];
int p=lower_bound(z+,z+m+,v)-z;
if (z[p]!=v) return;
int px=p;
while (px && z[px]==z[p]) px--;
px++;
while (px<=m && z[px]==z[p] && use[px]) px++;
if (z[px]!=z[p] || use[px]) return;
p=px; use[p]=true;
}
}
cnt++;
for (int a=;a<=n;a++) ans[cnt][a]=res[a];
} int main()
{
freopen("city.in","r",stdin);
freopen("city.out","w",stdout);
scanf("%d",&n);
m=n*(n-)/;
for (int a=;a<=m;a++) scanf("%d",&z[a]);
sort(z+,z+m+);
for (int a=;a<=m;)
{
check(a);int b=a;
while (b<=m && z[b]==z[a])b++;
a=b;
}
printf("%d\n",cnt);
for (int a=;a<=cnt;a++)
for (int b=;b<=n;b++)
{
printf("%d",ans[a][b]);
if (b==n) printf("\n");
else printf(" ");
}
return ;
}

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm> #define N 100007 using namespace std;
int n,m,ans,c,p,v;
int a[N];
vector<int>sum[N];
struct ask{
int l,r,v,p;
}A[N]; inline int read()
{
int 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("light.in","r",stdin);
freopen("light.out","w",stdout);
int l,r;
n=read();m=read();
for(int i=;i<=n;i++) a[i]=read();
if(n<=)
{
for(int i=;i<=m;i++)
{
ans=;
l=read();r=read();p=read();v=read();
for(int j=l;j<=r;j++) if(a[j]%p==v) ans++;
printf("%d\n",ans);
}
}
else
{
for(int i=;i<=m;i++)
{
A[i].l=read();A[i].r=read();
A[i].p=read();A[i].v=read();
}
for(int i=;i<=n;i++) a[i]%=A[].p;
for(int i=;i<=n;i++)
sum[a[i]].push_back(i);
for(int i=;i<=m;i++)
{
printf ("%d\n",upper_bound(sum[A[i].v].begin (), sum[A[i].v].end (), A[i].r)
-lower_bound (sum[A[i].v].begin (), sum[A[i].v].end (), A[i].l));
}
}
return ;
}

60暴力

链表?!!wt?!
可以对p分块 。
p在[1,10^4+1]。如果枚举p预处理每个数mod p扔到vector里。O(np) TLE
可以把p在[1,100]里预处理,vector里二分即可。
p>100时,只有v+p,v+2p...v+kp能对答案造成贡献。一定有v+kp<=10^4,p>100-->k<=100。所以每次询问都最多有100个数对答案造成贡献,可以vector预处理,枚举这100个v+jp,vector里二分。
复杂度n*sqrt(n)*lgn。

#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std; const int maxn = ;
const int maxv = ;
const int bsz = ;
const int maxb = ; int n, m;
int a[maxn], vb[maxb][maxb], ve[maxb][maxb];
int xb[maxn], xe[maxn];
int i_buf[maxn * maxb * ], tib; void pre() {
memset(ve, , sizeof(ve));
memset(xe, , sizeof(xe));
for (int i = ; i <= n; ++ i)
++ xe[a[i]];
for (int i = ; i <= maxv; ++ i) {
xb[i] = tib;
tib += xe[i];
xe[i] = xb[i];
}
for (int i = ; i <= n; ++ i)
i_buf[xe[a[i]] ++] = i;
for (int m = ; m <= bsz; ++ m) {
for (int i = ; i <= n; ++ i)
++ ve[m][a[i] % m];
for (int i = ; i < m; ++ i) {
vb[m][i] = tib;
tib += ve[m][i];
ve[m][i] = vb[m][i];
}
for (int i = ; i <= n; ++ i)
i_buf[ve[m][a[i] % m] ++] = i;
}
} int queryb(int l0, int r0, int p, int k) {
if (vb[p][k] == ve[p][k])
return ;
int *x1 = lower_bound(i_buf + vb[p][k], i_buf + ve[p][k], l0);
int *x2 = upper_bound(i_buf + vb[p][k], i_buf + ve[p][k], r0);
return x2 - x1;
} int querys(int v, int l0, int r0) {
if (xb[v] == xe[v])
return ;
int *x1 = lower_bound(i_buf + xb[v], i_buf + xe[v], l0);
int *x2 = upper_bound(i_buf + xb[v], i_buf + xe[v], r0);
return x2 - x1;
} int querya(int l0, int r0, int p, int k) {
int ans = ;
for (int i = k; i <= maxv; i += p)
ans += querys(i, l0, r0);
return ans;
} int main() {
freopen("light.in", "r", stdin);
freopen("light.out", "w", stdout); scanf("%d%d", &n, &m);
tib = ;
for (int i = ; i <= n; ++ i)
scanf("%d", a + i);
pre();
while (m --) {
int l, r, p, k;
scanf("%d%d%d%d", &l, &r, &p, &k);
if (p <= bsz)
printf("%d\n", queryb(l, r, p, k));
else
printf("%d\n", querya(l, r, p, k));
}
}

清北考前刷题day2早安的更多相关文章

  1. 清北考前刷题day4早安

      LI /* 没有考虑次大值有大于一个的情况 */ #include<iostream> #include<cstdio> #include<cstring> # ...

  2. 清北考前刷题day7早安

  3. 清北考前刷题day6早安

    #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #d ...

  4. 清北考前刷题day5早安

    /* C(n,k) */ #include<iostream> #include<cstdio> #include<cstring> #define ll long ...

  5. 清北考前刷题day2下午好

    #include<iostream> #include<cstdio> #include<cstring> #include<stack> #defin ...

  6. 清北考前刷题day1早安

    立方数(cubic) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK定义了一个数叫“立方数”,若一个数可以被写作是一个正整数的3次方,则这个数就是立方数 ...

  7. 清北考前刷题day1下午好

    水题(water) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK出了道水题. 这个水题是这样的:有两副牌,每副牌都有n张. 对于第一副牌的每张牌长和宽 ...

  8. 清北考前刷题da7下午好

    三向城 /* 原图一定是一棵完全二叉树. 根节点是x,左节点是x*2,右节点是x*2+1 转化为二进制往左右走就很明显了. */ #include<iostream> #include&l ...

  9. 清北考前刷题day6下午好

    /* 贪心 负数一定不取 枚举最高位是1 且答案取为0的 位置, 更新答案. */ #include<iostream> #include<cstdio> #include&l ...

随机推荐

  1. numpy——基础数组与计算

    In [1]: import numpy as np In [11]: # 创建数组 a = np.array([1,2,3,4,5]) In [12]: a Out[12]: array([1, 2 ...

  2. 关于测试驱动的开发模式以及实战部分,建议看《Python Web开发测试驱动方法》这本书

    关于测试驱动的开发模式以及实战部分,建议看<Python Web开发测试驱动方法>这本书

  3. 九度oj 题目1205:N阶楼梯上楼问题

    题目1205:N阶楼梯上楼问题 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:4990 解决:2039 题目描述: N阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式.(要求采用 ...

  4. 7-19 求链式线性表的倒数第K项(20 分)(单链表定义与尾插法)

    给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字. 输入格式: 输入首先给出一个正整数K,随后是若干正整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理). 输出格式 ...

  5. HDU1241&POJ2386 dfs简单题

    2道题目都差不多,就是问和相邻所有点都有相同数据相连的作为一个联通快,问有多少个连通块 因为最近对搜索题目很是畏惧,总是需要看别人代码才能上手,就先拿这两道简单的dfs题目来练练手,顺便理一理dfs的 ...

  6. 变量&字符串

    变量 变量定义规范: # 声明变量: name = "Neo Zheng" # name为变量名(标识符),"Neo Zheng"是变量值. 变量定义规则: 1 ...

  7. 【intellij】intellij idea 建立与src级别的目录

    在使用三大框架时,通常会把配置文件放在自己新建的config文件夹里,以便编程.在 myeclipse里新建的config文件夹是Source Folder属性的 这样他的级别适合src一个级别,但是 ...

  8. Linux下汇编语言学习笔记32 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  9. 将mysql数据库数据导出为.sql文件

    打开Navicat ,在我们要到处的数据上面右击鼠标,然后弹出的快捷菜单上点击“转储SQL 文件”,在再次弹出的子菜单项中选择第一个“数据跟结构”.

  10. 我的arcgis培训照片9

    来自:http://www.cioiot.com/successview-547-1.html