前言

今天各种水分,就水到了50分,(dalao太强了)


题目

JZOJ 1494 密码

题目大意:高精度乘法

(题目数据范围:102410241024,实际数据范围102410^{24}1024,一堆WA了)
由于比较水,所以直接贴代码!(压8位)


代码

#include <cstdio>
#include <cctype>
#include <cstring>
using namespace std;
int len,n,x; long long a[301]; char s[27];
int min(int a,int b){return (a<b)?a:b;}
void times(){long long c[302]; memset(c,0,sizeof(c));len=strlen(s+1); long long k[3]={0,0,0}; int g=2;while (len>0){for (int t=1;t<=min(len,8);t++) k[g]=k[g]*10+s[len-min(len,8)+t]-48;       len-=8; g--;}//压8位for (int i=300;i>=1;i--)for (int j=2;j>=0;j--)c[i+j-1]+=a[i]*k[j];//高精乘for (int i=300;i>=1;i--) a[i]=c[i+1]%100000000,c[i]+=c[i+1]/100000000;//把乘积返回第一个数列
}
int main(){scanf("%d\n",&n);gets(s+1); len=strlen(s+1);for (int i=300;len>0;i--){for (int j=min(len-1,7);j>=0;j--)//8位a[i]=a[i]*10+s[len-j]-48;len-=8;}//预先处理第一个串for (int i=1;i<n;i++) gets(s+1),times();int k;for (k=1;k<300&&!a[k];k++);printf("%d",a[k++]);while (k<=300){if (a[k]<10) putchar('0');if (a[k]<100) putchar('0');if (a[k]<1000) putchar('0');if (a[k]<10000) putchar('0');if (a[k]<100000) putchar('0');if (a[k]<1000000) putchar('0');if (a[k]<10000000) putchar('0');printf("%d",a[k++]); }return 0;
}

JZOJ 1495 宝石

PS:又把最难的放在第二题

题目大意

n颗宝石,各在第xix_ixi​行,第yiy_iyi​列,用k*k的矩阵覆盖宝石,求最大覆盖的宝石的总价值。


分析

由于n&lt;=50000n&lt;=50000n<=50000所以前缀和等O(n2n^2n2)算法绝对是不可能的,所以O(nlogn)O(nlogn)O(nlogn)算法才是真正要运用的(m&lt;=50000m&lt;=50000m<=50000(PS:题目大意1≤xi,yi≤m1≤x_i,y_i≤m1≤xi​,yi​≤m),在此可能把mmm说成nnn,在讲完算法后重新注明),可以按照列从小到大排序,可以建立一个区间的上下界,用O(n)扫描宝石(宝石是上界),下界通过宝石不断向上推while(a[i].y−a[t].y&gt;k)t++while (a[i].y-a[t].y&gt;k) t++while(a[i].y−a[t].y>k)t++;iii是当前的宝石(上界),ttt是下界,但是这样做是远远不够的,把列完成了,行可以抽象成一个数轴(画图不好,请见谅)

对于任意一个点x,抽象后x的值可以扩散至x+y(1≤y≤k)x+y(1≤y≤k)x+y(1≤y≤k),那么x到x+k都应该累加x的价值,所以就是寻找公共部分,使公共部分最大,于是线段树就出来了,当然要用懒标记(节约时间),所以最终的算法时间复杂度是O(nlogm)O(nlogm)O(nlogm)PS:下界增加时要处理线段树(取负数)


代码

#include <cstdio>
#include <cctype>
#include <algorithm>
#define us unsigned short
using namespace std;
struct site{us x,y;int w;}a[50001]; int f[200001],lazy[200001],ans; us t,n,m,k;
int in(){int ans=0; char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=ans*10+c-48,c=getchar();return ans;
}
int max(int a,int b){return (a>b)?a:b;}
int min(int a,int b){return (a<b)?a:b;}
void update(int k,int l,int r,int x,int y,int w){if (l==x&&r==y) f[k]+=w,lazy[k]+=w;//找到区间else{if (lazy[k]){//懒标记f[k<<1]+=lazy[k]; f[k<<1|1]+=lazy[k];lazy[k<<1]+=lazy[k]; lazy[k<<1|1]+=lazy[k]; lazy[k]=0; }int mid=(l+r)>>1;if (y<=mid) update(k<<1,l,mid,x,y,w);//区间在左边else if (x>mid) update(k<<1|1,mid+1,r,x,y,w);//区间在右边else update(k<<1,l,mid,x,mid,w),update(k<<1|1,mid+1,r,mid+1,y,w);//区间在中间f[k]=max(f[k<<1],f[k<<1|1]);//计算最大值}
}
bool cmp(site x,site y){return x.y<y.y;}
int main(){m=in(); n=in(); k=in(); t=1;for (int i=1;i<=n;i++) a[i].x=in(),a[i].y=in(),a[i].w=in();stable_sort(a+1,a+1+n,cmp);for (int i=1;i<=n;i++){while (a[i].y-a[t].y>k) update(1,1,m,a[t].x,min(a[t].x+k,m),-a[t].w),t++;//处理下界(取负数)update(1,1,m,a[i].x,min(a[i].x+k,m),a[i].w); ans=max(ans,f[1]);//加入线段树并输出答案}return !printf("%d",ans);
}

JZOJ 1496 页

题目大意

每次移动是将最中间的点放入最前面或最后面,求最少移动的次数(可能无解)


分析

可以用广搜的方法,不断找出新的状态,并用哈希表存储是否重复出现(map库也是可以的),当达到目标状态时统计移动次数即可。


代码

#include <cstdio>
#include <map>
#define p 282881//冒着风险开小点(正常情况是362881(9!=362880))
using namespace std;
int t,ans=2147483647,head,tail; long long h[p],k; short list[p],q[p][10],c,n,mid,a[10];
long long hash(){//求哈希值long long ans=0; for (int i=1;i<=n;i++) ans=(ans<<3)+(ans<<1)+a[i];return ans;
}
int find(long long t){//找哈希表的位置int y=t%p;while (h[y]&&h[y]!=t) y=(++y)%p;return y;
}
void push(long long y,long long t){h[y]=t;tail=tail%p+1;for (int i=1;i<=n;i++) q[tail][i]=a[i];
}
bool check(){for (int i=1;i<n;i++) if (a[i]>a[i+1]) return 0; return 1;}//从小到大排列
void bfs(){k=hash(); t=find(k); push(t,k);//哈希表while (head!=tail){head=head%p+1;//循环队列for (int i=1;i<=n;i++) a[i]=q[head][i]; c=a[mid];//状态从队首开始(下同)for (int i=mid;i>1;i--) a[i]=a[i-1]; a[1]=c;//移到最前面k=hash(); t=find(k);if (h[t]!=k) push(t,k),list[tail]=list[head]+1;//插入新的状态(下同)if (check()) {ans=list[tail]; return;}//找到答案(下同)for (int i=1;i<=n;i++) a[i]=q[head][i]; c=a[mid];for (int i=mid;i<n;i++) a[i]=a[i+1]; a[n]=c;//移到最后面k=hash(); t=find(k);if (h[t]!=k) push(t,k),list[tail]=list[head]+1;if (check()) {ans=list[tail]; return;}}return;
}
int main(){scanf("%d",&n); mid=(n+1)/2;for (int i=1;i<=n;i++) scanf("%d",&a[i]),a[i]-=159;//便于储存bfs();if (ans==2147483647) return !printf("No Answer");else return !printf("%d",ans);
}

JZOJ 1497 景点中心

题目大意:

有一棵树,每个节点有权值,每条边上是距离,找出一个节点,使其它节点到该节点时,∑\sum∑节点权值*到该节点的距离最小。


分析

可以以任意一个节点为根节点,计算答案比较容易
用father表示该节点的上一个节点,td和tp分别表示到该节点的总距离和总人数,d和p是距离和人数

for (int i=ls[x];i;i=e[i].next){if (e[i].y==father[x]) continue;//跑到上一个节点father[e[i].y]=x; td[e[i].y]=e[i].w+td[x];dfs(e[i].y); tp[x]+=tp[e[i].y];}tp[x]+=p[x];

t+=td[i]∗p[i],tt+=td[i]*p[i],tt+=td[i]∗p[i],t就是答案,之后不断移动根,二次扫描换根法,统计最小值比较简单

for (int i=ls[x];i;i=e[i].next){if (e[i].y==father[x]) continue;//跑到上一个节点long long tmp=t; //保留答案t=t-tp[e[i].y]*e[i].w+(tp[1]-tp[e[i].y])*e[i].w;dfs2(e[i].y); t=tmp;//用于下一次深搜}


当把红框内的节点设为根节点变为黄框内的节点设为根节点时,红框的右子树会多走红框与黄框的距离,而黄框的左子树少走这个距离,中间的语句就是这样做的,讲完这些基本上没有什么难度了。


代码

#include <cstdio>
#include <cctype>
#define N 100001
using namespace std;
struct node{int y,w,next;}e[~-(N<<1)];
int d[N],p[N],father[N],k,n,ls[N],ans1,td[N],tp[N]; long long t,ans2=1ll<<62;
int in(){int ans=0; char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=ans*10+c-48,c=getchar();return ans;
}
void add(int x,int y,int w){e[++k]=(node){y,w,ls[x]}; ls[x]=k;}
void dfs(int x){for (int i=ls[x];i;i=e[i].next){if (e[i].y==father[x]) continue;father[e[i].y]=x; td[e[i].y]=1ll*e[i].w+td[x];dfs(e[i].y); tp[x]+=tp[e[i].y];}tp[x]+=1ll*p[x];
}
void dfs2(int x){if (ans2>t) ans2=t,ans1=x;for (int i=ls[x];i;i=e[i].next){if (e[i].y==father[x]) continue;long long tmp=t; t=t-1ll*tp[e[i].y]*e[i].w+1ll*(tp[1]-tp[e[i].y])*e[i].w;dfs2(e[i].y); t=tmp;}
}
int main(){n=in(); for (int i=1;i<=n;i++) p[i]=in();for (int i=1;i<n;i++){int x=in(); int y=in(); int w=in();add(x,y,w); add(y,x,w);}dfs(1);for (int i=1;i<=n;i++) t+=td[i]*p[i];dfs2(1);return !printf("%d\n%lld",ans1,ans2);
}

后续

再接再厉,继续努力!

2018.07.07【2018提高组】模拟C组相关推荐

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

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

  2. 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 ...

  3. 【二分,找规律】Day 14 提高组模拟C组 T1 小麦亩产一千八

    题目大意 给定斐波那契的第aaa项,求出第b" role="presentation">bbb项,默认第0项为1 解题思路 方法一:递推 找到规律后O(b)O(b) ...

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

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

  5. 5814. 【NOIP提高A组模拟2018.8.14】 树(期望 + 倍增)

    5814. [NOIP提高A组模拟2018.8.14] 树 Problem 给定一棵nnn个点的树,m" role="presentation">mmm次询问,每次 ...

  6. JZOJ 5814. 【NOIP提高A组模拟2018.8.14】 树

    梦游中的你来到了一棵 N 个节点的树上. 你一共做了 Q 个梦, 每个梦需要你从点 u 走到点 v 之后才能苏醒, 由于你正在梦游, 所以每到一个节点后,你会在它连出去的边中等概率地选择一条走过去, ...

  7. 2018年俄罗斯世界杯对阵图(法国冠军杯![2018年 07月 12日 星期四 18:15:26 CST])

    A组 排名 球队 赛 胜 和 负 得 失 差 分 出线资格 1  俄罗斯 (H) 1 1 0 0 5 0 +5 3 晋级淘汰赛 2  乌拉圭 1 1 0 0 1 0 +1 3 3  埃及 1 0 0 ...

  8. [原创][更新]我的第二本电子书: 英语长难句-宝典 2018年07月09日

    [简介] 常用网名: 猪头三 出生日期: 1981.XX.XX 个人网站: https://www.x86asm.org QQ交流: 643439947 编程生涯: 2001年~至今[共17年] 职业 ...

  9. 2018 蓝桥杯省赛 B 组模拟赛(一)--封印之门

    题目链接:https://nanti.jisuanke.com/t/A1594 蒜头君被暗黑军团包围在一座岛上,所有通往近卫军团的路都有暗黑军团把手.幸运的是,小岛上有一扇上古之神打造的封印之门,可以 ...

  10. php怎么控制mp3播放器,【更新2018/12/07】简单的MP3播放器

    本帖最后由 kumamiko 于 2018-12-7 11:02 编辑 snipaste_20181113_122405.png (63.66 KB, 下载次数: 0) 2018-11-13 12:3 ...

最新文章

  1. 饿了么交易系统5年演化史
  2. flask和ajax,Flask flash和url_用于AJAX
  3. Java Zip压缩实现(亲测)
  4. Spring Cloud与Duddo比较(非原创)
  5. git 可视化工具_Git的基本使用(二)
  6. java 中hashcode 与 equals的关系
  7. nginx源码分析:打开监听套接字的流程
  8. 蓝桥杯 ALGO-110 算法训练 字符串的展开
  9. 用 js判断 一个数是否是素数(质数)_小学数学知识点1~6年级汇总整理,收藏起来随时用!(下)...
  10. 【ICLR2020】基于模型的强化学习算法玩Atari【附代码】
  11. 通过cacti+nagios监控服务器的运行—nagios nrpe
  12. 电影推荐系统 python简书_电影推荐系统:TMDB 5000 Movie Dataset(一)
  13. Microbiome | 黄海所陈松林院士/华科宁康等-肠道菌群在龙利鱼(半滑舌鳎)抗弧菌病性状形成中的机制...
  14. (转)SonicStage CP 4.3 中文迷你版和完整版下载
  15. 洛谷P1789 【Mc生存】插火把
  16. 基于FFMPEG的封装格式转换器
  17. IP地址和long互转
  18. 交通流优化的一种强化学习方法
  19. 前端js导出Excel库(js-export-excel)在React/Vue中使用参考
  20. beast附加包安装:SNAPP安装出现问题的解决办法

热门文章

  1. vue项目引入新字体
  2. 关于上市公司市值的查询方法
  3. 串口通信和以太网通信100Mbps速度的对比
  4. Python学习,我带着练习题来了,50道基础入门练习题(附答案)
  5. Angular2 兼容 UC浏览器、QQ浏览器、猎豹浏览器
  6. 2021.10.11-2021.10.12股票小计
  7. html编辑转码,4种方法实现Html转码
  8. 展望2022元宇宙会有哪些趋势
  9. 关于Linux开启pathinfo,lnmp开启pathinfo
  10. 你知道Alpha/Beta/RC/RTM/RTW/GA是什么版本吗?