T1

题意:给你一个图,可以不花代价经过 \(K\) 条边,问从起点到终点的最短路

考试的想法:设 \(dis_{i,j}\) 表示从起点免费了 \(j\) 条边到 \(i\) 的最短路

然后直接跑 \(\text{spfa}\)

结果:\(WA\)

正解:分层图,需要考虑去到下一层就不能回来的情况

分为 \(K\) 层,同一层的 \(u,v\) 边权不变,双向边,去下一层的单向边,权值为 0

然后 \(\text{spfa}\) 超时,用 \(\text{dijkstra}\) 即可

答案:免费任意次的最小值

#include<bits/stdc++.h>
using namespace std;
const int N=10005,M=50005;
int n,m,K,S,T,vis[N*12],ans=2100000000;
int lst[N*12],nxt[M<<6],to[M<<6],qz[M<<6],dis[N*12],cnt;
inline void Ae(int fr,int go,int vl) {to[++cnt]=go,qz[cnt]=vl,nxt[cnt]=lst[fr],lst[fr]=cnt;
}
struct node {int v,id;node(int x,int y):v(x),id(y) {}bool operator<(node x) const{ return v>x.v; }
};
priority_queue<node> q;
inline void dijkstra() {memset(dis,100,sizeof(dis));dis[S]=0;q.push(node(0,S));register int u;while(!q.empty()) {u=q.top().id,q.pop();if(vis[u])continue; vis[u]=1;for(int i=lst[u],v;i;i=nxt[i])if(dis[v=to[i]]>dis[u]+qz[i]) {dis[v]=dis[u]+qz[i];q.push(node(dis[v],v));}}
}
int main() {scanf("%d%d%d%d%d",&n,&m,&K,&S,&T);++S,++T;for(int i=1,u,v,w;i<=m;i++) {scanf("%d%d%d",&u,&v,&w);++u,++v,Ae(u,v,w),Ae(v,u,w);for(int j=1;j<=K;j++) {Ae(u+j*n,v+j*n,w);Ae(v+j*n,u+j*n,w);Ae(u+j*n-n,v+j*n,0);Ae(v+j*n-n,u+j*n,0);}}dijkstra();for(int i=0;i<=K;i++)ans=min(ans,dis[T+n*i]);printf("%d",ans);
}

T2

题目大意:给你许多条平行于 \(x\) 轴或 \(y\) 轴的线段

问你最大的十字架大小,大小为 \(R\) 定义为从一个点按上下左右伸出 \(R\) 都有线段覆盖

没有十字架输出 Human intelligence is really terrible

考试时:把所有线段合起来再暴力匹配

结果:看错题了:不会有两条共线线段有交点

正解:可以二分大小 \(R\) ,若把所有线段左右(或上下)都减去 \(R\) 还有线段相交则 \(R\) 成立

所以判断是否有线段相交,用扫描线

T3

题意:找出图中平均值最小的环,无环输出 PaPaFish is laying egg!

考试的想法:二分答案,然后用 \(\text{spfa}\) 一波复杂的操作

正解:把所有边权减去 \(mid\) 若有负环说明 \(mid\) 可以

#include<bits/stdc++.h>
using namespace std;
typedef double db;
const db eps=1e-3;
const int N=1005,M=10005;
int n,m,cnt,lst[N],nxt[M],to[M],vis[N];
db l,r,mid,ans=-1,qz[M],d[N],flg;
inline void Ae(int fr,int go,int vl) {to[++cnt]=go,qz[cnt]=1.0*vl;nxt[cnt]=lst[fr],lst[fr]=cnt;
}
void spfa(int u) {vis[u]=1;for(int i=lst[u],v;i;i=nxt[i])if(d[u]+qz[i]-mid<d[v=to[i]]) {d[v]=d[u]+qz[i]-mid;if(vis[v])flg=1;else spfa(v);if(flg)return;}vis[u]=0;
}
inline bool chk() {memset(d,0,sizeof(d));memset(vis,0,sizeof(vis));flg=0;for(int i=1;i<=n;i++)if(!d[i]) {spfa(i);if(flg)return 1;}return 0;
}
int main() {scanf("%d%d",&n,&m);for(int i=1,u,v,w;i<=m;i++) {scanf("%d%d%d",&u,&v,&w);Ae(u,v,w);}r=10000000;while(l+0.000001<r) {mid=(l+r)/2.0;if(chk())ans=r=mid;else l=mid;}if(ans==-1)puts("PaPaFish is laying egg!");else printf("%.2lf",floor(ans*1000)/1000);
}

