最近有点头晕...........

T1 养花

考场我没想到正解,后来打的主席树,对于每个摸数查找1-(k-1),k-(2k-1)。。。的最大值,事实上还是很容易被卡的但是没有数据好像还比较友善,

对于求一段区间的最大值,因为建的是权值线段树,所以只需查找满足在查找的这段权值的区间内并且在L-R之内就好

在区间查询上稍改一下

正解分块咕了.....

***********************

查找mod某数的最大值,可以查1-(k-1)。。。拆开查询

 1 #include<bits/stdc++.h>
2 #define MAXN 110000
3 using namespace std;
4 int tot=0;int a[MAXN],f[30][MAXN];int n,m;
5 int read(){
6 int x=0;char c=getchar();int f=1;
7 while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
8 while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
9 return x;
10 }
11 struct node{int ls,rs,sum,me;}t[MAXN*100];
12 void insert(int &now,int x,int L,int R){
13 if(now==0)now=++tot;
14 int mid=(L+R)>>1;
15 if(L==R){t[now].sum++;t[now].me=x;return ;}
16 if(x<=mid)insert(t[now].ls,x,L,mid);
17 else insert(t[now].rs,x,mid+1,R);
18 t[now].sum=t[t[now].ls].sum+t[t[now].rs].sum;
19 }
20 int merge(int x,int y){
21 if(!x||!y)return x+y;
22 t[x].ls=merge(t[x].ls,t[y].ls);
23 t[x].rs=merge(t[x].rs,t[y].rs);
24 t[x].sum+=t[y].sum;
25 return x;
26 }
27 int find(int now,int last){
28 int nowls=t[now].ls;int nowrs=t[now].rs;
29 int lastls=t[last].ls;int lastrs=t[last].rs;
30 if(!nowls&&!nowrs){return t[now].me;}
31 if(t[nowrs].sum-t[lastrs].sum>0){return find(nowrs,lastrs);}
32 else if(t[nowls].sum-t[lastls].sum>0){return find(nowls,lastls);}
33 else return 0;
34 }
35 int maxn=0;int ok=0;int logg[MAXN];
36 void ask(int now,int last,int l,int r,int L,int R,int k){
37 if(ok==1)return ;
38 if(l<=L&&r>=R){
39 if(t[now].sum>t[last].sum){maxn=max(maxn,find(now,last)%k);ok=1;}
40 return ;
41 }
42 int mid=(L+R)>>1;
43 if(r>mid) ask(t[now].rs,t[last].rs,l,r,mid+1,R,k);
44 if(l<=mid)ask(t[now].ls,t[last].ls,l,r,L,mid,k);
45 }
46 int RMB(int l,int r){
47 int t=logg[r-l+1]/logg[2];
48 return max(f[t][l],f[t][r-(1<<t)+1]);
49 }
50 void init(){
51 for(int i=1;i<=n;++i)f[0][i]=a[i];
52 for(int j=1;j<=29;++j){
53 for(int i=1;i+(1<<j)-1<=n;++i){
54 f[j][i]=max(f[j-1][i],f[j-1][i+(1<<(j-1))]);
55 }
56 }
57 }
58 int rt[MAXN];int mmm=0;
59 int voi(int l,int r,int k1,int k2,int k){
60 int mt=0;
61 for(int i=l;i<=r;++i){
62 if(a[i]>=k1&&a[i]<=k2){
63 mt=max(mt,a[i]%k);
64 }
65 }
66 return mt;
67 }
68 signed main(){
69 //freopen("t1.in","r",stdin);
70 //freopen("aa.out","w",stdout);
71 n=read();m=read();
72 for(int i=1;i<=n;++i)logg[i]=log(i)/log(2);
73 for(int i=1;i<=n;++i){
74 a[i]=read();
75 mmm=max(a[i],mmm);
76 }
77 init();
78 for(int i=1;i<=n;++i)insert(rt[i],a[i],0,mmm);
79 for(int i=1;i<=n;++i)rt[i]=merge(rt[i],rt[i-1]);
80 for(int i=1;i<=m;++i){
81 maxn=0;int l=0,r=0,k=0;ok=0;
82 l=read();r=read();k=read();
83 for(int pt=1;pt<=RMB(l,r)/k+1;++pt){
84 ok=0;
85 ask(rt[r],rt[l-1],(pt-1)*k,pt*k-1,0,mmm,k);
86 }
87 printf("%d\n",maxn);
88 }
89 }

T2 折射

考场大概只看出了n^3DP,用树状数组优化一下成了n^2log(n),事实上快结束时看出可以改成n^2前缀和即可

但是内存炸了,考场有没看清内存,不然卡一卡能拿80

然后正解思路清奇

我们按x排序,然后f[i][0]表示以i为顶点,向左连边,f[i][1]表示以i为顶点,向右连边

然后对于j而言,如果b[j]>b[i],则证明j才是折线的顶点,那么就是用i改j

