HGOI20181030 模拟题解

problem:给定一个序列,问你能不能通过一次交换把他弄成有序
sol:
对于0%的数据,满足数列是一个排列,然后我就打了这档分(自己瞎造的!)
对于100%的数据,显然我们先对数列进行排序然后上下匹配即可,如果数相同位置,数的大小不同有0个或2个就行否则不行
还是要仔细啊啊啊啊啊啊!


problem:给出一个图然后问你在某个地方到染料,被染的面积是多少。
sol:显然对于100%的数据情况有点多,然后我们分类讨论(我的方法贼tama烦)
首先我的草稿纸上出现这样一个东西:

然后我就把这个图弄出来了mp数组就是存这几个图形中的一个
上面如果便利到这个点处在黑色的这边那么col=1,否则col=0
显然对于col=1,每一个格子他就是ans+=1/4π,否则ans+=1-1/4π,对于5号要特判ans+=1

对于每一个询问点我们跑4遍dfs,分别从块1-4为起点开始跑,计算面积(注意块的判重)
然后对出发情况进行分类讨论:
什么时候可以呢,我又写下了:

然后分类讨论:
- 左上出发为1:col=1,else col=0
- 左下出发为2:col=0;else col=1
- 右上出发为2:col=1;else col=0
- 右下出发为1:col=0;else col=1
- 特判:5号节点左上下右上下为5号那么col=1(其实这个倒无所谓)
然后怎么dfs呢?然后我的草稿纸上又出现的更加恶心的东西

然后又是分类讨论(我都要吐了!!!)
然后写了。。大概300来行的样子吧。。也不长。。
我是码过斗地主(还有德州扑克作为第一题)的OIer!
上代码:(还打对了233333)
# include <bits/stdc++.h>
#ifdef LOCAL
#pragma GCC optimze(2)
#endif
using namespace std;
const double pi=3.1415926535;
const int dx[]={,-,,,};
const int dy[]={,,,,-};
const int MAXN=*;
int mp[MAXN][MAXN];
bool vis[MAXN][MAXN];
int n,m;
double ans;
char s[MAXN];
inline int read()
{
int X=,w=; char c=;
while (!(c>=''&&c<='')) w|=c=='-',c=getchar();
while ((c>=''&&c<='')) X=(X<<)+(X<<)+(c^),c=getchar();
return w?-X:X;
}
inline void print(int x)
{
if (x<) { putchar('-');x=-x;}
if (x>) print(x/);
putchar(''+x%);
}
inline void write(int x,int ch){ print(x);putchar(ch);}
inline void writeln(int x) { print(x);putchar('\n');}
void work0(int x,int y)
{
x*=;y*=;
mp[x-][y-]=;
mp[x][y-]=mp[x-][y]=;
mp[x][y]=;
}
void work1(int x,int y)
{
x*=,y*=;
mp[x-][y-]=mp[x][y]=;
mp[x][y-]=;
mp[x-][y]=;
}
bool check_wall(int x,int y)
{
if (mp[x][y]==||mp[x][y]==) return true;
if (mp[x][y+]==||mp[x][y+]==) return true;
if (mp[x+][y]==||mp[x+][y]==) return true;
if (mp[x+][y+]==||mp[x+][y+]==) return true;
return false;
}
double get(int a,int b)
{
if (a==) return ;
if (b==) return 0.25*pi;
else return 1.0-0.25*pi;
}
void dfs(int sx,int sy,int col)
{
if (vis[sx][sy]) return;
vis[sx][sy]=true;
ans+=get(mp[sx][sy],col);
for (int i=;i<=;i++) {
int x=sx+dx[i],y=sy+dy[i];
if (x<||x>*n||y<||y>*m||vis[x][y]) continue;
if (col==) {
if (mp[sx][sy]==) {
if (x==sx-&&y==sy) {
switch (mp[x][y]) {
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
}
} else if (x==sx&&y==sy-) {
switch (mp[x][y]) {
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
}
}
} else if (mp[sx][sy]==) {
if (x==sx-&&y==sy) {
switch (mp[x][y]) {
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
}
} else if (x==sx&&y==sy+) {
switch (mp[x][y]) {
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
}
}
} else if (mp[sx][sy]==) {
if (x==sx&&y==sy-) {
switch (mp[x][y]) {
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
}
}
else if (x==sx+&&y==sy) {
switch (mp[x][y]) {
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
}
}
} else if (mp[sx][sy]==) {
if (x==sx&&y==sy+) {
switch (mp[x][y]) {
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
}
} else if (x==sx+&&y==sy) {
switch (mp[x][y]) {
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
}
}
} else if (mp[sx][sy]==) {
if (x==sx-&&y==sy) {
switch (mp[x][y]) {
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
}
}
else if (x==sx&&y==sy-) {
switch (mp[x][y]) {
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
}
} else if (x==sx+&&y==sy) {
switch (mp[x][y]) {
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
}
} else if(x==sx&&y==sy+) {
switch (mp[x][y]) {
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
}
}
}
}else {
if (mp[sx][sy]==) {
if(x==sx&&y==sy+) {
switch (mp[x][y]) {
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
}
}else if (x==sx+&&y==sy) {
switch (mp[x][y]) {
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
}
}
}else if (mp[sx][sy]==) {
if (x==sx&&y==sy-) {
switch (mp[x][y]) {
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
}
} else if (x==sx+&&y==sy) {
switch (mp[x][y]) {
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
}
}
} else if (mp[sx][sy]==) {
if (x==sx-&&y==sy) {
switch (mp[x][y]) {
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
}
} else if(x==sx&&y==sy+) {
switch (mp[x][y]) {
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
}
}
} else if (mp[sx][sy]==) {
if (x==sx&&y==sy-) {
switch (mp[x][y]) {
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
}
} else if (x==sx-&&y==sy) {
switch (mp[x][y]) {
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
}
}
} else if (mp[sx][sy]==) {
if (x==sx-&&y==sy) {
switch (mp[x][y]) {
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
}
}
else if (x==sx&&y==sy-) {
switch (mp[x][y]) {
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
}
} else if (x==sx+&&y==sy) {
switch (mp[x][y]) {
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
}
} else if(x==sx&&y==sy+) {
switch (mp[x][y]) {
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
case :dfs(x,y,);break;
}
}
}
}
}
}
int main()
{
#ifdef LOCAL
freopen("input.in","r",stdin);
#else
freopen("flooding.in","r",stdin);
freopen("flooding.out","w",stdout);
#endif
memset(mp,,sizeof(mp));
n=read();m=read();
for (int i=;i<=n;i++) {
cin>>s;int len=strlen(s);
for (int j=;j<len;j++)
if (s[j]=='') work0(i,j+);
else work1(i,j+);
}
int T=read();
int tx,ty;
while (T--) {
tx=read();ty=read();
if (check_wall(tx,ty)) { puts("0.0000");continue;} memset(vis,false,sizeof(vis)); ans=; if (mp[tx][ty]==) dfs(tx,ty,);
else if (mp[tx][ty]==) dfs(tx,ty,); if (mp[tx][ty+]==) dfs(tx,ty+,);
else if (mp[tx][ty+]==) dfs(tx,ty+,); if (mp[tx+][ty]==) dfs(tx+,ty,);
else if (mp[tx+][ty]==) dfs(tx+,ty,); if (mp[tx+][ty+]==) dfs(tx+,ty+,);
else if (mp[tx+][ty+]==) dfs(tx+,ty+,); if (mp[tx][ty]==) dfs(tx,ty,);
else if (mp[tx][ty+]==) dfs(tx,ty+,);
else if (mp[tx+][ty]==) dfs(tx+,ty,);
else if (mp[tx+][ty+]==) dfs(tx+,ty+,); printf("%.4lf\n",ans);
}
return ;
}


