[雅礼NOIP2018集训 day1]
现在才来填坑,之后还要陆续补其他几天的,可能前几天真的太颓了
T1:
题目大意:给定一个长度为n的序列,m次询问每次询问给出l,r,询问区间l到r的元素在模k意义下的最大值
数据范围当然是你暴力写不过的...
老实说我考场敲了主席树,不幸的是只拿到了暴力的分
考虑正解?我们分块。预处理出每一块在模k意义下的最大值,多余部分暴力计算就好
上面一句话显然是废话,我么怎么预处理出每一块在模任意k意义下的最大值呢?
显然在$[ak,(a+1)k)$这一段值域中,数值最大值一定是最优的,我们可以开个表记录当前块中小于等于当前数字的最大的元素的大小,预处理统计一段的答案时就是取小于等于$(a+1)k-1$的最大值就好了
发现$[ak,(a+1)k)$的区间一共有$klnk$个,其实我也不知道怎么得到的,这样时间复杂度好像就对了,实测卡过去是比较轻松的
- #include<algorithm>
- #include<cstring>
- #include<cstdio>
- #include<iostream>
- using namespace std;
- const int N=1e5;
- const int M=1e2;
- int n,m;
- int a[N+],lst[N+],ans[M][N+];
- inline int read()
- {
- char ch=getchar();
- int s=,f=;
- while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
- while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=getchar();}
- return s*f;
- }
- int main()
- {
- // freopen("flower.in","r",stdin);
- // freopen("flower.out","w",stdout);
- int B=;
- n=read();m=read();
- for (int i=;i<=n;i++) a[i]=read();
- int siz=(n-)/B;
- for (int i=;i<=siz;i++)
- {
- memset(lst,,sizeof(lst));
- int l=i*B+,r=min(n,(i+)*B);
- for (int j=l;j<=r;j++) lst[a[j]]=a[j];
- for (int j=;j<=N;j++) lst[j]=max(lst[j],lst[j-]);
- for (int j=;j<=N;j++) for (int k=;k<=N;k+=j) ans[i][j]=max(ans[i][j],lst[min(N,k+j-)]-k);
- }
- while (m--)
- {
- int l=read(),r=read(),k=read();
- int L=(l-)/B,R=(r-)/B,re=;
- for (int i=L+;i<R;i++) re=max(re,ans[i][k]);
- for (int i=l;i<=min((L+)*B,r);i++) re=max(re,a[i]%k);
- for (int i=max(l,R*B+);i<=r;i++) re=max(re,a[i]%k);
- printf("%d\n",re);
- }
- return ;
- }
T2:
emm这题出题人很坑啊,像笔者这样的蒟蒻在看到条件1的时候就直接按y排序了,出题人的意思是这样不好优化,笔者在考场上好像也许可能大概刚出了时间复杂度正确的前缀和优化,无奈死在了128MB的空间上
正解是按x排序,$dp_{i,0/1}$表示以第i个点为顶端的向左和向右的方案数。注意到当前点的x值是最大的,那么显然只能在前i个点中只能作为折线的第一个点或第二个点
那么有两种转移方法
$dp_{j,1}->dp_{i,0}$ $y_j<y_i$
$dp_{k,1}->dp_{j,1}$ $y_j>y_i,y_k<y_i,x_k>x_j$
以上显然都有$x_i>x_j,x_i>x_k$
发现第二种转移可以前缀和优化一下
- #include<algorithm>
- #include<cstdio>
- #include<iostream>
- #include<cstring>
- using namespace std;
- typedef long long ll;
- const int N=6e3+;
- const int mod=1e9+;
- int n;
- ll dp[N][];
- struct node
- {
- ll x,y;
- }e[N];
- inline ll read()
- {
- char ch=getchar();
- ll s=,f=;
- while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
- while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=getchar();}
- return s*f;
- }
- bool cmp(node a,node b) {return a.x<b.x;}
- int main()
- {
- //freopen("refract.in", "r", stdin);
- //freopen("refract.out", "w", stdout);
- n=read();
- for (int i=;i<=n;i++) {e[i].x=read();e[i].y=read();}
- sort(e+,e++n,cmp);
- for (int i=;i<=n;i++)
- {
- dp[i][]=dp[i][]=;
- for (int j=i-;j>=;j--)
- if (e[j].y<e[i].y) (dp[i][]+=dp[j][])%=mod;
- else (dp[j][]+=dp[i][])%=mod;
- }
- ll ans=mod-n;//dp[i][0]和dp[i][1]算重了
- for (int i=;i<=n;i++) (ans+=dp[i][]+dp[i][])%=mod;
- printf("%lld\n",ans);
- return ;
- }
T3:
待填
[雅礼NOIP2018集训 day1]的更多相关文章
- [雅礼NOIP2018集训] day6
打满暴力好像是一种挑战,已经连续几天考试最后一个小时自闭了,因为自以为打完了暴力,然而,结果往往差强人意 大概是考试的策略有些问题 T1: 我们设$g[x]$为在x时取小于等于m个物品的最大价值,下面 ...
- [雅礼NOIP2018集训 day4]
感觉状态极差啊,今天居然爆零了 主要是以下原因: 1.又是T1看错题肝了两个小时,发现题意理解错误瞬间心态爆炸 2.T2交错了文件名 3.T3暴力子任务和正解(假的)混在一起,输出了两个答案 都想为自 ...
- [雅礼NOIP2018集训 day3]
考试的时候刚了T1两个小时线段树写了三个子任务结果发现看错了题目,于是接下来一个半小时我自闭了 result=历史新低 这告诉我们,打暴力要端正态度,尤其是在发现自己之前出锅的情况下要保持心态的平和, ...
- 雅礼 noip2018 模拟赛 day3 T3
典型树形dp 这里,我们应该看到一些基本性质: ①:如果这个边不能改(不是没有必要改),我们就不改,因为就算改过去还要改回来,显然不是最优的 注意:"不能改"是指边的性质和要求的相 ...
- 雅礼 noip2018 模拟赛day3 T2
典型的状压思想 设0表示黑球,1表示白球,用一串01序列代表剩下的球的状态,记f[i]表示在i状态下取球的最大期望 那么可以利用记忆化搜索更新,每一层枚举可能拿走的球然后向下搜索,同时记忆化即可 在状 ...
- 【loj6307】「雅礼国庆 2017 Day1」Clique 贪心
题目描述 数轴上有 $n$ 个点,第 $i$ 个点的坐标为 $x_i$ 权值为 $w_i$ .两个点 $i,j$ 之间存在一条边当且仅当 $|x_i−x_j|\le w_i+w_j$ . 你需要求出这 ...
- Loj #6307. 「雅礼国庆 2017 Day1」Clique
link: https://loj.ac/problem/6307 最大团转补图的独立集,这样的话只有r[x]<l[y]或者r[y]<l[x],x和y才能连边,所以排序之后乱搞就行了. 需 ...
- [雅礼NOIP集训 2017] number 解题报告 (组合数+二分)
题解: 令$S(i)={i+1,i+2,...,i<<1}$,f(i,k)表示S(i)中在二进制下恰好有k个1的数的个数 那么我们有$f(i,k)=\sum_{x=1}^{min(k,p) ...
- 【NOIP2016提高A组模拟8.17】(雅礼联考day1)总结
考的还ok,暴力分很多,但有点意外的错误. 第一题找规律的题目,推了好久.100分 第二题dp,没想到. 第三题树状数组.比赛上打了个分段,准备拿60分,因为时间不够,没有对拍,其中有分段的20分莫名 ...
随机推荐
- angularjs1-3,工具方法,bootstrap,多个module,引入jquery
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- Swift - 获取应用名称、应用版本、设备型号、系统版本等信息
有时我们在 App 中提交一些统计信息或者用户反馈信息时,为了能更好地进行分析,通常会附带上当前应用程序的名称.版本号.设备型号.以及设备系统版本.下面演示如何获取这些信息. 1,效果图 程序启动后自 ...
- 英语发音规则---S字母
英语发音规则---S字母 一.总结 一句话总结: 1.S 在音节开头或清辅音前 /s/? sit /sɪt/ vt.& vi.坐 seat /si:t/ n.席位 sell /sel/ vt. ...
- datatable dataRow
DataRow[] Drs = DtStockProduct.Select(Condition11); DtResult = DtStockProduct.Clone(); datatble tabl ...
- JQuery 登录窗口的布局
<!-- Button trigger modal --><button type="button" class="btn btn-primary bt ...
- 操作EXCEL COM组件
操作Excel COM组件 --------------COM组件操作excel---------- 了解对象 Application:Excel运行环境,也就是excel程序 WorkBook:表示 ...
- input上传文件检测文件大小
前几天在做 input[type='file'] 上传图片时,需要检测上传文件的内存大小,写了一个小demo,在此做一总结: <!DOCTYPE html> <html lang=& ...
- jqury中$("#div").index($this)在setTimeoutt中返回值一直是-1的问题解决方案
今天遇到一个十分蛋疼的问题,花了我一个多小时才解决,其实十分简单,但我是新手,好了,事情是这样的: 我想让鼠标停留在某个元素一定时间再显示它隐藏的内容(不然你鼠标快速滑上滑下,反反复复,如果碰上sli ...
- javascript中常用数组方法详细讲解
javascript中数组常用方法总结 1.join()方法: Array.join()方法将数组中所以元素都转化为字符串链接在一起,返回最后生成的字符串.也可以指定可选的字符串在生成的字符串中来分隔 ...
- SQL的where执行顺序
SQL的where执行顺序 1 mysql 从左到右. 一个原则,排除越多的条件放到第一个 例子:抄的. SELECT … WHERE p.languages_id = 1 AND m.languag ...