解题报告

  • JZOJ 6293 迷宫
    • 题目
    • 分析
    • 代码
  • JZOJ 6297 猛汉王
    • 题目
    • 分析
    • 代码
  • JZOJ 6299 工厂
    • 题目
    • 分析
    • 代码

JZOJ 6293 迷宫

题目


分析

因为其没有后效性
动态dp,用线段树维护区间的最短路径,线段树维护一个dp方程,也就是该列的某行到某行的最短路径,那么区间判断最小值,注意特判


代码

#include <cstdio>
#include <cctype>
#include <cstring>
#define rr register
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int N=200101; bool a[5][N],flag; int n,m,q;
struct maix{int p[5][5];}A[N<<2],ANS;
inline signed iut(){rr int ans=0; rr char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return ans;
}
inline maix mul(maix A,maix B){rr maix C;memset(C.p,42,sizeof(C.p));for (rr int i=0;i<n;++i)for (rr int j=0;j<n;++j)for (rr int k=0;k<n;++k)C.p[i][j]=min(C.p[i][j],A.p[i][k]+B.p[k][j]);return C;
}
inline void upd(int k,int now){memset(A[k].p,42,sizeof(A[k].p));for (rr int i=0;i<n;++i){if (!a[i][now]) continue;rr bool upw=0,dow=0;for (rr int j=0;j<n;++j){if (i+j>=n||!a[i+j][now]) upw=1;if (i<j||!a[i-j][now]) dow=1;if (upw&&dow) break;if (!upw) A[k].p[i+j][i]=j+1;if (!dow) A[k].p[i-j][i]=j+1;}}
}
inline void build(int k,int l,int r){if (l==r){upd(k,l); return;}rr int mid=(l+r)>>1;build(k<<1,l,mid),build(k<<1|1,mid+1,r);A[k]=mul(A[k<<1],A[k<<1|1]);
}
inline void query(int k,int l,int r,int x,int y){if (l==x&&r==y){if (!flag) ANS=A[k],flag=1;else ANS=mul(ANS,A[k]);return;}rr int mid=(l+r)>>1;if (y<=mid) query(k<<1,l,mid,x,y);else if (x>mid) query(k<<1|1,mid+1,r,x,y);else query(k<<1,l,mid,x,mid),query(k<<1|1,mid+1,r,mid+1,y);
}
inline void update(int k,int l,int r,int x){if (l==r){upd(k,l); return;}rr int mid=(l+r)>>1;if (x<=mid) update(k<<1,l,mid,x);else update(k<<1|1,mid+1,r,x);A[k]=mul(A[k<<1],A[k<<1|1]);
}
signed main(){freopen("maze.in","r",stdin);freopen("maze.out","w",stdout);n=iut(); m=iut(); q=iut();for (rr int i=0;i<n;++i)for (rr int j=1;j<=m;++j) a[i][j]=iut();build(1,1,m);while (q--){rr int opt=iut(),l=iut()-1,r=iut();if (opt&1) a[l][r]^=1,update(1,1,m,r);else{rr int x=iut()-1,y=iut(),ans=2147483647; flag=0;if (y<r){printf("-1\n"); continue;}if (y==r){if (x>l) x^=l,l^=x,x^=l;for (rr int i=x;i<=l;++i)if (!a[i][r]) flag=1;printf("%d\n",flag?-1:l-x);continue;}query(1,1,m,r,y-1);rr bool upw=0,dow=0;for (rr int i=0;i<n;++i){if (x+i>=n||!a[x+i][y]) upw=1;if (x<i||!a[x-i][y]) dow=1;if (upw&&dow) break;if (!upw) ans=min(ans,ANS.p[l][x+i]+i);if (!dow) ans=min(ans,ANS.p[l][x-i]+i);}printf("%d\n",ans>n*m?-1:ans);}}return 0;
}

JZOJ 6297 猛汉王

题目


分析


代码

