csp-s模拟测试44「D·E·F」

用心出题,用脚造数据

乱搞场

 1 #include<bits/stdc++.h>
 2 #define re register
 3 #define int long long
 4 #define inf 0x7ffffffffffffff
 5 using namespace std;
 6 int n,a[100010],b[100010],ans=inf;
 7 double st,ed;
 8 inline int read(){
 9     re int a=0,b=1; re char ch=getchar();
10     while(ch<'0'||ch>'9')
11         b=(ch=='-')?-1:1,ch=getchar();
12     while(ch>='0'&&ch<='9')
13         a=(a<<3)+(a<<1)+(ch^48),ch=getchar();
14     return a*b;
15 }
16 inline int max(re int x,re int y){if(x>y) return x; return y;}
17 inline int min(re int x,re int y){if(x<y) return x; return y;}
18 inline void dfs(re int x,re int l,re int r,re int ll,re int rr){
19     if(1ll*(r-l)*(rr-ll)>ans) return ;
20     if(x>n){
21         ans=1ll*(r-l)*(rr-ll); 
22         ed=clock();
23         if((ed-st)/1e6>=1.99){
24             printf("%lld\n",ans);
25             exit(0);
26         }
27         return ; 
28     }
29     dfs(x+1,max(l,a[x]),min(r,a[x]),max(ll,b[x]),min(rr,b[x]));
30     dfs(x+1,max(l,b[x]),min(r,b[x]),max(ll,a[x]),min(rr,a[x]));
31 }
32 signed main(){
33 //    freopen("in.txt","r",stdin);
34     n=read();if(n==1){puts("1");return 0;}
35     for(re int i=1;i<=n;++i){
36         a[i]=read(),b[i]=read();
37         if(a[i]<b[i]) a[i]^=b[i]^=a[i]^=b[i];
38     }
39     st=clock();
40     dfs(1,0,inf,0,inf);
41     printf("%lld\n",ans);
42     return 0;
43 }
随机化
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<bits/stdc++.h>
 6 #define reg register
 7 using namespace std;
 8 typedef long long ll;
 9 const int maxn=1e5+5,INF=2e9;
10 inline void read(int &x)
11 {
12     x=0;char c=getchar();
13     while(c<'0'||c>'9') c=getchar();
14     while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+c-48,c=getchar();
15 }
16 ll ans;
17 int S,T,n,tot,L[maxn][2],R[maxn][2],L2[2],R2[2],tmp[2],yet[maxn];
18 struct ball{
19     int x[2];
20 }c[maxn];
21 struct wh{
22     int x,id,f;
23     bool friend operator < (const wh a,const wh b) {return a.x<b.x;}
24 }g[maxn<<1];
25 void dfs(int x)
26 {
27     T=clock();
28     if(T-S>1500000) {printf("%lld\n",ans);exit(0);}
29     if(x!=1&&1LL*(L[x-1][1]-L[x-1][0])*(R[x-1][1]-R[x-1][0])>ans) return ;
30     if(x==n+1) {ans=1LL*(L[x-1][1]-L[x-1][0])*(R[x-1][1]-R[x-1][0]);return ;}
31     if(c[x].x[0]>c[x].x[1]) swap(c[x].x[0],c[x].x[1]);
32     for(reg int j=0;j<=1;++j)    
33     {
34         L[x][0]=min(L[x-1][0],c[x].x[j]);
35         L[x][1]=max(L[x-1][1],c[x].x[j]);
36         R[x][0]=min(R[x-1][0],c[x].x[j^1]);
37         R[x][1]=max(R[x-1][1],c[x].x[j^1]);
38         dfs(x+1);
39     }
40 }
41 int main()
42 {
43     srand(time(NULL));
44     S=clock();
45 //    freopen("ans.in","r",stdin);
46 //    freopen("b.out","w",stdout);
47     read(n);
48     for(reg int i=1;i<=n;++i)
49     {
50         read(c[i].x[0]),read(c[i].x[1]);
51         g[++tot]=(wh){c[i].x[0],i,0};
52         g[++tot]=(wh){c[i].x[1],i,1};
53     }
54     reverse(c+1,c+n+1);
55     sort(g+1,g+tot+1);
56     ans=1e18;ans+=5;
57     int l=1,r=tot,k=0;
58     memset(yet,0xFF,sizeof(yet));
59     while(k<n)
60     {
61         while(yet[g[l].id]!=-1) ++l;
62         yet[g[l].id]=g[l].f;++k;
63         if(k==n) break;
64         while(yet[g[r].id]!=-1) --r;
65         yet[g[r].id]=g[r].f;++k;
66     }
67     L[0][0]=R[0][0]=L2[0]=R2[0]=INF;
68     for(reg int i=1;i<=n;++i)
69     {
70         L2[0]=min(L2[0],c[i].x[yet[i]]);
71         L2[1]=max(L2[1],c[i].x[yet[i]]);
72         R2[0]=min(R2[0],c[i].x[yet[i]^1]);
73         R2[1]=max(R2[1],c[i].x[yet[i]^1]);
74     }
75     ans=1LL*(L2[1]-L2[0])*(R2[1]-R2[0]);
76     dfs(1);
77     printf("%lld\n",ans);
78     return 0;
79 }
clock