T4

题目大意:给你一个排列,求字典序比他大的第一个与他逆序对数一样的排列

考试:直接树状数组+\(\text{next_permutation}\),光荣 30

正解:观察样例可以发现有一段是不变的,考虑找到最大的这个下标

设 \(Nx(i)\) 为 \(a_i,a_{i+1},a_{i+2},\cdots,a_{n}\) 的逆序对个数

则这个点要满足

  1. 后面有个数比他大
  2. 这个数对后面的数的逆序对小于 \(Nx(i)\)

找到后开始构造,设总共有 \(all\) 个逆序对

发现这个点的数是后面中他的后继,于是 \(ans_{p}\) 填好了

然后现在我们已经有(前面一部分逆序对数)+(\(ans_p\)对后面一部分的逆序对数)个逆序对,记为 \(sum\)

填剩下的位置,发现若 (填 \(i\) 产生的逆序对数)+(原有的 \(sum\))+(剩下最大逆序对数)\(\ge all\),则合法

好像可以二分,于是加一个权值线段树查找第 \(k\) 大即可。每次查询要更新 \(sum\)

#include<bits/stdc++.h>
#define G getchar
#define P putchar
using namespace std;
inline int rd() {register int x=0,f=1;char C=getchar();for(;C<'0'||C>'9';C=G())f&=C^45;for(;C>'/'&&C<':';C=G())x=(x<<1)+(x<<3)+(C^48);return f?x:-x;
}
void put(int x) { if(x>9)put(x/10); P(x%10|48); }
typedef long long LL;
const int N=500005;
int n,x[N],pos,mx,y[N],l,r,mid,out;
LL t[N],all,nx[N],val[N<<2],sum;
inline LL MX(LL x) { return x*(x-1)/2; }
inline void add(int p,int v) { for(;p<=n;p+=p&-p)t[p]+=1LL*v; }
inline LL ask(LL p) { register LL s=0; for(;p;p-=p&-p)s+=t[p]; return s; }
#define ls rt<<1
#define rs rt<<1|1
void mdy(int p,int v,int l,int r,int rt) {if(l==r) { val[rt]+=v; return; }register int mid=l+r>>1;if(p<=mid)mdy(p,v,l,mid,ls);else mdy(p,v,mid+1,r,rs);val[rt]=val[ls]+val[rs];
}
int fnd(int k,int l,int r,int rt) {if(l==r)return l;register int mid=l+r>>1;if(k<=val[ls])return fnd(k,l,mid,ls);else return fnd(k-val[ls],mid+1,r,rs);
}
#undef ls
#undef rs
int main() {n=rd();for(int i=1;i<=n;i++)x[i]=rd();for(int i=n;i;i--) {add(x[i],1),nx[i]=ask(x[i]-1);all+=nx[i];}mx=x[n],sum=nx[n];for(int i=n-1;i;i--) {mx=max(mx,x[i]),sum+=nx[i];if(x[i]^mx && nx[i]<sum) {pos=i; break;}}sum=0;for(int i=1;i<pos;i++)put(x[i]),P(32),sum+=nx[i];out=INT_MAX;for(int i=pos+1;i<=n;i++)if(x[i]>x[pos])out=min(out,x[i]);put(out),P(32);for(int i=pos;i<=n;i++)if(x[i]^out)mdy(x[i],1,1,n,1),sum+=(x[i]<out);for(int i=pos+1;i<=n;i++) {l=1,r=n-i+1;while(l<r) {mid=l+r>>1;if(mid-1+sum+MX(n-i)>=all)r=mid;else l=mid+1;}out=fnd(l,1,n,1),put(out),P(32);sum+=l-1,mdy(out,-1,1,n,1);}
}

总结

这些题我该怎么想:

T1:遇到图论不能单纯设状态,最好连边

T2:认真看题+二分的运用+扫描线的题型

T3:遇到环上值的题多想想负环,同时了解图的边权是可以变的

T4:贪心策略一直不强,逆序对的构造要了解,同时多观察样例

总结:最近的题知识点普遍不少,需要好好消化

