NOIP模拟测试14「旋转子段·走格子·柱状图」

旋转子段

连60分都没想,考试一直肝t3,t2,没想到t1最简单

我一直以为t1很难,看了题解发现也就那样

题解

性质1

一个包含a[i]旋转区间值域范围最多为min(a[i],i)----max(a[i],i)

感性理解

举个例子,例如3 7 1 4 5 6 2

这个子段包含a[2]的最大为值域范围2----7

具体证明我不会

性质2

翻转后满足固定点对的点满足

a[i]+i==a[j]+j

证明

因为翻转之前a[i]==j&&a[j]==i才满足翻转之后都构成点对

移项得到a[i]+i==a[j]+j

有了这两条性质我们可以得到一个$n^2$算法

for(ll i=1;i<=n;i++){tot=0;for(ll j=min(i,a[i]);j<=max(i,a[i]);j++)if(a[j]+j==a[i]+i)tot++;
}

得到tot最大值输出即可

70分代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define A 1010101
ll f[A],a[A],sum[A];
ll n,ans=-1,tot=0;
vector<ll>too[501010];
int main(){scanf("%lld",&n);for(ll i=1;i<=n;i++){scanf("%lld",&a[i]);sum[i]=sum[i-1];if(a[i]==i) sum[i]++;}for(ll i=1;i<=n;i++){tot=0;for(ll j=min(i,a[i]);j<=max(i,a[i]);j++){if(a[j]+j==a[i]+i){tot++;}}
//        printf("n=%lld max=%lld min=%lld i=%lld tot=%lld\n",n,max(i,a[i]),min(i,a[i]),i,tot);ans=max(tot+sum[n]-sum[max(i,a[i])]+sum[min(i,a[i])-1],ans);}printf("%lld\n",ans);
}
View Code

100分

莫队维护一下询问,需要卡常,卡常到自闭,fh卡常大师

分块0.53最优

#include<bits/stdc++.h>
using namespace std;
#define ll int
const int A=1010101,L=1<<20|1;
#define getchar() ((S==T&&(T=(S=buf)+fread(buf,1,L,stdin),S==T))?EOF:*S++)
ll f[A],a[A],sum[A],tong[A],belong[A];
ll n,ans=-1,l=1,r=0,ou=0,block;
char buf[L],*S,*T;
struct moo{ll zhong,r,l,a;friend bool operator < (moo a,moo b){return ((belong[a.l]^belong[b.l]))?a.l<b.l:((belong[a.l]&1)?a.r<b.r:a.r>b.r);}
}mo[A];
inline ll read(){ll x=0;char c=getchar();while(!isdigit(c))c=getchar();while(isdigit(c))x=(x<<1)+(x<<3)+(c^48),c=getchar();return x;
}
int main(){n=read();block=pow(n,0.53);for(register ll i=1;i<=n;i++){a[i]=read();sum[i]=sum[i-1];if(!(a[i]^i)) sum[i]++;belong[i]=(i-1)/block+1;}for(register ll i=1;i<=n;i++){mo[i].zhong=i;mo[i].r=max(i,a[i]);mo[i].l=min(i,a[i]);mo[i].a=a[i];}sort(mo+1,mo+n+1);for(register ll i=1;i<=n;i++){while(l>mo[i].l) tong[l-1+a[l-1]]++,l--;while(l<mo[i].l) tong[l+a[l]]--,l++;while(r>mo[i].r) tong[r+a[r]]--,r--;while(r<mo[i].r) tong[r+1+a[r+1]]++,r++;ans=max(tong[mo[i].zhong+mo[i].a]+sum[n]-sum[mo[i].r]+sum[mo[i].l-1],ans);}printf("%d",ans);
}
View Code

走格子

显然贪心有门走门不对一个稍简单的数据就可以卡掉你

7 8
########
##.F#..#
#...C..#
##..#..#
##.....#
#..#...#
########

那怎么办,只能走八个方向爆搜吗?

显然可以最短路!

从每个墙开始搜直接得到每个点到墙最短距离,然后每两相邻点之间建边,点墙之间建边

例如               (墙)

       |

      50

            |

(墙)-----21------Q-------------500000000-------(墙)

      |

      |

      600

      |

      (墙)

我们只需要将Q与四个墙方向边权都设置为21即可.(例如可以在2打传送门  然后在4打传送门从2传送到4,那么所有最小代价都为21)

很简单对不对,直接跑最短路就行了

保证最短路会松弛掉一些不可行解

例如

      (墙)

        |

       50

     (墙)|

(墙)------21--Q-------500000--(墙)

      |

      50

      |

     (终点)

向上走一步再打传送门会松弛掉21这条边

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define A 5010101
#define py printf("toot\n")
#define fr first
#define se second
#define mp(x,y) make_pair(x,y)
ll zh[610][610],top[610][610],low[610][610],zuo[610][610],you[610][610],bs[610][610],head[A],nxt[A],ver[A],edg[A],dis[A];
const ll nowx[5]={0,0,0,1,-1};
const ll nowy[5]={0,1,-1,0,0};
bool vis[A];
ll n,m,zhongx,zhongy,qix,qiy,ttt=0,tot=0;
deque<pair<ll,ll> >q,toot;
char s[610][610];
ll id(ll i,ll j){return (i-1)*m+j;
}
void add(ll x,ll y,ll z){nxt[++tot]=head[x],head[x]=tot,ver[tot]=y,edg[tot]=z;return ;
}
void ins(ll x,ll y,ll d){if(!bs[x][y]&&s[x][y]=='.'){bs[x][y]=d;q.push_back(mp(x,y));}
}
void bfs(){while(!q.empty()){ll kx=q.front().fr,ky=q.front().se;q.pop_front();
//        py;for(ll i=1;i<=4;i++){ins(kx+nowx[i],ky+nowy[i],bs[kx][ky]+1);}}
}
void init(){for(ll i=1;i<=n;i++)for(ll j=1;j<=m;j++){if(s[i][j]=='#') continue;if(s[i][j-1]=='#') zuo[i][j]=id(i,j);else zuo[i][j]=zuo[i][j-1];if(s[i-1][j]=='#') top[i][j]=id(i,j);else top[i][j]=top[i-1][j];}for(ll i=n;i>=1;i--)for(ll j=m;j>=1;j--){if(s[i][j]=='#') continue;if(s[i][j+1]=='#') you[i][j]=id(i,j);else you[i][j]=you[i][j+1];if(s[i+1][j]=='#') low[i][j]=id(i,j);else low[i][j]=low[i+1][j];}
}
void addb(){for(ll i=1;i<=n;i++)for(ll j=1;j<=m;j++){if(s[i][j]=='#') continue;ll d=id(i,j);if(s[i+1][j]=='.') add(d,id(i+1,j),1),add(id(i+1,j),d,1);if(s[i][j+1]=='.') add(d,id(i,j+1),1),add(id(i,j+1),d,1);if(zuo[i][j]!=d)add(d,zuo[i][j],bs[i][j]);if(you[i][j]!=d)add(d,you[i][j],bs[i][j]);if(top[i][j]!=d)add(d,top[i][j],bs[i][j]);if(low[i][j]!=d)add(d,low[i][j],bs[i][j]);}
}
void spfa(ll o){vis[o]=1;memset(dis,0x7f,sizeof(dis));dis[o]=0;deque<ll> toot;toot.push_back(o);while(!toot.empty()){ll x=toot.front();toot.pop_front();for(ll i=head[x];i;i=nxt[i]){ll y=ver[i];if(dis[y]>dis[x]+edg[i]){dis[y]=dis[x]+edg[i];if(!vis[y]){vis[y]=1;toot.push_back(y);}}}vis[x]=0;}
}
int main(){scanf("%lld%lld",&n,&m);for(ll i=1;i<=n;i++){scanf("%s",s[i]+1);for(ll j=1;j<=m;j++){if(s[i][j]=='#'){q.push_back(mp(i,j));}else if(s[i][j]=='C'){s[i][j]='.';qix=i;qiy=j;}if(s[i][j]=='F'){s[i][j]='.';zhongx=i;zhongy=j;}}}bfs(),init(),addb(),spfa(id(qix,qiy));if(dis[id(zhongx,zhongy)]>=1202134)printf("no\n");else printf("%lld\n",dis[id(zhongx,zhongy)]);
}
View Code

 柱状图

模拟退火板子题,非常板子

模拟退火最吼了

即使是板子我也要说说

首先关于

    nth_element(s+1,s+mid,s+n+1);

为什么要求出中位数,

前置知识

坐标轴上有很多点,点与点之间有一个距离,你将所有点移到同一个点最小花费

显然是移到中位数的点

那么应用到这个题呢?

你可以将题目要求转化,首先全部移到同一水平线上,然后再加出值

比它高的降低,比它矮的升高,换成坐标轴我们就用到了中位数

然后

if(tmpans<nowans||exp(-D/T)*RAND_MAX>rand())

为什么是

exp(-D/T)*RAND_MAX>rand()

不是

exp(D/T)*RAND_MAX>rand()

问的好啊!

首先我们如果当前解优那么你会通过tmpans<nowans跳过

然后如果当前解不优D一定是负的,如果D为负的那么D越小-D越大.D小代表当前解非常差,让它变成其他解概率更大

 

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define A 1010101
const double eps=1e-5;
const double delta=0.98;
const double fj=1;
ll n,ans=0x7ffffffffffffff;
ll s[A],h[A];
ll check(ll pos){for(ll j=1;j<=n;j++)s[j]=h[j]+abs(pos-j);ll mid=n+1>>1;nth_element(s+1,s+mid,s+n+1);ll val=s[mid];ll tot=0;if(val<max(pos,n-pos+1))val=max(pos,n-pos+1);for(ll i=1;i<=n;i++)tot+=abs(s[i]-val);return tot;
}
int main(){srand(time(0));scanf("%lld",&n);for(ll i=1;i<=n;i++){scanf("%lld",&h[i]);}double T=1000;ll now=(n+1)>>1;ll nowans=check(now);while(T>eps){ll tmp=now+(2ll*rand()-RAND_MAX)*T*0.000001;tmp=(tmp%n+n-1)%n+1;ll tmpans=check(tmp),D=tmpans-nowans;if(tmpans<nowans||exp(-D/T)*RAND_MAX>rand())nowans=tmpans,now=tmp;if(tmpans<ans) ans=tmpans;T*=delta;}printf("%lld\n",ans);
}
View Code

 

转载于:https://www.cnblogs.com/znsbc-13/p/11319578.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349760.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

检测域名是否到期

如果你想做一个网站&#xff0c;首先需要购买一个域名&#xff0c;与其说是购买不如说是租用&#xff0c;因为你要想使用这个域名&#xff0c;每年都需要缴纳一笔费用。既然是租用&#xff0c;所以就有期限&#xff0c;在到期前没有续费&#xff0c;则该域名会被收回&#xff0…

jax-ws cxf_走向REST:在Spring和JAX-RS(Apache CXF)中嵌入Jetty

jax-ws cxf对于服务器核心Java开发人员来说&#xff0c;向世界“展示”的唯一方法是使用API​​。 今天的帖子都是关于JAX-RS的 &#xff1a;使用Java编写和公开RESTful服务。 但是&#xff0c;我们不会使用涉及应用程序服务器&#xff0c;WAR打包以及诸如此类的传统的重量级方…

问题 1046: [编程入门]自定义函数之数字后移

题目描述有n个整数&#xff0c;使前面各数顺序向后移m个位置&#xff0c;最后m个数变成前面m个数。写一函数&#xff1a;实现以上功能&#xff0c;在主函数中输入n个数和输出调整后的n个数。输入输入数据的个数n n个整数 移动的位置m输出移动后的n个数样例输入10 1 2 3 4 5 6 7…

Reliable Multicast Programming(PGM)协议

Reliable Multicast Programming (PGM)实际通用可靠多播协议&#xff0c;在某种程度上保证多播的可靠性。是IP上层协议&#xff0c;和TCP还有UDP同级&#xff0c;工作在传输层。 在组播传输视频项目中&#xff0c;发现在网络较差的时候&#xff0c;组播传输视频性能下降迅猛&am…

P1488 肥猫的游戏

P1488 肥猫的游戏https://www.luogu.org/problem/P1488 博弈论一个三角形&#xff0c;只有三种情况&#xff1a;1邻接&#xff0c;2邻接&#xff0c;3邻接主要是2邻接的情况比较麻烦边<0,n-1>需要特判一下 #include <iostream> #include <cstdio> #include &…

使用OAuth2令牌的安全REST服务

1.简介 在本教程中&#xff0c;我们将介绍如何将Spring Security与OAuth结合使用以保护REST服务。 在演示应用程序中&#xff0c;可以使用路径模式&#xff08; / api / ** &#xff09;访问服务器上受保护的REST资源&#xff0c;以便基于该路径的请求URL映射到不同的控制器方法…

java 内联调用深度_Java中内联虚拟方法调用的性能

java 内联调用深度总览 动态编译的好处之一是它能够支持在虚拟方法代码上的广泛方法内联。 内联代码可提高性能时&#xff0c;代码仍必须检查类型&#xff08;以防由于优化而更改了类型&#xff09;或在多个可能的实现之间进行选择。 这导致了问题。 通过接口调用的方法的多个…

组件切换方式(Vue.js)

这里&#xff0c;我用一个注册登录两组件的切换实例来演示&#xff1a; 切换方式一 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8" /><title>独秀不爱秀</title> </head><body><div …

在GWT中序列化/反序列化Json

JSON和GWT 最近&#xff0c; GWT用户小组中进行了有趣的讨论 &#xff0c;涉及在客户端对JSON进行序列化/反序列化的最佳实践。 这篇文章旨在突出其重点。 到目前为止&#xff0c;在GWT中有三种将对象转换为JSON并从客户端转换回JSON的方法&#xff1a; gwt-jackson框架&#…

NOIP模拟测试15「建造城市city(插板法)·轰炸·石头剪刀布」

建造城市 题解 先思考一个简单问题 10个$toot$ 放进5间房屋&#xff0c;每个房屋至少有1个$toot$&#xff0c;方案数 思考&#xff1a;插板法&#xff0c;$10$个$toot$有$9$个缝隙&#xff0c;$5$间房屋转化为$4$个挡板&#xff0c;放在toot缝隙之间得到$C_{9}^{4}$ 10个$toot$…

弹簧和线程:TaskExecutor

在Web应用程序中使用线程并不常见&#xff0c;尤其是当您必须开发长期运行的任务时。 考虑到spring&#xff0c;我们必须格外注意并使用它已经提供的工具&#xff0c;而不是生成我们自己的线程。 我们希望线程由spring管理&#xff0c;因此能够在不产生任何影响的情况下使用应…

数位dp从会打模板到不会打模板

打了几个数位$dp$&#xff0c;发现自己除了会打模板之外没有任何长进&#xff0c;遇到非模板题依然什么都不会 那么接下来这篇文章将介绍如何打模板&#xff08;滑稽&#xff09; 假设我们要处理$l----r$ 采用记忆化搜索的方式&#xff0c;枚举$<r$每一种情况&#xff0c;枚…

javafx简单吗_JavaFX即将推出您附近的Android或iOS设备吗?

javafx简单吗已经有大新闻最近在世界上的JavaFX的关于JavaFX的是许多更多的组件开源&#xff0c;开源的广告在2012 JavaOne大会 。 在2月的开放源代码更新中 &#xff0c; Richard Bair编写了一份JavaFX项目表&#xff0c;该表在撰写本文时&#xff08;2013年2月11日&#xff0…

【webrtc】webrtc的rtp重传代码分析

pgm不太能用&#xff0c;没有想象中的可靠&#xff0c;重传机制貌似仍然使用组播重传&#xff0c;丢包率80%的网络感觉没啥改进&#xff0c;如果有所好转延迟估计也是个不小的问题。 后听说rtp也有nack机制&#xff0c;webrtc基于rtp实现了重传在一定程度上保证可靠性。 在各路…

了解java.nio.file.Path – 1

介绍 Java的最后几个发行版本&#xff0c;即Java 7&#xff0c;Java 8和即将到来的Java 9&#xff0c;具有许多功能&#xff0c;这些功能使Java开发人员的生活更加轻松。 &#xff08;我知道Java 9会使它变得更困难&#xff0c;但是只有在您采用新的范例时才可以。之后&#xf…

socket-01

对于所有的Web应用&#xff0c;本质上其实就是一个socket服务端&#xff0c;用户的浏览器其实就是一个socket客户端 转载于:https://www.cnblogs.com/yanhuaqiang/p/11329925.html

ActionScript3学习笔记2-包

在 ActionScript 3.0 中&#xff0c;包是用命名空间实现的&#xff0c;但包和命名空间并不同义。在声明包时&#xff0c; 可以隐式创建一个特殊类型的命名空间并保证它在编译时是已知的。显式创建的命名空间在 编译时不必是已知的。 下面的示例使用 package 指令来创建一个包含…

grep v grep_使用grep4j轻松测试分布式组件上的SLA

grep v grep因此&#xff0c;您的分布式体系结构如下图所示&#xff0c;您刚刚从企业那里收到了一项要求&#xff0c;以确保生产者发送并随后传输到下游系统&#xff08;消费者&#xff09;的消息的SLA必须快且永远不会慢于此。 400毫秒。 要求说&#xff1a; 从生产者发送到…

得到指定进程所有窗口。显示 影藏 置顶。

这里使用一个外挂程序测试&#xff0c;因为外挂程序没有做功能限制的处理 只是做了 窗口影藏。 全局变量 HWND hwnd[100]{0};int number0;DWORD Tpid0; 局部变量 char username[1028]; 先找到进程ID 1 HWND SelectPor() 2 { 3 bool isYesfalse; 4 string porcessName&q…

jquery部分方法

offset([coordinates]) 概述&#xff1a;获取匹配元素在当前视口的相对偏移。返回的对象包含两个整型属性&#xff1a;top 和 left。此方法只对可见元素有效。 比如&#xff0c;获取第二段的偏移&#xff1a; HTML 代码: <p>Hello</p><p>2nd Paragraph</p…