垃圾zzn当然什么也不会啦,乱搞什么也没打

D

考试时想到正解,没打,觉得这仅仅是个简单的剪枝,没想到啊

题意

求$(r-l+1)*gcd(a[l],a[l+1],.....,a[r])$最大值

题解

垃圾zzn没打正解,类正解多$log$用来二分了,常数较小

$gcd$总需要求,求次数太多了

考虑二分,维护$gcd$从$mid$前缀和后缀和

这样你就有$50$分了

考虑$gcd$变化次数小于是维护单调队列,很简单

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define A 333333
 5 ll a[A],suml[A],sumr[A],dll[A],dlr[A];
 6 ll ans=0,n;
 7 ll gcd(ll x,ll y){
 8     if(y==0) return x;
 9     return gcd(y,x%y);
10 }
11 void solve(ll l,ll r){
12     if(l==r) return ;
13     ll mid=(l+r)>>1,rnow=mid+1,lnow=mid;
14     suml[lnow]=a[lnow],sumr[rnow]=a[rnow];
15     dll[0]=0,dlr[0]=0;
16     while(lnow>l){
17         lnow--;
18         suml[lnow]=gcd(suml[lnow+1],a[lnow]);
19         if(suml[lnow]!=suml[lnow+1])
20             dll[++dll[0]]=lnow+1;
21     }
22     dll[++dll[0]]=l;
23     while(rnow<r){
24         rnow++;
25         sumr[rnow]=gcd(sumr[rnow-1],a[rnow]);
26         if(sumr[rnow]!=sumr[rnow-1])
27             dlr[++dlr[0]]=rnow-1;
28     }
29     dlr[++dlr[0]]=r;
30     for(ll lh=1;lh<=dll[0];lh++)
31         for(ll rh=1;rh<=dlr[0];rh++){
32             ll nowl=dll[lh],nowr=dlr[rh];
33             ll g=gcd(suml[nowl],sumr[nowr]);
34 //            printf("nowl=%lld nowr=%lld =%lld\n",dll[lh],dlr[rh],g*(nowr-nowl+1));
35             if(g==1) break;
36             ans=max(ans,g*(nowr-nowl+1));
37         }
38     ans=max(ans,gcd(suml[l],sumr[r])*(r-l+1));
39     solve(l,mid);solve(mid+1,r);
40 }
41 //10 10 101 10 10 
42 int main(){
43 //    freopen("da.in","r",stdin);
44 //    freopen("ans.sol","w",stdout);
45     scanf("%lld",&n);
46     for(ll i=1;i<=n;i++){
47         scanf("%lld",&a[i]);
48     }
49     solve(1,n);
50     printf("%lld\n",ans);
51 }
View Code

 

E

这个题真的很迷

题解

 垃圾zzn考试时打的第二个贪心,然后只有$60$分,事实上单纯第一个贪心就可以$100$分,数据特别水,第一个贪心明明连样例都过不去

没遇到数据这么水的,

