反思:

我考得最炸的一次

怎么说呢?简单的两个题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);
else
woshishabi.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;
else
jb(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");
else
printf("%lld\n%lld\n",dis[mzz[zhongx][zhongy]]-1,way[mzz[zhongx][zhongy]]);
}

NOIP模拟测试19「count·dinner·chess」的更多相关文章

  1. NOIP模拟测试30「return·one·magic」

    magic 题解 首先原式指数肯定会爆$long$ $long$ 首先根据欧拉定理我们可以将原式换成$N^{\sum\limits_{i=1}^{i<=N} [gcd(i,N)==1] C_{G ...

  2. NOIP模拟测试38「金·斯诺·赤」

    金 辗转相减见祖宗 高精 #include<bits/stdc++.h> using namespace std; #define A 2000 #define P 1 #define N ...

  3. NOIP模拟测试28「阴阳·虎·山洞」

    写这几个题解我觉得我就像在按照官方题解抄一样 阴阳 题解 将题目中给的阴阳看作黑色和白色 首先我们观察到最后生成图中某种颜色必须是竖着单调递增或竖着单调递减 类似这样 否则不满足这个条件 但合法染色方 ...

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

    liu_runda出的题再次$\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%$ 任 题解 题目中为什么反复强调简单路径,没有环 没有环的图中点数-边数=联通块数 前缀和维护边 ...

  5. NOIP模拟测试23「mine·water·gcd」

    mine 题解 一道比较水的dp 考试因为初始化挂掉了只有$80$分 代码有注释 #include<bits/stdc++.h> using namespace std; //无脑dp # ...

  6. NOIP模拟测试16「Drink·blue·weed」

    话说这次考试 Drink 非常棒的一道卡常练习题,适合练习卡常 真的很棒 前置卡常知识 1.char要比int快 char是最快的 输出putchar,输入getchar 在这个题快了7000豪 2. ...

  7. NOIP模拟测试9「随·单·题」

    liu_runda出的题,先$\%\%\%\%\%\%\%\%\%\%\%$为敬 随 考试时没有Qj 然后甚至没做,甚至没交 我不知道我怎么想的 这个题挺难改 你需要用到 循环矩阵快速幂,矩阵快速幂优 ...

  8. NOIP模拟测试4「礼物·通讯·奇袭」

    礼物. 首先见到期望一定要想dp,看到n的范围无脑想状压, 然后我就只想到这了. dp方程式还是比较好想的,但是我依然想不出来 略经思考   颓题解 依然不会,随便写了个式子 i状态中不含j $f[i ...

  9. NOIP模拟测试21「折纸&#183;不等式」

    折纸 题解 考试时无限接近正解,然而最终也只是接近而已了 考虑模拟会爆炸,拿手折纸条试一试,很简单 考你动手能力 代码 #include<bits/stdc++.h> using name ...

随机推荐

  1. 【转】浅谈自动特征构造工具Featuretools

    转自https://www.cnblogs.com/dogecheng/p/12659605.html 简介 特征工程在机器学习中具有重要意义,但是通过手动创造特征是一个缓慢且艰巨的过程.Python ...

  2. 阿里面试官用HashMap把我问倒了

    本人是一名大三学生,最近在找暑期实习,其中也面试过两次阿里,一次菜鸟网络部门.一次网商银行部门,当然我都失败了,同时也让我印象很深刻,因此记录了其中一些面试心得,我觉得这个问题很值得分享,因此分享给大 ...

  3. 使用ldap客户端创建zimbra ldap用户的格式

    cat << EOF | ldapadd -x -W -H ldap://:389 -D "uid=zimbra,cn=admins,cn=zimbra" dn: ui ...

  4. [刷题] 437 Paths Sum III

    要求 给出一棵二叉树及一个数字sum,判断这棵二叉树上存在多少条路径,其路径上的所有节点和为sum 路径不一定始于根节点,终止于叶子节点 路径要一直向下 思路 分情况讨论:根节点在路径上(8) / 根 ...

  5. [前端] JSON

    背景 JavaScript对象表示法(JavaScript Object Notation):是一种存储数据的方式 JSON对象 创建 var gareen = {"name":& ...

  6. hive sql的参数调优

    shuffle优化之减少shuffle数据量 1.谓词下推  hive.optimize.ppd ,默认为true. 所谓谓词下推就是过滤条件如果写在shuffle操作后面,就提前过滤掉,减少参与sh ...

  7. 【odoo14】【用户侧】权限配置

    以下内容仅适用于odoo的客户,不适用于开发人员. 下文介绍中涉及的概念及UI均是在odoo14社区版中进行. 目录 一. odoo中的对象 二. 权限控制 2.1 实现原理 2.2 UI方式实现权限 ...

  8. 程序员与年龄:四十岁普通开发、三十五岁首席架构、三十岁基层Leader

    最近,有一个词儿特别热门--躺平.有没有人跟你说过:"躺平说起来容易,做起来更容易." 和躺平相对的是另外一个词--内卷,群聊的时候,已经很多次看过草卷起来了.jpg表情包.某些节 ...

  9. Jmeter- 笔记3 - Jmeter录制功能 / 抓包

    http代理服务器录制脚本: 1.新建线程组 2.添加 http代理服务器 元件 3.http代理服务器修改: 1)端口:8899,任意给个无占用的 2)目标控制器:改成刚刚新建的线程组.不改就录制会 ...

  10. 人体姿态和形状估计的视频推理:CVPR2020论文解析

    人体姿态和形状估计的视频推理:CVPR2020论文解析 VIBE: Video Inference for Human Body Pose and Shape Estimation 论文链接:http ...