现在才来填坑,之后还要陆续补其他几天的,可能前几天真的太颓了


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]的更多相关文章

  1. [雅礼NOIP2018集训] day6

    打满暴力好像是一种挑战,已经连续几天考试最后一个小时自闭了,因为自以为打完了暴力,然而,结果往往差强人意 大概是考试的策略有些问题 T1: 我们设$g[x]$为在x时取小于等于m个物品的最大价值,下面 ...

  2. [雅礼NOIP2018集训 day4]

    感觉状态极差啊,今天居然爆零了 主要是以下原因: 1.又是T1看错题肝了两个小时,发现题意理解错误瞬间心态爆炸 2.T2交错了文件名 3.T3暴力子任务和正解(假的)混在一起,输出了两个答案 都想为自 ...

  3. [雅礼NOIP2018集训 day3]

    考试的时候刚了T1两个小时线段树写了三个子任务结果发现看错了题目,于是接下来一个半小时我自闭了 result=历史新低 这告诉我们,打暴力要端正态度,尤其是在发现自己之前出锅的情况下要保持心态的平和, ...

  4. 雅礼 noip2018 模拟赛 day3 T3

    典型树形dp 这里,我们应该看到一些基本性质: ①:如果这个边不能改(不是没有必要改),我们就不改,因为就算改过去还要改回来,显然不是最优的 注意:"不能改"是指边的性质和要求的相 ...

  5. 雅礼 noip2018 模拟赛day3 T2

    典型的状压思想 设0表示黑球,1表示白球,用一串01序列代表剩下的球的状态,记f[i]表示在i状态下取球的最大期望 那么可以利用记忆化搜索更新,每一层枚举可能拿走的球然后向下搜索,同时记忆化即可 在状 ...

  6. 【loj6307】「雅礼国庆 2017 Day1」Clique 贪心

    题目描述 数轴上有 $n$ 个点,第 $i$ 个点的坐标为 $x_i$ 权值为 $w_i$ .两个点 $i,j$ 之间存在一条边当且仅当 $|x_i−x_j|\le w_i+w_j$ . 你需要求出这 ...

  7. Loj #6307. 「雅礼国庆 2017 Day1」Clique

    link: https://loj.ac/problem/6307 最大团转补图的独立集,这样的话只有r[x]<l[y]或者r[y]<l[x],x和y才能连边,所以排序之后乱搞就行了. 需 ...

  8. [雅礼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) ...

  9. 【NOIP2016提高A组模拟8.17】(雅礼联考day1)总结

    考的还ok,暴力分很多,但有点意外的错误. 第一题找规律的题目,推了好久.100分 第二题dp,没想到. 第三题树状数组.比赛上打了个分段,准备拿60分,因为时间不够,没有对拍,其中有分段的20分莫名 ...

随机推荐

  1. UESTC--1271--Search gold(贪心)

    Search gold Time Limit: 1000MS   Memory Limit: 65535KB   64bit IO Format: %lld & %llu Submit Sta ...

  2. web前端简单布局

    jquery实现的计算器

  3. python一行代码实现9x9乘法表

    for i in range(1,10): for j in range(1,i+1): print('%s * %s = %s ' %(i,j,i*j),end="") prin ...

  4. Ztree自动触发第一个节点的点击事件

    1.代码 $(function () { var setting = { //check属性放在data属性之后,复选框不起作用 //check: { // enable: true //}, dat ...

  5. 维基百科 MediaWiki API 解析

    使用开放的 API 做一个自己的小项目,是一个很好的学习方法.但好像开放的 API 选择并不多.这里给大家多一个选择,简单介绍一下维基百科使用的 MediaWiki API. 简介 先简单介绍几个容易 ...

  6. js获取浏览器中相关容器的高度

    网页可见区域宽: document.body.clientWidth 网页可见区域高: document.body.clientHeight 网页可见区域宽: document.body.offset ...

  7. APUE学习笔记2——文件I/O

    1 引言 本章首先讨论Unix系统中大多数文件I/O最常用的5个系统函数:open.read.write.lseek以及close. 本章所说明的函数又被成为不带缓冲的I/O,不带缓冲是指每个read ...

  8. Book 动态规划

    虽然之前学过一点点,但是还是不会------现在好好跟着白书1.4节学一下—————— (1)数字三角形 d(i,j) = max(d(i+1,j),d(i+1,j+1)) + a[i][j] hdu ...

  9. ZBrush中设置背面遮罩的两种方法

    背面遮罩是ZBrush软件实时遮罩的一种,它的出现能够解决我们在模型雕刻时的一些问题.我们在 ZBrush®中雕刻一个比较薄的物体时,经常会不经意的雕刻到背面的物体.那么遇到此类状况该如何设置ZBru ...

  10. 设置mySql的编码方式为utf-8

    检查命令: mysql> show variables like '%char%'; 期望结果: 使用mysql命令设置: 如果仍有编码不是utf8的,请检查配置文件,也可使用mysql命令设置 ...