正确性垃圾zzn当然不会验证啦

代码也懒的放了

F

题解

0分算法

直接暴力$dp$

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 ll f[2][2019][2019],w[2019];
 5 ll a,b,n,q;
 6 int main(){
 7     scanf("%lld%lld%lld%lld",&n,&q,&a,&b);
 8     memset(f,0x7f,sizeof(f));
 9     for(ll i=1;i<=q;i++)
10         scanf("%lld",&w[i]);
11     f[1][a][w[1]]=abs(b-w[1]);
12     f[1][w[1]][b]=abs(a-w[1]);
13     for(ll i=2;i<=q;i++){
14         memset(f[i&1],0x7f,sizeof(f[i&1]));
15         for(ll j=1;j<=n;j++){
16         f[i&1][j][w[i]]=min(f[i&1][j][w[i]],f[(i-1)&1][j][w[i-1]]+abs(w[i]-w[i-1]));//w[i-1]移动到w[i]
17         f[i&1][w[i]][w[i-1]]=min(f[i&1][w[i]][w[i-1]],f[(i-1)&1][j][w[i-1]]+abs(j-w[i]));//j移动到w[i]
18         f[i&1][w[i]][j]=min(f[i&1][w[i]][j],f[(i-1)&1][w[i-1]][j]+abs(w[i]-w[i-1]));//w[i-1]移动到w[i]
19         f[i&1][w[i-1]][w[i]]=min(f[i&1][w[i-1]][w[i]],f[(i-1)&1][w[i-1]][j]+abs(j-w[i]));//j移动到w[i]
20         }
21     }
22     ll ans=0x7fffffff;
23     for(ll j=1;j<=n;j++){
24         ans=min(ans,min(f[q&1][j][w[q]],f[q&1][w[q]][j]));
25     }
26     printf("%lld\n",ans);
27 }
View Code

30分算法

有一维一定是$w[i]$

考虑去掉一维

$f[i][j]=f[i-1][j]+abs(w[i]-w[i-1])$另一个指针从$w[i-1]$移动到$w[i]$

$f[i][w[i-1]]=f[i-1][j]+abs(j-w[i])$从$j$移动到$w[i]$

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll f[2][2019],w[2019];
ll a,b,n,q;
int main(){scanf("%lld%lld%lld%lld",&n,&q,&a,&b);memset(f,0x7f,sizeof(f));for(ll i=1;i<=q;i++)scanf("%lld",&w[i]);f[1][a]=abs(b-w[1]);f[1][b]=abs(a-w[1]);for(ll i=2;i<=q;i++){memset(f[i&1],0x7f,sizeof(f[i&1]));for(ll j=1;j<=n;j++){f[i&1][j]=min(f[i&1][j],f[(i-1)&1][j]+abs(w[i]-w[i-1]));f[i&1][w[i-1]]=min(f[i&1][w[i-1]],f[(i-1)&1][j]+abs(j-w[i]));f[i&1][j]=min(f[i&1][j],f[(i-1)&1][j]+abs(w[i]-w[i-1]));f[i&1][w[i-1]]=min(f[i&1][w[i-1]],f[(i-1)&1][j]+abs(j-w[i]));}}ll ans=0x7fffffff;for(ll j=1;j<=n;j++){ans=min(ans,min(f[q&1][j],f[q&1][j]));}printf("%lld\n",ans);
}
View Code

100分算法

两个转移式子

$f[i][j]=f[i-1][j]+abs(w[i]-w[i-1])$

$f[i][w[i-1]]=f[i-1][j]+abs(j-w[i])$

发现第一个式子就是区间加,第二个式子单点赋值

单点赋值赋的就是$min$,有个$abs$怎么办维护$f-j$最小值和$f+j$最小值

        memset(askmin,0x7f,sizeof(askmin));seg_min(1,1,w[i],2);//p[i]比当前点大,那么取p[i]-lseg_min(1,w[i],n,1);//p[i]比当前值小,取l-p[i]//    printf("ask=%lld %lld\n",askmin[1],askmin[2]);askmin[1]-=w[i];askmin[2]+=w[i];ll nowmin=min(askmin[1],askmin[2]);

