NOIP模拟测试19「count·dinner·chess」

反思:

我考得最炸的一次

怎么说呢?简单的两个题0分,稍难(我还不敢说难,肯定又有人喷我)42分

前10分钟看T1,不会,觉得不可做,完全不可做,把它跳了

最后10分钟看T1,发现一个有点用的性质,仍然认为不可实现

0分

所以T1是什么样的难题呢

即使暴力也有60分,但我楞没想出来暴力怎么打

然后我就挂掉了

 t2又是什么样难题

大多数人秒切一个小时切两道,

但这次考试给了我很大启迪,也正是这次考试我才开始使劲刚T1

其实大多数T1都是比较简单的,并没有想象中那么难,这次考试对我来说意义很大

(就在模拟测试21我也认为T1很难坚持刚其实T1还是很简单的)

count

题解

一共有多少种方案可以把这棵树分成大小相同的几块

题干简洁明了,

性质:我们如果能分成大小相同全为$size$大小的几块,那么只有一种方案分成大小全为$size$

有了这条性质我们就可以愉快的打了

枚举所有n的约数打了就$AC$了(还有不要暴力枚举约数,先根号n求一下约数)

实现,假设当前我们发现这个子树累计$size$达到了约数就剪掉这个枝条

若减不掉就累加到父亲上,如果父亲减不掉且$size$已经比当前枚举约数大了,那么当前方案不可行,否则方案$++$

 

例如我们枚举约数3,我们在3减不掉,5减不掉,累加到2,2判断size大了所以不可行

bool dfs(ll x,ll pre,ll num){sz[x]=1;for(ll i=head[x];i;i=nxt[i]){ll y=ver[i];if(y==pre) continue;if(!dfs(y,x,num)) return 0;sz[x]+=sz[y];if(sz[x]>num) return 0;}
//    printf("sz=%lld  \n",sz[x]);if(sz[x]==num) sz[x]=0;return 1;
}

代码

#include<bits/stdc++.h>
using namespace std;
#define ll int
#define A 2999989
ll sz[A],ver[A],nxt[A],head[A];
ll ans=2,tot=1,n,m;
vector<ll> woshishabi;
void add(ll x,ll y){ver[++tot]=y,nxt[tot]=head[x],head[x]=tot;
}
inline ll read(){ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=x*10+c-'0';c=getchar();}return f*x;
}
bool dfs(ll x,ll pre,ll num){sz[x]=1;for(ll i=head[x];i;i=nxt[i]){ll y=ver[i];if(y==pre) continue;if(!dfs(y,x,num)) return 0;sz[x]+=sz[y];if(sz[x]>num) return 0;}
//    printf("sz=%lld  \n",sz[x]);if(sz[x]==num) sz[x]=0;return 1;
}
int main(){n=read();for(ll i=1,a,b;i<n;i++){a=read(),b=read();add(a,b);add(b,a);}for(ll i=2;i<=sqrt(n);i++){if(n%i==0){if(i*i==n) woshishabi.push_back(i);elsewoshishabi.push_back(i),woshishabi.push_back(n/i);}}for(ll i=0;i<woshishabi.size();i++){if(dfs(1,0,woshishabi[i])){ans++;}
//        printf("=%lld ans=%lld\n",woshishabi[i],ans);
    }cout<<ans<<endl;
}

dinner

题解

不错的题意转化

分成个数最少的环,每个环总权值最大的最小

最大的最小??

二分答案

一个很好的二分答案题,让我明白了我们枚举其实可以拿分块优化一下

暴力应该都会打吧

枚举圈的数量,这里讲一下$check$

我采取的是首先找到一个圈,找到最左可以到达的值,以及到达最左后到达右面节点,这已经$1$个圈了

每次枚举剩下的值,若当前符合直接返回,不符合最左指针$++$,右面指针跟着移动,进行操作知道最左达到$n+1$

这样一般过不了(然而我暴力$nian$标算了)我打法玄学

    while(now<=tim){tl--;now+=a[tl];}now-=a[tl],tl++;while(now<=tim){tr++;now+=a[tr];}now-=a[tr],tr--;//一个完美的闭合回路while(tl!=n+2){cnt=2;tot=0;
