清北考前刷题day2早安



/*
做法一:按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早安的更多相关文章
- 清北考前刷题day4早安
LI /* 没有考虑次大值有大于一个的情况 */ #include<iostream> #include<cstdio> #include<cstring> # ...
- 清北考前刷题day7早安
- 清北考前刷题day6早安
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #d ...
- 清北考前刷题day5早安
/* C(n,k) */ #include<iostream> #include<cstdio> #include<cstring> #define ll long ...
- 清北考前刷题day2下午好
#include<iostream> #include<cstdio> #include<cstring> #include<stack> #defin ...
- 清北考前刷题day1早安
立方数(cubic) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK定义了一个数叫“立方数”,若一个数可以被写作是一个正整数的3次方,则这个数就是立方数 ...
- 清北考前刷题day1下午好
水题(water) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK出了道水题. 这个水题是这样的:有两副牌,每副牌都有n张. 对于第一副牌的每张牌长和宽 ...
- 清北考前刷题da7下午好
三向城 /* 原图一定是一棵完全二叉树. 根节点是x,左节点是x*2,右节点是x*2+1 转化为二进制往左右走就很明显了. */ #include<iostream> #include&l ...
- 清北考前刷题day6下午好
/* 贪心 负数一定不取 枚举最高位是1 且答案取为0的 位置, 更新答案. */ #include<iostream> #include<cstdio> #include&l ...
随机推荐
- 拥抱变革(More Fearless Change)
今天从大敏捷群中了解到Tid2017的一个讲演,一位敏捷教练,组织变革的专著的作者Linda的讲演. <More Fearless Change-Strategy for Making Your ...
- 前端开发:JQuery(2)& Bootstrap
JS事件流 事件的概念:HTML中与javascript交互是通过事件驱动来实现的,例如鼠标点击事件.页面的滚动事件onscroll等等,可以向文档或者文档中的元素添加事件侦听器来预订事件. 事件流: ...
- [NOIP2007] 提高组 洛谷P1098 字符串的展开
题目描述 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或者“4-8”的字串,我们就把它当作一种简写,输出时,用连续递增的字母获数 ...
- Educational Codeforces Round 41 B、C、D
http://codeforces.com/contest/961 B题 可以将长度为k的连续区间转化成1 求最大和 解析 简单尺取 #include <stdio.h> #include ...
- hdu - 1172 猜数字 (思维题)
http://acm.hdu.edu.cn/showproblem.php?pid=1172 这个题换一种想法,可以找出四位数中所有满足条件的数看是否只有一个. #include <iostre ...
- Ubuntu清理内存命令(效果不明显)
注意:最好不要在生产环境上使用!!! 1.检查内存使用情况 watch -n 3 free -m watch -n 3 cat /proc/meminfo 2.清理 #释放页缓存 echo 1 > ...
- JSP的体系结构
以下内容引用自http://wiki.jikexueyuan.com/project/jsp/architecture.html: Web服务器需要一个JSP引擎,即处理JSP页面的容器.JSP容器负 ...
- Android GIS开发系列-- 入门季(12) 显示载天地图
在项目中可以经常需要动态加载一些图层,像投影地图服务.投影地图服务器.其实网上有大量这样的服务,比如天地图官网, . 随便点开一个服务,里面有相关的信息.那如何加载这样图层服务呢. 一.首先感谢这篇博 ...
- CentOS 7 es搭建测试
搭建本地yum repo pass 指定特定repo 安装,比如安装wget.(指定特定repo 是为了从最快的repo安装) yum --disablerepo=\* --enablerepo=os ...
- SD卡 驱动层测速
init_timer(&timer1); timer1.function = test_time; timer1.data = ; timer1.expires = jiffies + mse ...