sol:显然需要注意越界的问题啊啊啊啊啊啊啊!

设两个手动栈St1和St2,其中保证St1都在光标左侧St2中元素被删除或者在光标的右侧,
于是我们可以维护一些删除(D)、移动(L,R)、插入(I)的操作m次操作平均复杂度基本上是O(m)的。
再维护一个现在的前缀和数组s,在每一次插入删除的时候O(1)转化(由于不影响前面的前缀和)
主要谈谈怎么样维护答案。 在每一次处理的时候ans[top1]表示前top1个元素最大前缀和是多少,只要和前缀和数组s[top1]对应取max就行
还是解释一下程序吧:
# include <bits/stdc++.h>
#ifdef LOCAL
#pragma GCC optimze(2)
#endif
using namespace std;
const int MAXN=2e6+;
int st1[MAXN],st2[MAXN];
int s[MAXN],ans[MAXN];
inline int read()
{
int X=,w=; char c=;
while (!(c>=''&&c<='')) w|=c=='-',c=getchar();
while ((c>=''&&c<='')) X=(X<<)+(X<<)+(c^),c=getchar();
return w?-X:X;
}
inline void print(int x)
{
if (x<) { putchar('-');x=-x;}
if (x>) print(x/);
putchar(''+x%);
}
inline void write(int x,int ch){ print(x);putchar(ch);}
inline void writeln(int x) { print(x);putchar('\n');}
int main()
{
ans[]=-0x3f3f3f3f; int top1=,top2=,T=read();
while (T--){
char ch; cin>>ch;
if(ch=='I') {
int x=read();
st1[++top1]=x;//在光标前插入元素压如St1
s[top1]=x+s[top1-]; //由于和前面不关联前缀和然后维护前缀和数组O(1)
ans[top1]=max(ans[top1-],s[top1]);//更新答案
}
if(ch=='D') top1--; //出队直接弹掉就行
if(ch=='L') {
if (top1!=) { //注意判越界!
int x=st1[top1--]; //把左栈元素压到右栈
st2[++top2]=x;
}
}
if(ch=='R') {
if (top2!=) {
int x=st2[top2--];
st1[++top1]=x; //把右栈元素压的左栈
s[top1]=s[top1-]+x; //维护左边前缀和
ans[top1]=max(ans[top1-],s[top1]);
}
}
if(ch=='Q') { int x=read(); writeln(ans[x]);}//直接输出ans即可
} return ;
}
HGOI20181030 模拟题解的更多相关文章
- HGOI20181029模拟题解
HGOI20181029模拟题解 /* sxn让我一定要谴责一下出题人和他的数据! */ problem: 给出十进制数a,b,然后令(R)10=(a)10*(b)10,给出c表示一个k进制数(1&l ...
- 【 P3952】 时间复杂度 大模拟题解
题目链接 完全模拟 1.模拟结果 当我们的模拟程序执行结束时,直接执行模拟结果函数,用于比对我们的结果和数据给出的结果. bool yes(char a[],char b[]) { ;i<=;+ ...
- HGOI20181031 模拟题解
sol:第一题就DP?!然后写了O(n^2) dp再考虑优化!!!(尽量部分分带上!!!) 我写了正确的dp然后优化错了,具体的dp方法是考虑到对于右侧到左侧他是没有后效性的 所以定义f[i]为i及以 ...
- CSYZDay2模拟题解
T1.rotate [问题描述] ZYL有N张牌编号分别为1, 2,……,N.他把这N张牌打乱排成一排,然后他要做一次旋转使得旋转后固定点尽可能多.如果第i个位置的牌的编号为i,我们就称之为固定点.旋 ...
- CSYZDay1模拟题解
T1.game [问题描述] LZK发明一个矩阵游戏,大家一起来玩玩吧,有一个N行M列的矩阵.第一行的数字是1,2,…M,第二行的数字是M+1,M+2…2*M,以此类推,第N行的数字是(N-1)*M+ ...
- 2019-06-03 校内python模拟题解(所有非原题)
一起来女装吧 本题改编自USACO(USA Computing Olympiad) 1.1节的第一题 (感谢lsy同学对本题题面的贡献) 直接计算就好了 chr:将ASCII码转成字符 ord:字符对 ...
- ZOJ Monthly, June 2014 月赛BCDEFGH题题解
比赛链接:点击打开链接 上来先搞了f.c,,然后发现状态不正确,一下午都是脑洞大开,, 无脑wa,无脑ce...一样的错犯2次.. 硬着头皮搞了几发,最后20分钟码了一下G,不知道为什么把1直接当成不 ...
- hdu_5818_Joint Stacks(线段树模拟)
题目链接:hdu_5818_Joint Stacks 题意: 给你两个栈,多了个合并操作,然后让你模拟 题解: 很容易想到O(1)的单个栈操作,O(n)的合并操作,这样肯定超时,所以我们要将时间复杂度 ...
- CSU 1862 The Same Game(模拟)
The Same Game [题目链接]The Same Game [题目类型]模拟 &题解: 写这种模拟题要看心态啊,还要有足够的时间,必须仔细读题,一定要写一步,就调试一步. 这题我没想到 ...
随机推荐
- Python3入门(一)——概述与环境安装
一.概述 1.python是什么 Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Python 是一种解释型语言: 这意味着开发过程中没有了编译这个环节.类似于PHP和 ...
- Luogu P2055 [ZJOI2009]假期的宿舍
一道网络有关的问题,还是一句话 网络流重在建模! 这里主要讲两种算法. 1.二分图匹配: 分析题意,我们可以知道题目要求是让所有留在学校的人都能有床睡 而 所有留在学校的人=本校不回家的人+外校的人: ...
- c语言数字图像处理(三):仿射变换
仿射变换及坐标变换公式 几何变换改进图像中像素间的空间关系.这些变换通常称为橡皮模变换,因为它们可看成是在一块橡皮模上印刷一幅图像,然后根据预定的一组规则拉伸该薄膜.在数字图像处理中,几何变换由两个基 ...
- CDH 5.16.1 离线部署 & 通过 CDH 部署 Hadoop 服务
参考 Cloudera Enterprise 5.16.x Installing Cloudera Manager, CDH, and Managed Services Installation Pa ...
- 通过监控Nginx日志来实时屏蔽高频恶意访问的IP
目前在我的VPS上主要通过两种方式来限制ip的访问次数. 通过Nginx的limit_req配置来限制同一ip在一分钟内的访问次数 通过Nginx deny封禁一天内超过指定次数的ip(需要一个监控脚 ...
- springboot 异步调用Async使用方法
引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在spring 3. ...
- 运用fancybox弹出div的方式弹出视频界面
fancybox可以弹出很多窗体,甚至一个swf格式的小视频.但这样的swf视频播放的时候并没有任何的控件.只能重头看到尾,或者关闭.我们可以利用fancybox弹出div盒子的方式配合html5很快 ...
- 20135327郭皓--Linux内核分析第四周 扒开系统调用的三层皮(上)
Linux内核分析第四周 扒开系统调用的三层皮(上) 郭皓 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/U ...
- “数学口袋精灵”App的第一个Sprint计划
一.现状 我们这个团队想制作一个关于运算的游戏类型手机软件,针对我们这个学期的Android软件开发的课程,制作出一个关于数学算术游戏软件. 二.任务认领 第一阶段先把静态网页制作出来,各自的任务: ...
- Beta版本冲刺(五)
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:恺琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...