线段树优化一下

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 ll w[1010101],askmin[4];
 5 ll a,b,n,q;
 6 struct tree{
 7     ll l,r,f,minn[4];
 8 }tr[1010101];
 9 void up(ll x){
10     for(ll i=1;i<=3;i++)
11         tr[x].minn[i]=min(tr[x<<1].minn[i],tr[x<<1|1].minn[i]);
12 }
13 void down(ll x){
14     tr[x<<1].f+=tr[x].f;
15     tr[x<<1|1].f+=tr[x].f;
16     for(ll i=1;i<=3;i++)
17         tr[x<<1].minn[i]+=tr[x].f,tr[x<<1|1].minn[i]+=tr[x].f;
18     tr[x].f=0;
19 }
20 void built(ll x,ll l,ll r){//printf("builx=%lld\n",x);
21     tr[x].l=l,tr[x].r=r;
22     if(l==r){
23         if(l==a||l==b){
24             tr[x].minn[3]=abs(a+b-l-w[1]);
25 //            printf("tr3=%lld\n",tr[x].minn[3]);
26             tr[x].minn[1]=tr[x].minn[3]+l;
27             tr[x].minn[2]=tr[x].minn[3]-l;
28         }
29         else tr[x].minn[1]=tr[x].minn[2]=tr[x].minn[3]=0x7ffffffffff;
30         return ;
31     }
32     ll mid=(l+r)>>1;
33     built(x<<1,l,mid);
34     built(x<<1|1,mid+1,r);
35     up(x);
36 }
37 void seg_min(ll x,ll l,ll r,ll zl){
38 //    printf("l=%lld r=%lld\n",l,r);
39     if(tr[x].l>=l&&tr[x].r<=r){
40 //        printf("tr[%lld].minn[%lld]=%lld l=%lld r=%lld\n",x,zl,tr[x].minn[zl],tr[x].l,tr[x].r);
41         askmin[zl]=min(askmin[zl],tr[x].minn[zl]);
42         return ;
43     }
44     down(x);
45     ll mid=(tr[x].l+tr[x].r)>>1;
46     if(mid>=l) seg_min(x<<1,l,r,zl);
47     if(mid<r) seg_min(x<<1|1,l,r,zl);
48     up(x);
49 }
50 void add(ll x,ll point,ll val){
51     if(tr[x].l==tr[x].r){
52         tr[x].minn[3]=min(tr[x].minn[3],val);
53         tr[x].minn[1]=tr[x].minn[3]+tr[x].l;
54         tr[x].minn[2]=tr[x].minn[3]-tr[x].l;
55         return ;
56     }
57     down(x);
58     ll mid=(tr[x].l+tr[x].r)>>1;
59     if(point<=mid) add(x<<1,point,val);
60     else add(x<<1|1,point,val);
61     up(x);
62 }
63 int main(){
64     scanf("%lld%lld%lld%lld",&n,&q,&a,&b);
65     for(ll i=1;i<=q;i++)
66         scanf("%lld",&w[i]);
67     built(1,1,n);
68     for(ll i=2;i<=q;i++){
69         memset(askmin,0x7f,sizeof(askmin));
70         seg_min(1,1,w[i],2);//p[i]比当前点大,那么取p[i]-l
71         seg_min(1,w[i],n,1);//p[i]比当前值小,取l-p[i]
72     //    printf("ask=%lld %lld\n",askmin[1],askmin[2]);
73         askmin[1]-=w[i];
74         askmin[2]+=w[i];
75         ll nowmin=min(askmin[1],askmin[2]);
76     //    printf("nowmin=%lld\n",nowmin);
77         tr[1].f+=abs(w[i]-w[i-1]);
78         for(ll j=1;j<=3;j++)
79             tr[1].minn[j]+=abs(w[i]-w[i-1]);
80         add(1,w[i-1],nowmin);
81     }
82     printf("%lld\n",tr[1].minn[3]);
83 }
View Code

 

转载于:https://www.cnblogs.com/znsbc-13/p/11535091.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349534.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++中的new_怎么在java中创建一个自定义的collector

