清北考前刷题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 ...
随机推荐
- ASP.net在IE6下乱码问题
今天处理程序的时候遇到一个坑爹的问题 该死的IE6传中文参数会出现 类似于◆的乱码 不过终于解决了 也许解决的方法有很多 和大家分享下我的解决方案 我用的javascript中 传的参数 < ...
- POJ-20407Relatives/NYOJ-333mdd的烦恼,欧拉函数简单应用,模板A
poj Relatives Time Limit: 1000MS Memory Li ...
- 客户端用plsql进行中文条件查询时无结果的解决办法
1.SELECT * FROM v$nls_parameters ; 查看NLS_CHARACTERSET 的值是多少,我的AL32UTF8- 查找客户机器的注册表,查找NLS_LANG的值,改成AL ...
- HDU 2147 找规律博弈
题目大意: 从右上角出发一直到左下角,每次左移,下移或者左下移,到达左下角的人获胜 到达左下角为必胜态,那么到达它的所有点都为必败态,每个点的局势都跟左,下,左下三个点有关 开始写了一个把所有情况都计 ...
- SPOJ 3261 (树套树傻逼题)
As another one of their crazy antics, the N (1 ≤ N ≤ 100,000) cows want Farmer John to race against ...
- 好用的window命令
Nslookup-------IP地址侦测器 chkdsk-----Chkdsk磁盘检查 regedt32-------注册表编辑器 regedit----注册表 perfmon----计算机性能监测 ...
- android view自定义
转载自:http://blog.csdn.net/iispring/article/details/50708044
- Ubuntu 16.04通过Magent搭建Memcached集群(转)
一.下载Magent 官网:https://code.google.com/archive/p/memagent/downloads 离线版本:(链接: https://pan.baidu.com/s ...
- cocos2dx 在android平台打开文件问题
我们有一个项目是基于cocos2dx + lua,在网络部分用到了protobuf, 在初始化protobuf的时候须要读取本地文件,用lua的io.open读取文件在windows,ios上 ...
- MyEclipse,Eclipse注释规范模板
注释的作用:myeclipse中java文件头注释格式设置,最终可用于javadoc.exe生成API文档,同时提高了代码的可读性 设置方法: windows->preferences-> ...