2021.05.29【NOIP提高B组】模拟 总结相关推荐

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

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

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

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

  3. JZOJ 5820. 【NOIP提高A组模拟2018.8.16】 非法输入

    Description 在算法竞赛中,题目一般保证了输入数据的合法性.然而在工程开发中,我们往往不期望程 序得到的输入都是合法的. D 君正忙着向校内 OJ 添加题目,在写了第 233 个 val.c ...

  4. 5817. 【NOIP提高A组模拟2018.8.15】 抄代码

    Description J 君是机房的红太阳,每次模拟她总是 AK 虐场.然而在 NOIP2117 中,居然出现了另一位 AK 的选手 C 君! 这引起了组委会的怀疑,组委会认为 C 君有抄袭 J 君 ...

  5. 5778. 【NOIP提高A组模拟2018.8.8】没有硝烟的战争

    Description 被污染的灰灰草原上有羊和狼.有N只动物围成一圈,每只动物是羊或狼. 该游戏从其中的一只动物开始,报出[1,K]区间的整数,若上一只动物报出的数是x,下一只动物可以报[x+1,x ...

  6. 2021.8.14【提高B组模拟6】T3 + P7527 [USACO21OPEN] United Cows of Farmer John (树状数组)

    United Cows of Farmer John 题目传送门 解题思路 树状数组乱糊 AC代码 #include<cstdio> #include<cstring> usi ...

  7. 5819. 【NOIP提高A组模拟2018.8.15】 大逃杀

    Description 自从 Y 君退役之后,她就迷上了吃鸡,于是她决定出一道吃鸡的题. Y 君将地图上的所有地点标号为 1 到 n,地图中有 n − 1 条双向道路连接这些点,通过一条 双向道路需要 ...

  8. 【NOIP提高A组模拟】艾比所特

    Description 阿良良木历将要迎来人生(不,是吸血鬼生涯)的第二次战斗--与身为人类和吸血鬼混血儿的艾比所特在直江津高中的操场solo,以取回Heartunderblade的左脚. 艾比所特个 ...

  9. 2021.8.11【提高B组模拟3】T1 积木(乱糊暴搜)(正解:状压dp)

    积木 题目大意 输入样例 3 8 7 6 3 9 4 1 10 5 输出样例 18 题目数据 解题思路 暴搜就没什么好讲的了 原本以为只有40,AC了就离谱 (数据真水) 正文:状压dp 前提:我这个 ...

  10. 2021.8.9【提高B组模拟1】T2 QYQ在艾泽拉斯(Tarjan强连通分量)(并查集)

    QYQ在艾泽拉斯 题目大意 输入样例 3 2 1 2 3 1 1 2 1 0 输出样例 4 样例说明: QYQ从3号点开始,走到2号点,最后走到1号点,结束旅程,共获得1+2+1=4价值的宝物 题目数 ...

最新文章

  1. 使用Git工具生成公钥与私钥
  2. java 访问线程_java线程简介(共享对数据的访问)
  3. Apache james 2.3.2.1启动失败换成2.3.2版本就好
  4. 【Python入门教程】第70篇 创建文本文件
  5. 又一隧道地标,三思点亮万里黄河第一隧
  6. Android 如何反编译apk查看源码
  7. 【C++】2048游戏系列---功能模块第四稿【结束检测】
  8. 新浪微博API错误代码说明对照表
  9. 十年磨一剑,今日把示君:架构师分享从一名码农到如今的成长经验
  10. SQL计算两个日期之间的工作日天数,去除法定节假日和周末
  11. PDF文件怎么插入空白页面
  12. HTML-浮动(float)
  13. MIMIC-III数据库的应用(一)
  14. wps分析工具库如何加载_【数据分析】关键词数据分析如何做?用这个工具比指数好...
  15. 深度有趣 | 16 令人拍案叫绝的WGAN
  16. 以太网和PPPOE网络下MTU和MSS的关系
  17. ubuntu18.04/centos7.9-Redis-Zabbix相关操作
  18. stm32 移植java_把Lua移植到stm32上,效果不错! (amoBBS 阿莫电子论坛)
  19. 【寻东】source insight4.0模仿sublime text的配色方案
  20. 某地法院HP EVA8400删除VDISK后数据恢复成功

热门文章

  1. 2019年BET公司面试题目大汇总
  2. C++新手,用OOP思想编写的推箱子小游戏,请多赐教
  3. MATLAB有限元二维编程(三角单元)
  4. 第一台计算机英语怎么说,世界第一台计算机英文缩写名为
  5. 基于阿里云的安全组介绍
  6. go kafka 配置SASL认证及实现SASL PLAIN认证功能
  7. FS00702型酒精传感器
  8. CMD 禁用 笔记本自带的键盘
  9. 2021-07-22
  10. 冰雪之冠上的明珠与东方明珠 辉映在黄浦江两岸