简介在之前的java collectors文章里面&#xff0c;我们讲到了stream的collect方法可以调用Collectors里面的toList()或者toMap()方法&#xff0c;将结果转换为特定的集合类。今天我们介绍一下怎么自定义一个Collector。Collector介绍我们先看一下Collector的定义&#xff1a;Co…

Java 9中的新Regex功能

最近&#xff0c;我收到了Packt出版的Anubhava Srivastava提供的免费书籍“ Java 9 Regular Expressions” 。 这本书是一个很好的教程&#xff0c;它向任何想学习正则表达式并从头开始的人介绍。 那些知道如何使用正则表达式的人可能仍然很有趣&#xff0c;以重申其知识并加深…

c语言实现二分法_C语言实现二分法求解方程在区间内的根

C语言实现二分法求解方程在区间内的根。设有非线性方程&#xff1a;其中&#xff0c; 为 上连续函数且设 (不妨设方程在 内仅有一个实根)&#xff0c;求上述方程实根的二分法过程&#xff0c;就是将含根区间[a,b]逐步分半&#xff0c;检查函数值符号的变化&#xff0c;以便确定…

计划

赤 wqs二分 https://www.cnblogs.com/Juve/p/11479423.html https://www.cnblogs.com/Rorschach-XR/p/11479602.html 反悔贪心 https://www.cnblogs.com/cjyyb/p/9367948.html https://www.cnblogs.com/Miracevin/p/9795871.html https://blog.csdn.net/weixin_34344677/articl…

java写入文件编码格式为ansi_Windows10 bat批处理删除 快速打开文件夹 固定到开始菜单或任务栏...

1. 快速打开文件夹1.1 bat文件如果你经常打开一个被放在很深的文件夹&#xff0c;于是浪费很多打开文件的时间&#xff1a;开始>此电脑>Data(D:)>文件夹1>文件夹2...>文件夹n>平均要浪费大约10秒的时间&#xff0c;如果每天打开100次&#xff0c;那么1000秒&…

python中__init__.py的作用、module和package

控制包的导入行为&#xff1a; 1、声明当前文件是一个可导入的包&#xff1b;2、如果当下包下有多个.py文件使用__ all__ [ 模块名]&#xff0c;也就是form XXX import YYYmodule和package 为了编写可维护的代码&#xff0c;我们把很多函数分组&#xff0c;分别放到不同的文件…

java default修饰符_Java基础语法二

Java循环结构for循环/* for(初始化;布尔表达式;更新) {执行代码 } */ for(int i0; i < 5; i) {System.out.println(i); }最先执行初始化步骤&#xff1b;可以声明一种类型&#xff0c;但可初始化一个或多个循环控制变量&#xff0c;也可以是空语句然后检测布尔表达式&#x…

微信开发修改button里的字体大小_微信小程序全栈开发课程【视频版】2.2 index页面完善...

​点击观看视频课程 ↓↓↓微信小程序首页完善https://www.zhihu.com/video/1195308096099282944课程文字版1、template 部分&#xff08;1&#xff09;修改template部分的代码template里面包含html代码&#xff0c;对应着原生小程序框架里中的.wxml文件。我们将index.vue文件中…

jaxb list集合对象_JAXB –表示空集合和空集合

jaxb list集合对象示范代码 以下演示代码将用于Java模型的所有不同版本。 它只是将一个集合设置为null&#xff0c;第二个设置为空列表&#xff0c;第三个设置为填充列表。 package package blog.xmlelementwrapper;import java.util.ArrayList; import javax.xml.bind.*;publ…

.net 把一个对象赋值给一个参数_Java GC回收算法-判定一个对象是否可以回收

开源推荐推荐一款一站式性能监控工具&#xff08;开源项目&#xff09;Pepper-Metrics是跟一位同事一起开发的开源组件&#xff0c;主要功能是通过比较轻量的方式与常用开源组件&#xff08;jedis/mybatis/motan/dubbo/servlet&#xff09;集成&#xff0c;收集并计算metrics&a…

管理角色认知-新晋管理常常犯的错