#include <cstdio>
#include <cctype>
#include <algorithm>
#include <cstring>
#define rr register
using namespace std;
struct rec{int bel,rk; long long x; int l,r;}p[300001];
struct lin{long long x,y;}a[100001],b[100001]; long long t[300001];
int n,m,d,c[300001],k,ansx[100001],ansy[100001]; long long ans1,ans2;
inline signed iut(){rr int ans=0; rr char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return ans;
}
bool cmp(rec a,rec b){return a.x!=b.x?a.x<b.x:b.bel!=0;}
inline void add(int x){for (;x<=k;x+=-x&x) ++c[x];}
inline signed query(int x){rr int ans=0; for (;x;x-=-x&x) ans+=c[x]; return ans;}
inline void pro(){memset(c,0,sizeof(c));k=0;for (rr int i=1;i<=m;++i) t[i]=b[i].y;for (rr int i=1;i<=n;++i) t[m+i]=a[i].y-d,t[n+m+i]=a[i].y+d;sort(t+1,t+1+n+n+m),k=unique(t+1,t+1+n+n+m)-t-1;for (rr int i=1;i<=m;++i)p[i]=(rec){0,0,b[i].x,lower_bound(t+1,t+1+k,b[i].y)-t,0};for (rr int i=1;i<=n;++i){rr int t1=lower_bound(t+1,t+1+k,a[i].y-d)-t,t2=lower_bound(t+1,t+1+k,a[i].y+d)-t;p[i+m]=(rec){-1,i,a[i].x-d-1,t1,t2},p[i+m+n]=(rec){1,i,a[i].x+d,t1,t2};}sort(p+1,p+1+n+n+m,cmp);for (rr int i=1;i<=n+n+m;++i)if (!p[i].bel) add(p[i].l);else ansx[p[i].rk]+=p[i].bel*(query(p[i].r)-query(p[i].l-1));
}
signed main(){freopen("mhw.in","r",stdin);freopen("mhw.out","w",stdout); n=iut(); m=iut(); d=iut();for (rr int i=1;i<=n;++i){rr int x=iut(),y=iut();a[i]=(lin){x+y,x-y};}for (rr int i=1;i<=m;++i){rr int x=iut(),y=iut();b[i]=(lin){x+y,x-y};}pro(),swap(a,b),swap(n,m),swap(ansx,ansy),pro(),sort(ansx+1,ansx+1+n),sort(ansy+1,ansy+1+m);for (rr int i=1;i<=n;++i)ans1+=1ll*ansx[i]*(n-i),ans1-=1ll*ansx[i]*(ansx[i]-1)>>1,ans2+=1ll*ansx[i]*(i-1),ans2-=1ll*ansx[i]*(ansx[i]-1)>>1;for (rr int i=1;i<=m;++i)ans1+=1ll*ansy[i]*(m-i),ans1-=1ll*ansy[i]*(ansy[i]-1)>>1,ans2+=1ll*ansy[i]*(i-1),ans2-=1ll*ansy[i]*(ansy[i]-1)>>1;return !printf("%lld %lld\n",ans1,ans2);
}

JZOJ 6299 工厂

题目


分析


代码

#include <cstdio>
#include <cstring>
#define rr register
#define sqr(x) ((x)*(x))
using namespace std;
struct rec{int x,y,w;}a[31];
bool mp[31][31],v1[31],v2[31];
int sum[31][31],n,tot,f[200001][31],c[31],g[31];
inline void dfs(int now,int opt){if (opt&1){++a[tot].x;for (rr int i=1;i<=n;++i)if (mp[now][i]&&!v2[i])v2[i]=1,dfs(i,2);}else{++a[tot].y;for (rr int i=1;i<=n;++i)if (mp[i][now]&&!v1[i])v1[i]=1,dfs(i,1);}
}
signed main(){freopen("factory.in","r",stdin);freopen("factory.out","w",stdout); scanf("%d",&n); for (rr int i=1;i<=n;++i)for (rr int j=1;j<=n;++j){rr char c=getchar();while (c!=48&&c!=49) c=getchar();mp[i][j]=c^48;}for (rr int i=1;i<=n;++i)if (!v1[i]) ++tot,v1[i]=1,dfs(i,1);for (rr int i=1;i<=n;++i)if (!v2[i]) ++tot,v2[i]=1,dfs(i,2);//计算连通块for (rr int i=1;i<=tot;++i)++sum[a[i].x][a[i].y];//那么显然会有这么多种情况tot=0;for (rr int i=0;i<=n;++i)for (rr int j=0;j<=n;++j)if (sum[i][j]) a[++tot]=(rec){i,j,sum[i][j]};g[0]=1; memset(f,42,sizeof(f)),f[0][0]=0;for(rr int i=1;i<=tot;++i)g[i]=g[i-1]*(a[i].w+1);//本质状态很少,可以这样优化转移状态for (rr int i=0;i<g[tot];++i){rr int t=i,tx=0,ty=0;for (rr int j=tot;j;--j){c[j]=0;while (t>=g[j-1])++c[j],t-=g[j-1],tx+=a[j].x,ty+=a[j].y;//计算其表示的状态}for (rr int j=0;j<=n;++j) if (f[i][j]!=707406378)for (rr int k=1;k<=tot;++k) if (c[k]<a[k].w){if (f[i+g[k-1]][j+a[k].x]>f[i][j]) f[i+g[k-1]][j+a[k].x]=f[i][j];if (tx+a[k].x==ty+a[k].y&&f[i+g[k-1]][0]>f[i][j]+sqr(j+a[k].x))f[i+g[k-1]][0]=f[i][j]+sqr(j+a[k].x);//dp方程}}rr int ans=0;for (rr int i=1;i<=n;++i)for (rr int j=1;j<=n;++j) ans-=mp[i][j];//也就是用dp的答案减去工人已经学会的技能的总和printf("%d",ans+f[g[tot]-1][0]);return 0;
}

