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$ ...
随机推荐
- python主线程捕获子线程异常
python内置threading.Thread类创建的子线程抛出的异常无法在主线程捕获,可以对该类进行优化,为子线程添加exit code属性,主线程通过获取子线程的返回状态,来判断子线程中是否发生 ...
- 比物理线程都好用的C++20的协程,你会用吗?
摘要:事件驱动(event driven)是一种常见的代码模型,其通常会有一个主循环(mainloop)不断的从队列中接收事件,然后分发给相应的函数/模块处理.常见使用事件驱动模型的软件包括图形用户界 ...
- [BUAA2021软工]结对第一阶段博客作业小结
作业链接 结对项目-第一阶段 优秀作业推荐 本次博客作业虽然是简单总结,但是以下作业中都不乏有思考.有亮点的精彩内容,推荐给同学们阅读学习. 山鸣谷应,相得益彰--杰对项目-第一阶段总结 该组对于可能 ...
- (Dubbo架构)基于MDC+Filter的跨应用分布式日志追踪解决方案
在单体应用中,日志追踪通常的解决方案是给日志添加 tranID(追踪ID),生成规则因系统而异,大致效果如下: 查询时只要使用 grep 命令进行追踪id筛选即可查到此次调用链中所有日志,但是在 du ...
- [bug] IDEA springboot项目 访问静态资源 html页面 报404
原因 复制的静态资源目录没有编译 解决 检查target目录中,是否有static目录,若没有,重新右键项目install即可 若还不能解决,尝试浏览器缓存和IDEA编译设置,详见参考链接 参考 ht ...
- centos7 连接打印机
centos7 连接打印机 2017-08-07 15:05:33 五岳寻仙客 阅读数 2531更多 分类专栏: Liunx的日常使用 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版 ...
- python基础之pip、.pyc、三元运算、进制、一切皆对象、可变与不可变类型
一.pip(下载工具==yum) 1.重点(必须掌握的) 列出已安装的包 pip list 安装要安装的包 pip install xxx 安装特定版本 pip install django==1.1 ...
- 学习android开发的一些笔记
一:UI开发 由于我们使用了android:layout_weight属性,此时控件的宽度就不由android:layout_width来决定了,这里指定成0dp是一种比较规范的写法. android ...
- linux 安装配置NFS服务器
一.Ubuntu安装配置NFS 1.安装NFS服务器 sudo apt-get install nfs-kernel-server 安装nfs-kernel-server时,apt会自动安装nfs-c ...
- GO语言面向对象04---接口的继承
package main import "fmt" type Animal interface { Eat(food string) (shit string) GoDie() } ...