//        printf("tl=%lld tr=%lld \n",tl,tr);//除了当前满足的tl,tr之外的圈的另一半for(LL j=tr+1;j<=tl+n-1;j++){if(tot>tim)tot=a[j],cnt++;if(cnt>m){cnt=m+10;break;}}
//        printf("cnt=%lld\n",cnt);if(cnt<=m)return 1;now-=a[tl];tl++;while(now<=tim){tr++;now+=a[tr];}now-=a[tr],tr--;}return 0;
}

主要讲剪枝

就一句话特别简单

            if(j+t<=tl+n-1&&sum[j+t]-sum[j-1]+tot<=tim){tot+=(sum[j+t]-sum[j-1]);j+=t;continue;}

能t加就加t,一句小的剪枝让你从$T60$分到$100$分,从$3000$-->$200$(虽然我暴力跑了$100$)

方法简单,

一定要掌握这种思想

代码

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define A 1010101
LL a[A],sum[A];
LL n,m,ans,avg,mx=-1,t;
LL check(LL tim){LL now=0,tl=n+1,tr=n+1,tot,cnt=0;now=a[n+1];
//    printf("now=%lld\n",now);while(now<=tim){tl--;now+=a[tl];}now-=a[tl],tl++;while(now<=tim){tr++;now+=a[tr];}now-=a[tr],tr--;//一个完美的闭合回路while(tl!=n+2){cnt=2;tot=0;
//        printf("tl=%lld tr=%lld \n",tl,tr);//除了当前满足的tl,tr之外的圈的另一半for(LL j=tr+1;j<=tl+n-1;j++){if(j+t<=tl+n-1&&sum[j+t]-sum[j-1]+tot<=tim){tot+=(sum[j+t]-sum[j-1]);j+=t;continue;}tot+=a[j];if(tot>tim)tot=a[j],cnt++;if(cnt>m){cnt=m+10;break;}}
//        printf("cnt=%lld\n",cnt);if(cnt<=m)return 1;now-=a[tl];tl++;while(now<=tim){tr++;now+=a[tr];}now-=a[tr],tr--;}return 0;
}
int main(){scanf("%lld%lld",&n,&m);t=sqrt(n);for(LL i=1;i<=n;i++){scanf("%lld",&a[i]);a[i+n]=a[i];mx=max(mx,a[i]);}for(LL i=1;i<=2*n;i++)sum[i]=sum[i-1]+a[i];LL l=mx,r=sum[n];while(l<=r){LL mid=(l+r)>>1;if(check(mid)) r=mid-1,ans=mid;else l=mid+1;}printf("%lld\n",ans);
}

chess

题解

知道了正解也难以实现打了$4$个小时,我最后还是颓了标程,然而刚看$10$秒就明白怎么做并用$10$分钟$AC$

首先我们要掌握一种科技最短路计数

然而敌军不能对方案造成影响,考虑缩边

那么题解中说缩边缩边,怎么缩啊

我尝试跑两遍$spfa$(伪缩边)然而只有$20$分

尝试$tarjan$(伪缩边)然而只有$0$分

尝试对拍小点全对,大点全错

好难实现,考虑每个点$dfs?$

能过?,能过最多每个点搜每个点一遍善用复杂度分析$2500^2$

那么$dfs$搜些什么,

既然敌军不能对方案造成影响,遇到敌军往下搜但不建边,遇到空格return并且建边

建单向边,这样我们就缩边了

很巧妙不是吗?

