貌似是比较水的一场 可是我依然8会做

C

发现除了第一步以外的走法都不会受到锁的影响并且一定选四个方向距离最近的径直走过去

那么第一步能走到的联通块取个min就好了

(我竟然第一发特别认真的写了一个DFS)

//Love and Freedom.
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#define inf 20021225
#define ll long long
#define N 810
#define pa pair<int,int>
using namespace std;
int read()
{
int f=,s=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-') f=-; ch=getchar();}
while(ch>=''&&ch<='') s=s*+ch-'',ch=getchar();
return f*s;
}
int n,m,k,dx[]={,,-,},dy[]={,-,,};
int F(int x,int y){return min(min((x-+k-)/k,(y-+k-)/k),min((n-x+k-)/k,(m-y+k-)/k));}
int ans=inf; bool vis[N][N]; int dis[N][N];
queue<pa> q;
char ch[N];
int main()
{
n=read(),m=read(),k=read(); int x,y;
for(int i=;i<=n;i++)
{
scanf("%s",ch+);
for(int j=;j<=m;j++)
if(ch[j]=='#') vis[i][j]=;
else if(ch[j]=='S') q.push(make_pair(i,j));
}
while(!q.empty())
{
pa tmp=q.front(); x=tmp.first,y=tmp.second; q.pop();
ans=min(ans,F(x,y)+);
if(dis[x][y]==k) continue;
for(int i=;i<;i++)
{
int nx=x+dx[i],ny=y+dy[i];
if(!nx||!ny||nx>n||ny>m||vis[nx][ny]) continue;
vis[nx][ny]=; dis[nx][ny]=dis[x][y]+; q.push(make_pair(nx,ny));
}
}
printf("%d\n",ans);
return ;
}

C

D

猜结论代师!

结论1:多于一个叶子就一定先手胜利

结论2:每次叶子可以把它的父亲拖下水两个一起删掉

写了一发竟然对了??

后来看了一下证明:后手胜利当且仅当存在完美匹配。(先手选哪个后手直接匹配掉就完事了)

所以其实我就是写了个完备匹配/px

//Love and Freedom.
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#define inf 20021225
#define ll long long
#define N 100010
using namespace std;
int read()
{
int f=,s=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-') f=-; ch=getchar();}
while(ch>=''&&ch<='') s=s*+ch-'',ch=getchar();
return f*s;
}
struct edge{int to,lt;}e[N<<];
int in[N],cnt,leaf[N],del[N],d[N];
void add(int x,int y)
{
e[++cnt].to=y; e[cnt].lt=in[x]; in[x]=cnt; d[x]++; if(d[x]>) leaf[x]=;
e[++cnt].to=x; e[cnt].lt=in[y]; in[y]=cnt; d[y]++; if(d[y]>) leaf[y]=;
}
int win;
void dfs(int x,int fr)
{
if(win) return; int lf=,all=,de=;
for(int i=in[x];i;i=e[i].lt)
{
int y=e[i].to; if(y==fr) continue;
dfs(y,x); all++; lf+=leaf[y]; de+=del[y];
if(win) return;
}
if(lf>=) win=;
if(lf==) del[x]=;
else leaf[x]=;
}
int rt;
int main()
{
int n=read();
for(int i=;i<n;i++) add(read(),read());
if(n==) return puts("Second"),;
for(int i=;i<=n;i++) rt=d[i]>=?i:rt;
dfs(rt,); puts(win?"First":"Second");
return ;
}

D

E

别人的NOIP模拟题/kk