背景 管理是一门实践科学&#xff0c;从知道到做到&#xff0c;需要长时间的刻意练习&#xff0c;提前知道那些坑&#xff0c;可以提前规避。 坑1&#xff1a;被动执行 现象&#xff1a; 不主动找活干&#xff0c;等上级派活&#xff1b; 上级有了安排&#xff0c;指望上级替他…

头条号个人中心登录_登陆自己的头条号后台操作步骤

作为一个自媒体新人对自媒体的知识还是不够了解的&#xff0c;有的新人甚至还不知道什么是头条号后台&#xff0c;这篇文章是专为新手写的一篇文章&#xff0c;带你走进你的头条号后台遛一圈。那么什么是头条号后台呢&#xff1f;这里笔者就作下简单的介绍方便新人学习。登陆自…

python保存变量_将python 中的变量保存到本地

如何将python中的变量保存在本地&#xff1f; 将python 的一些代码保存在本地&#xff0c; 特别是一些需要大量运算的结果&#xff0c;例如 机器学习里面的模型&#xff0c;&#xff0c;放在本地&#xff0c;还是比较好用的。下次就可以直接拿出来使用就好。 其实可以 我觉得可…

django filter查询多选_Django:使用filter的pk进行多值查询操作

由于想要做收藏夹的功能&#xff0c;所以希望能够一次性查询出所有id的对象&#xff0c;查看文档&#xff0c;找到了如下方法pk是primary key的缩写&#xff0c;顾名思义pk_in就是primary key在某一个范围内&#xff0c;具体操作(以自带的User为例)&#xff1a;User.objects.fi…

csp-c模拟测试「set·read·」

set 题解 只要求一组特解 像入阵曲一样就好了(入阵曲真是好题啊$!$) $(sum[r]-sum[l])\%n0$ 拆成$sum[r]\%nsum[l]\%n$桶里存$sum[l]\%n$每次找$sum[r]$桶里有没有对应的#sum[l]# 存$tong[0]1$,别的先查后存 证明 证明一下正确性 $0$自己合法$(sum[r]\%n)0$不需要找对应 其他都…

JSP,JSF和EL简介

JavaServer页面&#xff0c;JavaServer Faces和表达语言 在本文中&#xff0c;我将研究JavaServer Pages&#xff08;JSP&#xff09;和Expression Language&#xff08;EL&#xff09;&#xff0c;然后将其与JavaServer Faces &#xff08;JSF&#xff09;关联。 我将讨论如何…

stream模式不能接受blob文件_一文带你层层解锁文件下载的奥秘

今天带来的主题是关于文件下载&#xff0c;通过本文带你领略文件下载的奥秘。本文会花费你较长的时间阅读&#xff0c;建议先收藏/点赞&#xff0c;然后查看你感兴趣的部分&#xff0c;平时也可以充当当做字典的效果来查询。:) 不整不知道&#xff0c;一整&#xff0c;居然整出…

# 管道已结束_县城这条路启用自来水新管道,看看是否在你家附近...

连日来&#xff0c;县自来水公司的工作人员顶着高温抓紧作业&#xff0c;目前&#xff0c;县城范堤路自来水管道改造工程已过半&#xff0c;预计本月中旬完工。施工现场1目前&#xff0c;盐垣路至掘中路的新管道正在进行对接&#xff0c;为了确保启用新管道后的用水安全&#x…

python 中的eval与exec

eval类似exec,是使用python编译器运行表达式和语句两者区别在于:eval是编译表达式并返回值(如: eval("hello*2") 结果是 hellohello)exec则是运行一部分代码,并且不像eval那样返回结果,exec的返回值永远是None,且exec可运行多行代码(如: exec("l[1,2,3]\nfor i …

启动时指定需要绑定的网卡_为什么小型汽油机在启动时需要拉风门,而汽车却不用?...

很多人都有骑小型摩托车的经验&#xff0c;在启动摩托车时&#xff0c;一般要把“合风”拉上&#xff0c;否则摩托车启动就会很困难。特别是在天气比较寒冷时&#xff0c;如果不拉上合风&#xff0c;摩托车很难启动。但是在汽车上却没有“合风”这个装置&#xff0c;我们在启动…