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 [题目类型]模拟 &题解: 写这种模拟题要看心态啊,还要有足够的时间,必须仔细读题,一定要写一步,就调试一步. 这题我没想到 ...
随机推荐
- .NET Core 对象到字节数组的序列化和反序列化
.NET Core中利用MemoryStream和BinaryFormatter可以实现对象到字节数组的序列化和反序列化: 定义ObjectSerializer类,实现对象到字节数组的序列化和反序列化 ...
- SonarQube6.7.4安装部署
1.准备工作 https://www.sonarqube.org Sonar 是一个用于代码质量管理的开放平台.通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具.比如p ...
- 允许Ubuntu系统下Mysql数据库远程连接
第一步: vim /etc/mysql/my.cnf找到bind-address = 127.0.0.1 注释掉这行,如:#bind-address = 127.0.0.1 或者改为: bind-ad ...
- 解决 引入本地jar包后 maven无法编译的问题及部署war包缺失本地jar包的问题
参考:https://blog.csdn.net/wang864676212/article/details/82626922 pom.xml 引入 <plugin> <plugin ...
- stl源码剖析 详细学习笔记deque(3)
protected: typedef simple_alloc<value_type,Alloc> data_allocator; //用来配置元素的alloc typedef simpl ...
- 动态绑定,多态,static
1:下面程序的输出结果为: class base2{ static{ System.out.println("static base2"); } } public class te ...
- Matlab批量处理指定文件夹下的所有音频文件
filedir='E:/source/Wavfile/*.wav'; % 设置路径 outfiledir='E:/output/Wavfile/'; infiledir='E:/source/Wavf ...
- NetFPGA Demo ——reference_nic_nf1_cml
NetFPGA Demo --reference_nic_nf1_cml 实验平台 OS:deepin 15.4 开发板:NetFPGA_1G_CML 实验过程 从NetFPGA-1G-CML从零开始 ...
- 作业四 任务分解(WBS)
近日忙于实验,未来得及完成任务分解昨晚召开了紧急会议,才确定了任务划分.主体分配如下:三名编程人员,一个主编两个辅编,一人做需求分析,一人做程序测试,一人专司文档. 具体细节如下:在剩余的三周左右的时 ...
- ElasticSearch 2 (23) - 语言处理系列之词根提取
ElasticSearch 2 (23) - 语言处理系列之词根提取 摘要 世界上大多数语言都是屈折变化的,意思是词语可以通过变形来表达不同的含义: 数(Number): fox, foxes 时态( ...