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 模拟题解的更多相关文章

  1. HGOI20181029模拟题解

    HGOI20181029模拟题解 /* sxn让我一定要谴责一下出题人和他的数据! */ problem: 给出十进制数a,b,然后令(R)10=(a)10*(b)10,给出c表示一个k进制数(1&l ...

  2. 【 P3952】 时间复杂度 大模拟题解

    题目链接 完全模拟 1.模拟结果 当我们的模拟程序执行结束时,直接执行模拟结果函数,用于比对我们的结果和数据给出的结果. bool yes(char a[],char b[]) { ;i<=;+ ...

  3. HGOI20181031 模拟题解

    sol:第一题就DP?!然后写了O(n^2) dp再考虑优化!!!(尽量部分分带上!!!) 我写了正确的dp然后优化错了,具体的dp方法是考虑到对于右侧到左侧他是没有后效性的 所以定义f[i]为i及以 ...

  4. CSYZDay2模拟题解

    T1.rotate [问题描述] ZYL有N张牌编号分别为1, 2,……,N.他把这N张牌打乱排成一排,然后他要做一次旋转使得旋转后固定点尽可能多.如果第i个位置的牌的编号为i,我们就称之为固定点.旋 ...

  5. CSYZDay1模拟题解

    T1.game [问题描述] LZK发明一个矩阵游戏,大家一起来玩玩吧,有一个N行M列的矩阵.第一行的数字是1,2,…M,第二行的数字是M+1,M+2…2*M,以此类推,第N行的数字是(N-1)*M+ ...

  6. 2019-06-03 校内python模拟题解(所有非原题)

    一起来女装吧 本题改编自USACO(USA Computing Olympiad) 1.1节的第一题 (感谢lsy同学对本题题面的贡献) 直接计算就好了 chr:将ASCII码转成字符 ord:字符对 ...

  7. ZOJ Monthly, June 2014 月赛BCDEFGH题题解

    比赛链接:点击打开链接 上来先搞了f.c,,然后发现状态不正确,一下午都是脑洞大开,, 无脑wa,无脑ce...一样的错犯2次.. 硬着头皮搞了几发,最后20分钟码了一下G,不知道为什么把1直接当成不 ...

  8. hdu_5818_Joint Stacks(线段树模拟)

    题目链接:hdu_5818_Joint Stacks 题意: 给你两个栈,多了个合并操作,然后让你模拟 题解: 很容易想到O(1)的单个栈操作,O(n)的合并操作,这样肯定超时,所以我们要将时间复杂度 ...

  9. CSU 1862 The Same Game(模拟)

    The Same Game [题目链接]The Same Game [题目类型]模拟 &题解: 写这种模拟题要看心态啊,还要有足够的时间,必须仔细读题,一定要写一步,就调试一步. 这题我没想到 ...

随机推荐

  1. BZOJ2427: [HAOI2010]软件安装 tarjan+树形背包

    分析: 一开始我以为是裸的树形背包...之后被告知这东西...可能有环...什么!有环! 有环就搞掉就就可以了...tarjan缩点...建图记得建立从i到d[i]之后跑tarjan,因为这样才能判断 ...

  2. Luence

    Luence 是Apache软件基金会的一个项目,是一个开发源码的全文检索引擎工具包,是一个全文检索引擎的一个架构.提供了完成的查询引擎和检索引擎,部分文本分析引擎. 全文检索程序库,虽然与搜索引擎相 ...

  3. 网络对抗技术 2017-2018-2 20152515 Exp1 PC平台逆向破解(5)M

    Exp1 PC平台逆向破解(5)M 1 知识要求 2 直接修改程序机器指令,改变程序执行流程 3 通过构造输入参数,造成BOF攻击,改变程序执行流 4 注入Shellcode并执行 1 知识要求 掌握 ...

  4. 网络对抗第一次实验——PC平台逆向破解(5)M

    网络对抗第一次实验--PC平台逆向破解(5)M 实践一 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数. 操作步骤: 获取实验用文件pwn1,复制,复制出来的文件改名为20155 ...

  5. 20155320 EXP8 Web基础

    20155320 EXP8 Web基础 [基础问题回答] 什么是表单? 表单:可以收集用户的信息和反馈意见,是网站管理者与浏览者之间沟通的桥梁. 表单由文本域.复选框.单选框.菜单.文件地址域.按钮等 ...

  6. 20155330 《网络攻防》 Exp4 恶意代码分析

    20155330 <网络攻防> Exp4 恶意代码分析 实验后回答问题 (1)如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操 ...

  7. 修改 input[type="radio"] 和 input[type="checkbox"] 的默认样式

    表单中,经常会使用到单选按钮和复选框,但是,input[type="radio"] 和 input[type="checkbox"] 的默认样式在不同的浏览器或 ...

  8. 用C++实现一个Brainfuck解释器

    Brainfuck是一种极小化的计算机语言,只含有8种运算符,由于fuck在英语中是脏话,这种语言有时被称为brainfck或brainf**,甚至被简称为BF.正如它的名字所暗示,brainfuck ...

  9. Java设计模式之适配器设计模式(项目升级案例)

    今天是我学习到Java设计模式中的第三个设计模式了,但是天气又开始变得狂热起来,对于我这个凉爽惯了的青藏人来说,又是非常闹心的一件事儿,好了不管怎么样,目标还是目标(争取把23种Java设计模式接触一 ...

  10. javascript典型bug——错误的闭包

    昨天QT给我的一个功能提了一个bug.大概意思就是说,一段在不同位置都会被调用的代码,在A处被调用的时候,似乎会对其他调用的地方产生影响. 我仔细debug了半天,终于找到了原因.简化过的代码如下: ...