注意答案可能很大开0x7ffffffffffffffffffff

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define A 51000
ll head[A],nxt[A],ver[A],way[A],dis[A],G[51][51],mzz[51][51];
ll F[58][58];
ll qix,qiy,zhongx,zhongy;
bool flag[A];
ll tot=0,n,m;
ll id(ll x,ll y){return (x-1)*m+y;
}
void jb(ll x,ll y){//建边
//    printf("jbjbjbjbx=%lld y=%lld\n",x,y);nxt[++tot]=head[x],head[x]=tot,ver[tot]=y;
}
const ll nowx[9]={0,2,2,1,-1,-2,-2,1,-1};
const ll nowy[9]={0,1,-1,2,2,1,-1,-2,-2};
void dfs(ll root,ll x,ll y){G[x][y]=1;
//    printf("x=%lld y=%lld\n",x,y);for(ll i=1;i<=8;i++){ll x1=nowx[i]+x,y1=nowy[i]+y;
//        printf("x=%lld y=%lld x1=%lld y1=%lld\n",x,y,x1,y1);if(x1<1||x1>n||y1<1||y1>m||G[x1][y1]) continue;if(F[x1][y1]==1)dfs(root,x1,y1);else G[x1][y1]=1,jb(root,mzz[x1][y1]);}
}
/*void spfa(ll w){deque<ll>q;memset(dis,0x3f,sizeof(dis));memset(flag,0,sizeof(flag));dis[w]=0;q.push_back(w);while(!q.empty()){ll x=q.front();q.pop_front();flag[x]=0;for(ll i=head[x];i;i=nxt[i]){ll y=ver[i];if(dis[y]>dis[x]+edge[i]){if(edge[i]==0)choose[y]=x;dis[y]=dis[x]+edge[i];    
//                printf("x=%lld y=%lld dx=%lld dy=%lld\n",x,y,dis[x],dis[y]);
//                if(x==59||y==59){
//                    printf("***********\n");
//                }if(!flag[y]){q.push_back(y);flag[y]=1;}}}}
}*/
void spfa2(ll w){deque<ll>q;memset(dis,0x7f,sizeof(dis));memset(flag,0,sizeof(flag));dis[w]=0;q.push_back(w);while(!q.empty()){ll x=q.front();q.pop_front();flag[x]=0;
//        printf("x=%lld\n",x);for(ll i=head[x];i;i=nxt[i]){ll y=ver[i];if(dis[y]>dis[x]+1){way[y]=way[x];dis[y]=dis[x]+1;if(!flag[y]){q.push_back(y);flag[y]=1;}}else if(dis[y]==dis[x]+1){way[y]+=way[x];}}}
}
int main(){scanf("%lld%lld",&n,&m);    for(ll i=1;i<=n;i++)for(ll j=1;j<=m;j++){mzz[i][j]=id(i,j);
//            printf("mzz[%lld][%lld]=%lld\n",i,j,mzz[i][j]);
        }for(ll i=1;i<=n;i++)for(ll j=1;j<=m;j++){scanf("%lld",&F[i][j]);            if(F[i][j]==3)qix=i,qiy=j;else if(F[i][j]==4)zhongx=i,zhongy=j;}for(ll i=1;i<=n;i++)for(ll j=1;j<=m;j++){if(F[i][j]==0||F[i][j]==3){memset(G,0,sizeof(G));dfs(mzz[i][j],i,j);}}        
/*    for(ll i=1;i<=n;i++)for(ll j=1;j<=m;j++){        if(F[i][j]==2) continue;for(ll k=1;k<=8;k++){ll x1=i+nowx[k],y1=j+nowy[k];ll idpre=id(i,j),idnow=id(x1,y1);if(x1<1||x1>n||y1<1||y1>m) continue;if(F[x1][y1]==2) continue;if(!G[idpre][idnow]){if(F[x1][y1]==1||F[x1][y1]==4)jb(idpre,idnow,0),G[idpre][idnow]=1;elsejb(idpre,idnow,1),G[idpre][idnow]=1;}}if(F[i][j]==3)qix=i,qiy=j;else if(F[i][j]==4)zhongx=i,zhongy=j;}
*/    way[mzz[qix][qiy]]=1;
//    printf("%lld\n%lld\n",dis[id(zhongx,zhongy)],way[id(zhongx,zhongy)]);
    spfa2(mzz[qix][qiy]);if(dis[mzz[zhongx][zhongy]]>1e8) printf("-1\n");elseprintf("%lld\n%lld\n",dis[mzz[zhongx][zhongy]]-1,way[mzz[zhongx][zhongy]]);
}

 

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

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

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

相关文章

react组件卸载调用的方法_好程序员web前端培训分享React学习笔记(三)

好程序员web前端培训分享React学习笔记(三)&#xff0c;组件的生命周期React中组件也有生命周期&#xff0c;也就是说也有很多钩子函数供我们使用, 组件的生命周期&#xff0c;我们会分为四个阶段&#xff0c;初始化、运行中、销毁、错误处理(16.3之后)初始化在组件初始化阶段会…

静态工厂方法代替构造器实例_静态工厂方法与传统构造方法

静态工厂方法代替构造器实例之前&#xff0c;我已经讨论过一些关于Builder模式的信息 &#xff0c; Builder Pattern是一种有用的模式&#xff0c;用于实例化具有几个&#xff08;可能是可选的&#xff09;属性的类&#xff0c;这些属性可以使读取&#xff0c;编写和维护客户端…

NOIP模拟测试21「折纸·不等式」

折纸 题解 考试时无限接近正解&#xff0c;然而最终也只是接近而已了 考虑模拟会爆炸&#xff0c;拿手折纸条试一试&#xff0c;很简单 考你动手能力 代码 #include<bits/stdc.h> using namespace std; #define ll long long #define A 3100000 ll cj[A],questions[A]; l…

小孔成像总结_科学实践小孔成像

科学实践小孔成像-徐征浩、周永锋耳闻之不如目见之&#xff0c;目见之不如足践之。行是知之始&#xff0c;知是行之成。聪明不仅仅是理论上&#xff0c;它还体现在实践等方面。国庆期间&#xff0c;同学们运用物理课堂上所学的知识制作了小孔成像和土电话这些常见的物理仪器&am…

休眠架构概述

下图提供了Hibernate体系结构的高级视图&#xff1a; 最小的架构 “最小”架构使应用程序可以管理自己的JDBC连接&#xff0c;并提供与Hibernate的连接。 另外&#xff0c;应用程序自行管理交易。 这种方法使用了最少的Hibernate API子集。 综合架构 Hibernate Basic API 这里…

ASP.NET Core MVC 之过滤器(Filter)

ASP.NET MVC 中的过滤器允许在执行管道中的特定阶段之前或之后运行代码。可以对全局&#xff0c;也可以对每个控制器或每个操作配置过滤器。 1.过滤器如何工作 不同的过滤器类型在管道中的不同阶段执行&#xff0c;因此具有各自的与其场景。根据需要执行的任务以及需要执行的请…

.sh文件是什么语言_FastDFS分布式文件系统的搭建安装

FastDFS很久之前&#xff0c;对上传的文件可能是存储在数据库&#xff0c;在数据库中存储路径&#xff0c;保存文件的二进制数据&#xff0c;随着用户上传的文件增加&#xff0c;数据库数据越来越多。这时&#xff0c;可以使用分布式文件系统&#xff0c;将用户上传的文件例如图…

ASP.NET Core MVC 之依赖注入 View

ASP.NET Core 支持在试图中使用依赖注入。这将有助于提供视图专用的服务&#xff0c;比如本地化或者仅用于填充视图元素的数据。应尽量保持控制器和视图之间的关注点分离。视图所显示的大部分数据应该从控制器传入。 使用 inject 指令将服务注入到视图&#xff0c;语法 inject …

matlab全安装多大_不理会其他,我只中意T20天正V2.0软件,激活安装教程在这里...

大家好&#xff0c;我是本文的小编 软妹&#xff0c;前几篇为大家分享了Proe系列软件的安装步骤&#xff0c;在设计三维设计领域Pro/E是现今主流的CAD/CAM/CAE软件一款软件&#xff0c;特别是在国内产品设计领域占据重要位置。在数控加工编程软件领域&#xff0c;哪款软件才是王…

couchbase_Couchbase 2.0归类视图简介

couchbase大多数应用程序必须处理“主/详细”类型的数据&#xff1a; 啤酒厂和啤酒 部门和员工 发票和项目 … 例如&#xff0c;创建如下所示的应用程序视图是必需的&#xff1a; 借助Couchbase和许多面向文档的数据库&#xff0c;您可以使用不同的方式来处理此问题&…

NOIP模拟测试20「周·任·飞」

liu_runda出的题再次$\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%$ 任 题解 题目中为什么反复强调简单路径,没有环 没有环的图中点数-边数联通块数 前缀和维护边的前缀和,和点的前缀和, 在维护边的前缀和不好维护转化为横着边前缀和,竖着边前缀和 注意边的边界问题 看边如何维护 就拿…

如何脚踏实地构建Java Agent

在构建Plumbr的多年中&#xff0c;我们遇到了许多具有挑战性的问题。 在其他方面&#xff0c;使Plumbr Java Agent可靠地执行而又不危害客户的应用程序&#xff0c;是一个特别棘手的任务。 从实时系统中安全地收集所有需要的遥测会带来很多问题。 其中一些非常简单&#xff0c;…

ASP.NET Core MVC 之依赖注入 Controller

ASP.NET Core MVC 控制器应通过构造函数明确地请求它们地依赖关系&#xff0c;在某些情况下&#xff0c;单个控制器地操作可能需要一个服务&#xff0c;在控制器级别上的请求可能没有意义。在这种情况下&#xff0c;也可以将服务作为 Action 的参数。 依赖注入是一种如 Depend…

16g内存 32g内存游戏区别_电脑内存8G和16G的差别大吗?打游戏需要多大内存?

Hello大家好&#xff0c;我是兼容机之家的小牛。电脑内存是除了CPU之外最重要的元件之一&#xff0c;电脑内存的多少直接影响着运行大型软件、多任务时电脑的流畅程度&#xff0c;很多玩家在第一次购买电脑的时候并不知道应该购买内存多大的电脑&#xff0c;今天小牛就来和大家…

用友U9执行JS代码。

UFSoft.UBF.UI.AtlasHelper.RegisterAtlasStartupScript(part.Page, part.Page.GetType(), "JavaScriptExecQueue", "alert(地球即将毁灭&#xff0c;进入倒计时&#xff1a;5&#xff0c;4&#xff0c;3&#xff0c;2&#xff0c;1…嘣&#xff01;嘣&#xff…

java培训学费_北京Java培训班学费很贵吗,包含了哪些收费项目

北京的Java培训班有很多&#xff0c;价格却是相差不多的&#xff0c;但培训的课程就参差不齐了&#xff0c;有的培训班就是为了赚钱而存在的&#xff0c;想要系统的学习Java&#xff0c;确保学习效果&#xff0c;那么你一定要挑选正规的Java培训班&#xff0c;挑选适合自己的Ja…

typora.io使用教程

引言&#xff1a;对于开发人员大部分都接触过.md文件&#xff0c;而typora.io就是专门编辑.md文件的工具&#xff0c;该工具对于编写接口文档特别方便&#xff0c;它提供了word类似的大纲视图&#xff0c;同时也提供了很多的功能&#xff0c;但是改软件本身却非常的小&#xff…

c#编译时提高兼容性_幻像类型提高了编译时的安全性

c#编译时提高兼容性介绍 使用幻像类型是一种非常简单的技术&#xff0c;可用于提高代码的编译时安全性。 有很多潜在的用例&#xff0c;其复杂性程度各不相同&#xff0c;但是即使幻像类型的轻量级使用也可以显着提高编译时的安全性。 幻像类型只是带有未使用类型参数的参数化类…

如何查看电脑显卡配置_3080显卡电脑配置清单(3700X/10700)

3080显卡昨天就解禁评测了&#xff0c;因为最近的老铁都很期待装3080的机器&#xff0c;我这边做了一些整理&#xff0c;方便各位老铁3080配置有综合的了解。3080显卡售价更加详尽的3080厂家整理可以参考&#xff1a;3080公版哪里买&#xff1f;&#xff08;所有厂家整理&#…