如果b[i]>b[j]那么就是i为定点,用j改i

 1 #include<bits/stdc++.h>
2 #define MAXN 6100
3 using namespace std;
4 const int mod=1e9+7;
5 int f[MAXN];struct node{int a,b;}e[MAXN];
6 int n;
7 bool cmp(node aa,node bb){
8 if(aa.b==bb.b)return aa.a>bb.a;
9 return aa.b>bb.b;
10 }
11 int c[MAXN][MAXN];int yuan[MAXN];int maxn=0;
12 int query(int x,int ad){
13 return c[x][ad]%mod;
14 }
15 int ans=0;
16 signed main(){
17 //freopen("t2.in","r",stdin);
18 //freopen("bb.out","w",stdout);
19 scanf("%d",&n);
20 for(int i=1;i<=n;++i){scanf("%d%d",&e[i].a,&e[i].b);yuan[++yuan[0]]=e[i].a;}
21 sort(yuan+1,yuan+yuan[0]+1);
22 int kx=unique(yuan+1,yuan+yuan[0]+1)-yuan-1;
23 for(int i=1;i<=n;++i){
24 e[i].a=lower_bound(yuan+1,yuan+kx+1,e[i].a)-yuan;
25 maxn=max(maxn,e[i].a);
26 }
27 sort(e+1,e+n+1,cmp);
28 for(int i=2;i<=n;++i){
29 memset(f,0,sizeof(f));
30 for(int j=1;j<i;++j){
31 if(e[j].b<=e[i].b)continue;
32 if(e[i].a==e[j].a)continue;
33 f[e[j].a]++;
34 if(e[i].a<e[j].a){
35 f[e[j].a]=(f[e[j].a]+query(j,e[i].a-1))%mod;
36 }
37 else{
38 f[e[j].a]=(f[e[j].a]+query(j,maxn)-query(j,e[i].a)+mod)%mod;
39 }
40 //printf("f[%d]=%d\n",e[j].a,f[e[j].a]);
41 }
42 for(int j=1;j<=maxn;++j){
43 c[i][j]=(f[j]+c[i][j-1])%mod;
44 }
45 }
46 for(int i=1;i<=n;++i)ans=(ans+c[i][maxn])%mod;
47 printf("%d\n",(ans+n)%mod);
48 }

暴力

 1 #include<bits/stdc++.h>
2 #define MAXN 6100
3 using namespace std;
4 const int mod=1e9+7;
5 int f[MAXN][2];
6 int n;
7 struct node{int a,b;}e[MAXN];
8 bool cmp(node aa,node bb){
9 return aa.a<bb.a;
10 }
11 long long ans=0;
12 signed main(){
13 //freopen("t2.in","r",stdin);
14 //freopen("bb.out","w",stdout);
15 scanf("%d",&n);
16 for(int i=1;i<=n;++i){scanf("%d%d",&e[i].a,&e[i].b);}
17 sort(e+1,e+n+1,cmp);
18 for(int i=1;i<=n;++i){
19 //printf("e[%d].a=%d e[%d].b=%d\n",i,e[i].a,i,e[i].b);
20 f[i][0]=1,f[i][1]=1;
21 if(e[i].a==e[i-1].a)continue;
22 for(int j=i-1;j>=1;--j){
23 if(e[j].b<e[i].b){
24 f[i][0]=(f[i][0]%mod+f[j][1]%mod)%mod;
25 }
26 else if(e[j].b>e[i].b){
27 f[j][1]=(f[j][1]%mod+f[i][0]%mod)%mod;
28 }
29 }
30 }
31 for(int i=1;i<=n;++i){
32 ans=(ans+f[i][0]%mod);
33 ans=(ans+f[i][1]-1+mod)%mod;
34 }
35 printf("%lld\n",ans%mod);
36 }

***************************

1.注意内存。

2.结合图像思路转化

T3

还没改过来,做的有点慢了

