2019.08.12【NOIP提高组】模拟 A 组
解题报告
- 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 组相关推荐
- 2018.12.08【NOIP提高组】模拟B组总结(未完成)
2018.12.08[NOIP提高组]模拟B组总结 diyiti 保留道路 进化序列 B diyiti Description 给定n 根直的木棍,要从中选出6 根木棍,满足:能用这6 根木棍拼出一个 ...
- 2020.08.08【NOIP提高组】模拟:奶牛的图片 总结
2020.08.08[NOIP提高组]模拟:奶牛的图片 总结 Description Farmer John希望给他的 N ( 1 ≤ N ≤ 100 , 000 ) N(1\leq N\leq100 ...
- 【题解】少女觉 (2019.08.12纪中【NOIP提高组】模拟 B 组T1)贪心
题目来源:中山纪念中学 题目描述: 在幽暗的地灵殿中,居住着一位少女,名为古明地觉. 据说,从来没有人敢踏入过那座地灵殿,因为人们恐惧于觉一族拥有的能力--读心. 掌控人心者,可控天下. 咳咳. 人的 ...
- 2019.08.12【NOIP提高组】模拟 B 组 模拟+DP+差分约束、spfa
文章目录 0 少女觉 1 灵知的太阳信仰 2 多段线性函数 3 DY引擎 差分约束系统 我很喜欢你,我会一直喜欢你到你不再需要我喜欢你为止.--顾飞 0 少女觉 在幽暗的地灵殿中,居住着一位少女,名为 ...
- 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 ...
- 2019.8.12 NOIP模拟测试18 反思总结
写个博客总是符合要求的对吧 回来以后第一次悄悄参加考试,昨天全程围观- 然后喜提爆炸120分wwwwwwwww T1用了全机房最慢的写法,导致改掉死循环T掉的一个点以后还是死活过不了最后一个点.T2全 ...
- JZOJ5857 【NOIP提高组模拟A组2018.9.8】没有上司的舞会
题目 Description "那么真的有果尔德施坦因这样一个人?"他问道. "是啊,有这样一个人,他还活着.至于在哪里,我就不知道了." "那么那个 ...
- 【每日早报】2019/08/12
今日看点 ✦ 头条搜索网页版悄然上线,广告语为"搜你想搜的" ✦ 唯品仓更名"唯代购",更精准服务代购群体 ✦ 华为视频发布"百花号":砸亿 ...
- 天梯赛基础题型详解(2019 - 08 - 12)
A.枚举 (1) 详解:用枚举法,从最开始的只有一层沙漏开始枚举,直至找到一个沙漏所用符号的总和小于等于输入的数(将每一次不同层数的沙漏的符号和都用数组储存起来),然后标记那个最大的和.要注意的是每增 ...
最新文章
- linux7内核优化,centos7 系统内核、网络等优化(适用高并发)
- 黄学东出任微软全球人工智能首席技术官,从负责语音技术到微软Azure云的转身
- java之ibatis数据缓存
- 上云上的差点破产是什么体验?
- linux haproxy 脚本,haproxy部署脚本
- C++brent method布伦特方法找extrema极值的算法(附完整源码)
- Python操作Jira提交BUG
- 华为Mate 40 Pro钢化膜上手:6.6寸大曲率瀑布屏 黑边加速消失
- 第 14 章 享元模式
- FFmpeg学习(4)——为视频嵌入字幕
- 李阳疯狂英语900句 121-330
- 倒立摆入门详解+pid调参
- win10电脑360调用不到JAVA,win7/win10系统360浏览器打不开原因及解决方法
- Acrel 2000E/G配电室综合监控系统
- 任务型聊天机器人和闲聊类机器人的关键技术
- 数据库和数据库实例的概念
- 随机出现“No result defined for action ....Action and result input”解决
- 专用计算机有,什么计算机是内嵌在其他设备中的专用计算机
- 关于企业数字化转型的建议
- 蚁群算法求最值c语言实现,蚁群算法代码(求函数最值)