一点思路都没有(摔

首先观察到(我就没观察到)最后一步的那条边一定是删了又加上

于是我们考虑建出两棵树 红树和蓝树

我们到着做这个过程

我们发现我们可以删掉一条红边变成蓝边当且仅当他们路径上就一条红边

所以我们维护哪些边可以删 然后直接合并的时候把度数小的边改到度数大的边上就可以了

复杂度:O(nlg^2n)

当然还可以正着做 发现每次就是删边以后看有一条边上就被覆盖了一次然后求出最小值删掉即可

所以是树链剖分+平衡树维护

复杂度:O(nlg^3n)

我是必然不可能写第二个的/px

//Love and Freedom.
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<map>
#include<set>
#include<queue>
#define inf 20021225
#define ll long long
#define N 100100
#define pa pair<int,int>
#define fs first
#define se second
#define mp make_pair
using namespace std;
int read()
{
int f=,s=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-') f=-; ch=getchar();}
while(ch>=''&&ch<='') s=s*+ch-'',ch=getchar();
return f*s;
}
map<pa,int> g;
multiset<int> ed[N];
queue<pa> nd;
void add(int x,int y)
{
if(x==y) return; if(x>y) swap(x,y); ed[x].insert(y); ed[y].insert(x);
g[mp(x,y)]++; if(g[mp(x,y)]==) nd.push(mp(x,y));
}
void del(int x,int y)
{
ed[y].erase(ed[y].find(x)); if(x>y) swap(x,y);
if(g.count(mp(x,y))) g.erase(mp(x,y));
}
int main()
{
int n=read();
for(int i=;i<=*(n-);i++) add(read(),read());
for(int i=;i<n;i++)
{
while()
{
if(nd.empty()) return puts("NO"),;
int x=nd.front().fs,y=nd.front().se; nd.pop();
if(!g.count(mp(x,y))) continue;
if(ed[x].size()<ed[y].size()) swap(x,y);
for(multiset<int>::iterator it=ed[y].begin();it!=ed[y].end();it++)
{
int to=*it; del(y,to); add(x,to);
}
break;
}
}
puts("YES");
return ;
}

E

F

神仙题/se

我们考虑递推来做

发现1对整个序列没有影响(它一定会在最后一次挪到第一个来)

于是我们考虑对2,...,n计算这个问题

设2,...,n的答案为T,在T-1步时它的第一个位置上的数是F。

可以发现f一定不等于2

可以这么考虑,如果已经是有序的了,那么T是不对的,T的数值其实应该是T-1

如果不是有序的,那么2后面一定存在一个low元素,它下一次会被移到首位从而序列不能再T步做到有序

接着我们考虑第是否需要多一步来让1变成首位。

结论是当1,2,f的顺序为(2,f,1)时答案为T,否则为T+1

你发现这个结论非常精妙

其实是对于{1,2,f}它们实际上是以循环的形式出现的

也就是(a,b,c)->(c,a,b)->(b,c,a)

具体证明呢 就是你分类讨论一下他们的大小关系对应的High和Low就好啦

于是呢这个玩意一边递推一边计算就好了qwq

//Love and Freedom.
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#define inf 20021225
#define ll long long
#define N 200010
using namespace std;
int read()
{
int f=,s=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-') f=-; ch=getchar();}
while(ch>=''&&ch<='') s=s*+ch-'',ch=getchar();
return f*s;
}
int a[N],n,t[N],f[N];
bool check(int x,int y,int z){return (x<y&&y<z)||(y<z&&z<x)||(z<x&&x<y);}
int main()
{
n=read();
for(int i=;i<=n;i++) a[read()]=i;
for(int i=n-;i;i--)
{
if(!t[i+])
{
if(a[i]>a[i+]) t[i]=,f[i]=a[i+];
}
else
{
if(check(f[i+],a[i],a[i+]))
t[i]=t[i+],f[i]=f[i+];
else
t[i]=t[i+]+,f[i]=a[i+];
}
}
printf("%d\n",t[]);
return ;
}

F

AGC014做题记录的更多相关文章

  1. UOJ 做题记录

    UOJ 做题记录 其实我这么弱> >根本不会做题呢> > #21. [UR #1]缩进优化 其实想想还是一道非常丝播的题目呢> > 直接对于每个缩进长度统计一遍就好 ...

  2. project euler做题记录

    ProjectEuler_做题记录 简单记录一下. problem 441 The inverse summation of coprime couples 神仙题.考虑答案为: \[\begin{a ...

  3. Sam做题记录

    Sam做题记录 Hihocoder 后缀自动机二·重复旋律5 求一个串中本质不同的子串数 显然,答案是 \(\sum len[i]-len[fa[i]]\) Hihocoder 后缀自动机三·重复旋律 ...

  4. 退役IV次后做题记录

    退役IV次后做题记录 我啥都不会了.... AGC023 D 如果所有的楼房都在\(S\)同一边可以直接得出答案. 否则考虑最左最右两边的票数,如果左边>=右边,那么最右边会投给左边,因为就算车 ...

  5. 退役III次后做题记录(扯淡)

    退役III次后做题记录(扯淡) CF607E Cross Sum 计算几何屎题 直接二分一下,算出每条线的位置然后算 注意相对位置这个不能先搞出坐标,直接算角度就行了,不然会卡精度/px flag:计 ...

  6. 退役II次后做题记录

    退役II次后做题记录 感觉没啥好更的,咕. atcoder1219 历史研究 回滚莫队. [六省联考2017]组合数问题 我是傻逼 按照组合意义等价于\(nk\)个物品,选的物品\(\mod k\) ...

  7. BJOI做题记录

    BJOI做题记录 终于想起还要做一下历年省选题了2333 然而咕了的还是比做了的多2333 LOJ #2178. 「BJOI2017」机动训练 咕了. LOJ #2179. 「BJOI2017」树的难 ...

  8. FJOI2017前做题记录

    FJOI2017前做题记录 2017-04-15 [ZJOI2017] 树状数组 问题转化后,变成区间随机将一个数异或一,询问两个位置的值相等的概率.(注意特判询问有一个区间的左端点为1的情况,因为题 ...

  9. [日记&做题记录]-Noip2016提高组复赛 倒数十天

    写这篇博客的时候有点激动 为了让自己不颓 还是写写日记 存存模板 Nov.8 2016 今天早上买了两个蛋挞 吃了一个 然后就做数论(前天晚上还是想放弃数论 但是昨天被数论虐了 woc noip模拟赛 ...

随机推荐

  1. 记录一下WPF中自寄宿asp.net服务添加urlacl的问题

    asp.net公开服务地址时,由于当前用户权限问题,会导致服务地址未添加到urlacl池中报错. 关于添加urlacl的细节,请参考我之前的文章:asp.net self host and urlac ...

  2. fiddler之数据分析和查看(inspectors)-抓包

    在instpectors中主要是对请求和响应进行查看和分享,监听请求的响应内容.他有多个分页标签.界面分上下两部分,上面部分显示请求的相关信息:下面部分显示响应相关信息.简单说明常用的几个分页标签 一 ...

  3. cocos2dx基础篇(12) 编辑框之一CCTextFieldTTF

    前面我们讲了精灵贴图.标签.菜单.按钮.感觉似乎少了点什么?UI控件里是不是应该还有一个很重要的控件--编辑框.在手机网游中,启动游戏,过了开场动画后,基本上显示的第一个界面应该就是游戏的登录界面了吧 ...

  4. django中的一对一的关系

    在django中一对一的关系其实就是在后面加上了unique=True 唯一的操作 源码就是这样的 其余的操作跟多对一的操作一样

  5. Linux 系统多台主机之间做SSH免密码登陆

    SSH 免密登录 环境说明 CentOS 7.3 关键点 免密登录的关键点在于理解谁登录谁. A 生成的公钥给 B,也给 C.D,则 A 可以直接免密 SSH 登录 B.C.D A 生成密钥 在 A ...

  6. [Web 前端] 029 jQuery 元素的“节操”

    目录 jQuery 元素的节点操作 1. 创建节点 2. 插入节点 2.1 在现存元素的内部,从后面插入元素 2.2 在现存元素的内部,从前面插入元素 2.3 在现存元素的外部,从后面插入元素 2.4 ...

  7. java不能卸载,提醒路劲找不到 *:\Java\

    安装MyEclipse是提醒找不到java安装路劲 :*:\Java\jdk1.7.0_80 想卸载java重装也没法卸载,还是同样的提醒 找不到java安装路劲 :*:\Java\jdk1.7.0_ ...

  8. Linux cd命令(4)

    可以说在Linux上的一切操作都是从 cd 命令开始的.cd 是change directory的简写,其作用就是更改当前工作目录. 使用cd 对于这个命令的使用,不用多说了.需要注意的两点就是: c ...

  9. qtreewidget 显示保存xml文件

    此文是读取和存储已知结构的xml,对于未知结构的xml,可以用递归方法读取和遍历.可参考文章:Qt遍历不规则树的节点. 1.QTreewidget设置 //折叠图标(三角图标)换成自定义图标 ui-& ...

  10. [Codeforces 1214A]Optimal Currency Exchange(贪心)

    [Codeforces 1214A]Optimal Currency Exchange(贪心) 题面 题面较长,略 分析 这个A题稍微有点思维难度,比赛的时候被孙了一下 贪心的思路是,我们换面值越小的 ...