csp-s模拟测试49(9.22)养花(分块/主席树)·折射(神仙DP)·画作
最近有点头晕...........
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)·画作的更多相关文章
- csp-s模拟测试50(9.22)「施工(单调栈优化DP)」·「蔬菜(二维莫队???)」·「联盟(树上直径)」
改了两天,终于将T1,T3毒瘤题改完了... T1 施工(单调栈优化DP) 考场上只想到了n*hmaxn*hmaxn的DP,用线段树优化一下变成n*hmaxn*log但显然不是正解 正解是很**的单调 ...
- [CSP-S模拟测试]:小P的单调数列(树状数组+DP)
题目描述 小$P$最近喜欢上了单调数列,他觉得单调的数列具有非常多优美的性质.经过小$P$复杂的数学推导,他计算出了一个单调增数列的艺术价值等于该数列中所有书的总和.并且以这个为基础,小$P$还可以求 ...
- [考试反思]0921csp-s模拟测试49:困顿
太弱.还是太弱. 拉不开分差,离第一机房分数线估计还是300多分. 但是,还是要骂:XX出题人. 部分分非常少且没有意义,T1基本只有0/纯暴力20/100三个档, T2正解是n2但是n3一分不给,还 ...
- 2019.9.21 csp-s模拟测试49 反思总结
没赶上昨天的考试,不过我这种人考不考都没有多少提升吧. 挺服气的一场考试,有生以来参加的最让人想笑的考试. T1:养花 取模,区间询问最大值,有点套路化的预处理答案…难点也在预处理上.容易想到分块然后 ...
- 联赛模拟测试18 A. 施工 单调队列(栈)优化DP
题目描述 分析 对于 \(Subtask\ 1\),可以写一个 \(n^3\) 的 \(DP\),\(f[i][j]\) 代表第 \(i\) 个建筑高度为 \(j\) 时的最小花费,随便转移即可 时间 ...
- [CSP-S模拟测试]:陶陶摘苹果(线段树维护单调栈)
题目传送门(内部题116) 输入格式 第一行两个整数$n,m$,如题 第二行有$n$个整数表示$h_1-h_n(1\leqslant h_i\leqslant 10^9)$ 接下来有$m$行,每行两个 ...
- [CSP-S模拟测试]:platform(后缀数组+二分+线段树)
题目传送门 题目描述 走过奈何桥有一个名叫望乡台的土台,望乡台有个名曰孟婆的老妇人在卖孟婆汤.一生爱恨情仇,一世浮沉得失,都可以随这碗孟婆汤遗忘得干干净净.现在有$n$碗孟婆汤摆成一排,汤的品种不超过 ...
- [CSP-S模拟测试]:party?(霍尔定理+最小割+树链剖分)
题目描述 $Treeland$国有$n$座城市,其中$1$号城市是首都,这些城市被一些单向高铁线路相连,对于城市$i\neq 1$,有一条线路从$i$到$p_i(p_i<i)$.每条线路都是一样 ...
- [CSP-S模拟测试]:卡常题/b(基环树+DP)
题目描述 $ρ$有一个二分连通无向图,$X$方点.$Y$方点均为$n$个(编号为$1\sim n$).这个二分图比较特殊,每一个$Y$方点的度为$2$,一条黑色边,一条白色边.所有黑色边权值均为$a$ ...
随机推荐
- 【小技巧】修改eclipse中Java注释中的作者日期等信息
- 微信小程序中的常见弹框
显示加载中的提示框 wx.showLoading() 当我们正在在进行网络请求时,常常就需要这个提示框 手动调用wx.hideLoading()方法才能够关闭这个提示框,通常在数据请求完毕时就应该关闭 ...
- 脱壳入门----常见的寻找OEP的方法
一步直达法 所谓的一步直达法就是利用壳的特征.壳一般在执行完壳代码之后需要跳转到OEP处,而这个跳转指令一般是call ,jmp ,push retn类型的指令,而且因为壳代码所在的区段和OEP代码所 ...
- .Net·快速查找哪一个类库引用了哪一个Package
阅文时长 | 0.18分钟 字数统计 | 348.8字符 主要内容 | 1.引言&背景 2.查找法示例 3.声明与参考资料 『.Net·快速查找哪一个类库引用了哪一个Package』 编写人 ...
- mybatis-plus批量插入saveBatch太慢?我愿意称rewriteBatchedStatements为神
最近在做项目优化,代码优化之后,测试接口,好家伙.一个定时任务接口执行要10秒左右. 一点点追踪,给每个方法打上执行时间,一点点缩小范围.好家伙,终于让我锁定了目标. 这是mybatis-plus的批 ...
- 一文搞懂spring的常用注解
spring传统做法是使用xml文件对bean进行注入和配置.通过使用spring提供的注解,可以极大的降低配置xml文件的繁琐.本文将介绍常用的注解. 一@Autowired Autowired意为 ...
- Debian 9.4 多网卡链路聚合bond配置
Debian 9.4 多网卡链路聚合bond配置 安装ifenslave ifenslave 的作用是网卡的负载均衡 root@debian:~# apt-get install ifenslave ...
- 针对Tab键不能使用解决办法(Linux系统)
Tab键在装Linux操作系统时,最小化安装没有安装能使用Tab键的安装包,Tab键就无法使用,但命令和本该有的目标也有. 这时就需要安装bash-completion包.,废话不多说,直接上! 一. ...
- 华为鲲鹏处理器实现商用,Arm服务器又添砝码
华为鲲鹏处理器实现商用,Arm服务器又添砝码 鲲鹏920就是华为海思1620 鲲鹏920面向 服务器CPU就是 华为海思162064core 武汉华为PC不是海思1620是另一个cpu 深圳华为PC的 ...
- Maven知识点一览
Maven 介绍和搭建 介绍 Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告,和文档的软件项目管理工具. 环境搭建 网址:https://maven.apache ...