2019.08.12【NOIP提高组】模拟 A 组相关推荐

  1. 2018.12.08【NOIP提高组】模拟B组总结(未完成)

    2018.12.08[NOIP提高组]模拟B组总结 diyiti 保留道路 进化序列 B diyiti Description 给定n 根直的木棍,要从中选出6 根木棍,满足:能用这6 根木棍拼出一个 ...

  2. 2020.08.08【NOIP提高组】模拟:奶牛的图片 总结

    2020.08.08[NOIP提高组]模拟:奶牛的图片 总结 Description Farmer John希望给他的 N ( 1 ≤ N ≤ 100 , 000 ) N(1\leq N\leq100 ...

  3. 【题解】少女觉 (2019.08.12纪中【NOIP提高组】模拟 B 组T1)贪心

    题目来源:中山纪念中学 题目描述: 在幽暗的地灵殿中,居住着一位少女,名为古明地觉. 据说,从来没有人敢踏入过那座地灵殿,因为人们恐惧于觉一族拥有的能力--读心. 掌控人心者,可控天下. 咳咳. 人的 ...

  4. 2019.08.12【NOIP提高组】模拟 B 组 模拟+DP+差分约束、spfa

    文章目录 0 少女觉 1 灵知的太阳信仰 2 多段线性函数 3 DY引擎 差分约束系统 我很喜欢你,我会一直喜欢你到你不再需要我喜欢你为止.--顾飞 0 少女觉 在幽暗的地灵殿中,居住着一位少女,名为 ...

  5. JZOJ 5281. 【NOIP提高组模拟A组8.15】钦点

    Description Input Output Sample Input 4 4 2 a a b b a a b b c c d d c c d d 1 1 3 3 2 2 3 1 1 3 2 2 ...

  6. 2019.8.12 NOIP模拟测试18 反思总结

    写个博客总是符合要求的对吧 回来以后第一次悄悄参加考试,昨天全程围观- 然后喜提爆炸120分wwwwwwwww T1用了全机房最慢的写法,导致改掉死循环T掉的一个点以后还是死活过不了最后一个点.T2全 ...

  7. JZOJ5857 【NOIP提高组模拟A组2018.9.8】没有上司的舞会

    题目 Description "那么真的有果尔德施坦因这样一个人?"他问道. "是啊,有这样一个人,他还活着.至于在哪里,我就不知道了." "那么那个 ...

  8. 【每日早报】2019/08/12

    今日看点 ✦ 头条搜索网页版悄然上线,广告语为"搜你想搜的" ✦ 唯品仓更名"唯代购",更精准服务代购群体 ✦ 华为视频发布"百花号":砸亿 ...

  9. 天梯赛基础题型详解(2019 - 08 - 12)

    A.枚举 (1) 详解:用枚举法,从最开始的只有一层沙漏开始枚举,直至找到一个沙漏所用符号的总和小于等于输入的数(将每一次不同层数的沙漏的符号和都用数组储存起来),然后标记那个最大的和.要注意的是每增 ...

最新文章

  1. linux7内核优化,centos7 系统内核、网络等优化(适用高并发)
  2. 黄学东出任微软全球人工智能首席技术官,从负责语音技术到微软Azure云的转身
  3. java之ibatis数据缓存
  4. 上云上的差点破产是什么体验?
  5. linux haproxy 脚本,haproxy部署脚本
  6. C++brent method布伦特方法找extrema极值的算法(附完整源码)
  7. Python操作Jira提交BUG
  8. 华为Mate 40 Pro钢化膜上手:6.6寸大曲率瀑布屏 黑边加速消失
  9. 第 14 章 享元模式
  10. FFmpeg学习(4)——为视频嵌入字幕
  11. 李阳疯狂英语900句 121-330
  12. 倒立摆入门详解+pid调参
  13. win10电脑360调用不到JAVA,win7/win10系统360浏览器打不开原因及解决方法
  14. Acrel 2000E/G配电室综合监控系统
  15. 任务型聊天机器人和闲聊类机器人的关键技术
  16. 数据库和数据库实例的概念
  17. 随机出现“No result defined for action ....Action and result input”解决
  18. 专用计算机有,什么计算机是内嵌在其他设备中的专用计算机
  19. 关于企业数字化转型的建议
  20. 蚁群算法求最值c语言实现,蚁群算法代码(求函数最值)

热门文章

  1. IT去中心化背后的低代码平台
  2. 互联网医疗十大公司排名
  3. U盘蠕虫病毒解决办法
  4. flutter之路由管理
  5. 微信二次开发sdk非ipad/android协议(很好用)
  6. vue 中v-model原理及应用
  7. 飞飞影视php 漏洞,飞飞影视SQL injection exploit[转]
  8. android远程打电话,Android打电话功能 Android实战教程第三篇之简单实现拨打电话功能...
  9. 海尔电商峰值系统架构设计最佳实践
  10. 编写PC操作系统的参考资料(不断更新)