csp-s模拟测试49(9.22)养花(分块/主席树)·折射(神仙DP)·画作的更多相关文章

  1. csp-s模拟测试50(9.22)「施工(单调栈优化DP)」·「蔬菜(二维莫队???)」·「联盟(树上直径)」

    改了两天,终于将T1,T3毒瘤题改完了... T1 施工(单调栈优化DP) 考场上只想到了n*hmaxn*hmaxn的DP,用线段树优化一下变成n*hmaxn*log但显然不是正解 正解是很**的单调 ...

  2. [CSP-S模拟测试]:小P的单调数列(树状数组+DP)

    题目描述 小$P$最近喜欢上了单调数列,他觉得单调的数列具有非常多优美的性质.经过小$P$复杂的数学推导,他计算出了一个单调增数列的艺术价值等于该数列中所有书的总和.并且以这个为基础,小$P$还可以求 ...

  3. [考试反思]0921csp-s模拟测试49:困顿

    太弱.还是太弱. 拉不开分差,离第一机房分数线估计还是300多分. 但是,还是要骂:XX出题人. 部分分非常少且没有意义,T1基本只有0/纯暴力20/100三个档, T2正解是n2但是n3一分不给,还 ...

  4. 2019.9.21 csp-s模拟测试49 反思总结

    没赶上昨天的考试,不过我这种人考不考都没有多少提升吧. 挺服气的一场考试,有生以来参加的最让人想笑的考试. T1:养花 取模,区间询问最大值,有点套路化的预处理答案…难点也在预处理上.容易想到分块然后 ...

  5. 联赛模拟测试18 A. 施工 单调队列(栈)优化DP

    题目描述 分析 对于 \(Subtask\ 1\),可以写一个 \(n^3\) 的 \(DP\),\(f[i][j]\) 代表第 \(i\) 个建筑高度为 \(j\) 时的最小花费,随便转移即可 时间 ...

  6. [CSP-S模拟测试]:陶陶摘苹果(线段树维护单调栈)

    题目传送门(内部题116) 输入格式 第一行两个整数$n,m$,如题 第二行有$n$个整数表示$h_1-h_n(1\leqslant h_i\leqslant 10^9)$ 接下来有$m$行,每行两个 ...

  7. [CSP-S模拟测试]:platform(后缀数组+二分+线段树)

    题目传送门 题目描述 走过奈何桥有一个名叫望乡台的土台,望乡台有个名曰孟婆的老妇人在卖孟婆汤.一生爱恨情仇,一世浮沉得失,都可以随这碗孟婆汤遗忘得干干净净.现在有$n$碗孟婆汤摆成一排,汤的品种不超过 ...

  8. [CSP-S模拟测试]:party?(霍尔定理+最小割+树链剖分)

    题目描述 $Treeland$国有$n$座城市,其中$1$号城市是首都,这些城市被一些单向高铁线路相连,对于城市$i\neq 1$,有一条线路从$i$到$p_i(p_i<i)$.每条线路都是一样 ...

  9. [CSP-S模拟测试]:卡常题/b(基环树+DP)

    题目描述 $ρ$有一个二分连通无向图,$X$方点.$Y$方点均为$n$个(编号为$1\sim n$).这个二分图比较特殊,每一个$Y$方点的度为$2$,一条黑色边,一条白色边.所有黑色边权值均为$a$ ...

随机推荐

  1. 源码简析XXL-JOB的注册和执行过程

    一,前言 XXL-JOB是一个优秀的国产开源分布式任务调度平台,他有着自己的一套调度注册中心,提供了丰富的调度和阻塞策略等,这些都是可视化的操作,使用起来十分方便. 由于是国产的,所以上手还是比较快的 ...

  2. Spring核心结构及核心思想

    Spring核心结构 基本概念 Spring是⼀个分层⾮常清晰并且依赖关系.职责定位⾮常明确的轻量级框架,主要包括⼏个⼤模块:数据处理模块.Web模块.AOP(Aspect Oriented Prog ...

  3. 用fseek和ftell获取文件的大小

    #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc,char ...

  4. [Windows] 屏幕截图 - FastStone Capture(FSCapture) v9.4 飞扬时空汉化绿色版(官方地址) 【清晰好用 已验证】

    [Windows] 屏幕截图 - FastStone Capture(FSCapture) v9.4 飞扬时空汉化绿色版(官方地址) [复制链接]     愤怒の葡萄 电梯直达 楼主    发表于 2 ...

  5. 诸神之眼 - Nmap 教程

    *注: www.heihei.work 为本人测试网站,可由 官方测试网站 scanme.nmap.org代替. NO.11.扫描端口开放的服务nmap -T4 -A -v www.heiehi.wo ...

  6. linux进阶之SVN集中式版本控制系统篇

    代码上线--版本控制系统 SVN             集中式版本控制系统 git                 分布式版本控制系统 SVN是subversion的缩写,即版本控制系统,是一个开放 ...

  7. 9.4-6 kill & killall & pkill

    kill:终止进程 能够终止你希望停止的进程. kill 命令的参数选项及说明 -l    列出全部的信号名称 -p    指定kill命令只打印相关进程的进程号,而不发送任何信号 -s    指定要 ...

  8. Centos7.4永久修改系统时间

    [root@V3B01-zsy yum.repos.d]# date -s "2019-09-24 17:02:30" 2019年 09月 24日 星期二 17:02:30 CST ...

  9. PID参数

    大家奉上一篇关于PID算法及参数整定的知识! 1.位置表达式 位置式表达式是指任一时刻PID控制器输出的调节量的表达式. PID控制的表达式为 式中的y(t)为时刻t控制器输出的控制量,式中的y(0) ...

  10. Pandas之:Pandas简洁教程

    Pandas之:Pandas简洁教程 目录 简介 对象创建 查看数据 选择数据 loc和iloc 布尔索引 处理缺失数据 合并 分组 简介 pandas是建立在Python编程语言之上的一种快速,强大 ...