Link:

ARC063 传送门

C:

将每种颜色的连续出现称为一段,寻找总段数即可

#include <bits/stdc++.h>

using namespace std;
int cnt=,len;
char s[];
int main()
{
scanf("%s",s+);len=strlen(s+);
for(int i=;i<=len;i++)
if(s[i]!=s[i-]) cnt++;
printf("%d",cnt-);
return ;
}

Problem C

D:

可以发现对于每一个点的最优解$res_i$为:

$max(w_j)-w_i(j>i)$

找到最小的$res_i$的个数即可

#include <bits/stdc++.h>

using namespace std;
int n,d,dat[],mx,res,cnt;
int main()
{
scanf("%d%d",&n,&d);
for(int i=;i<=n;i++) scanf("%d",&dat[i]);
mx=dat[n];
for(int i=n-;i>=;i--)
{
if(mx>dat[i])
{
if(mx-dat[i]>res) res=mx-dat[i],cnt=;
else if(mx-dat[i]==res) cnt++;
}
mx=max(mx,dat[i]);
}
printf("%d",cnt);
return ;
}

Problem D

E:

仔细考虑一下会发现并没有那么难……

首先每个已知权值的节点的权值和其深度的异或值要相同,保证其奇偶性合法

(一定要先剔除奇偶性不合法的情况,否则后面可能会判为合法)

接下来就只要考虑权值大小是否合法即可

可以$dfs$出每个节点的可能区间,将$l[i]>r[i]$视为不合法

构造答案时只要保证该节点的值在区间内即可(感性证明)

#include <bits/stdc++.h>

using namespace std;
const int MAXN=1e5+,INF=<<;
struct edge{int nxt,to;}e[MAXN<<];
int n,k,x,y,fst,head[MAXN],dep[MAXN],l[MAXN],r[MAXN],val[MAXN],tot=; void add(int from,int to)
{e[++tot].nxt=head[from];e[tot].to=to;head[from]=tot;} void cal_dep(int x,int anc)
{
for(int i=head[x];i;i=e[i].nxt)
{
if(e[i].to==anc) continue;
dep[e[i].to]=dep[x]+;cal_dep(e[i].to,x);
}
} void dfs(int x,int anc)
{
if(val[x]!=INF) l[x]=r[x]=val[x];
else l[x]=-INF,r[x]=INF; for(int i=head[x];i;i=e[i].nxt)
{
if(e[i].to==anc) continue;
dfs(e[i].to,x);
l[x]=max(l[x],l[e[i].to]-);
r[x]=min(r[x],r[e[i].to]+);
} if(l[x]>r[x]){puts("No");exit();}
} void print(int x,int anc)
{
if(val[x]==INF)
{
if(val[anc]+>=l[x]&&val[anc]+<=r[x]) val[x]=val[anc]+;
else val[x]=val[anc]-;
}
for(int i=head[x];i;i=e[i].nxt)
if(e[i].to!=anc) print(e[i].to,x);
} int main()
{
scanf("%d",&n);
for(int i=;i<n;i++)
scanf("%d%d",&x,&y),add(x,y),add(y,x);
cal_dep(,);
for(int i=;i<=n;i++) val[i]=INF; scanf("%d",&k);
for(int i=;i<=k;i++)
{
scanf("%d%d",&x,&y);val[x]=y;
if(i==) fst=(dep[x]&)^(val[x]&);
else if((dep[x]&)^(val[x]&)!=fst) return !puts("No");
} dfs(,);
if(val[]==INF) val[]=l[];
puts("Yes");print(,);
for(int i=;i<=n;i++) printf("%d\n",val[i]); return ;
}

Problem E

F:

原来模拟赛中出现过的一道题目,现在终于刚掉了

当时听杨主力讲题时一脸懵逼,完全不知所云

首先要看出一个结论:矩形一定经过中线$\frac{n}{2}$或$\frac{m}{2}$

(原因在于矩形周长的下限为$2*(max(n,m)+1)$,而$\frac{n}{2}*\frac{m}{2}$的矩形的周长明显是比其小的)

而这两种情况可以只考虑一种,剩下一种将每个点的$x,y$坐标翻转即可

接下来都以$\frac{m}{2}$为中线来举例

要使周长最大,明显要使子矩阵为一个极大子矩阵

可以先将所有节点按$x$坐标递增的方式来排序

确定了两个点就确定了该矩阵的左右边界,上下边界的最大值由中间的点来限定

假如选定了$i$为右边界,那么当前的最值为$max\{ X_i-X_j+len_j\}$

其中$len_j$为以点$j$为左边界时由$i....j$的点限定出的最长竖直距离

于是可以上下各维护一个单调栈,保证栈中的纵坐标向两侧递增

每次新增一个节点时按照单调栈中的信息在退栈时将$len_j$更新即可

为了在$log(n)$的时间内完成上述操作,可以使用线段树维护$len_j-X_j$的最大值

退栈时将那条线段整体平移到当前线段的位置,也就是将所有点的$len$都减去与当前线段的差值,为区间减操作

最后将最大值,即$seg[1]$加上$X_i$就是以$i$为右边界时的最大值

#include <bits/stdc++.h>

using namespace std;
typedef pair<int,int> P;
#define X first
#define Y second
#define mid (l+r)/2
#define lc k<<1,l,mid
#define rc k<<1|1,mid+1,r
const int MAXN=3e5+;
int n,m,k,seg[MAXN<<],tag[MAXN<<],res=;
P dat[MAXN],st1[MAXN],st2[MAXN]; void pushdown(int k)
{
if(!tag[k]) return;
tag[k<<]+=tag[k];seg[k<<]+=tag[k];
tag[k<<|]+=tag[k];seg[k<<|]+=tag[k];
tag[k]=;
} void Update(int a,int b,int x,int k,int l,int r)
{
if(a<=l&&r<=b){tag[k]+=x;seg[k]+=x;return;}
pushdown(k);
if(a<=mid) Update(a,b,x,lc);
if(b>mid) Update(a,b,x,rc);
seg[k]=max(seg[k<<],seg[k<<|]);
} void solve()
{
memset(seg,,sizeof(seg));
memset(tag,,sizeof(tag));
sort(dat+,dat+k+); int t1=,t2=;
for(int i=;i<=k;i++)
{
if(dat[i].Y<=m/)
{
int lst=i-;
while(t1&&st1[t1].Y<dat[i].Y)
Update(st1[t1].X,lst,st1[t1].Y-dat[i].Y,,,k),
lst=st1[t1--].X-;
if(lst!=i-) st1[++t1]=P(lst+,dat[i].Y);
}
else
{
int lst=i-;
while(t2&&st2[t2].Y>dat[i].Y)
Update(st2[t2].X,lst,dat[i].Y-st2[t2].Y,,,k),
lst=st2[t2--].X-;
if(lst!=i-) st2[++t2]=P(lst+,dat[i].Y);
} st1[++t1]=P(i,);st2[++t2]=P(i,m);
Update(i,i,m-dat[i].X,,,k);
res=max(res,seg[]+dat[i+].X);
}
} int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<=k;i++)
scanf("%d%d",&dat[i].X,&dat[i].Y);
dat[++k]=P(,);dat[++k]=P(n,m);
solve();
for(int i=;i<=k;i++)
swap(dat[i].X,dat[i].Y);
swap(n,m);
solve(); printf("%d",res*);
return ;
}

Problem F

[Atcoder Regular Contest 063] Tutorial的更多相关文章

  1. AtCoder Regular Contest 063 E:Integers on a Tree

    题目传送门:https://arc063.contest.atcoder.jp/tasks/arc063_c 题目翻译 给你一个树,上面有\(k\)个点有权值,问你是否能把剩下的\(n-k\)个点全部 ...

  2. [Atcoder Regular Contest 060] Tutorial

    Link: ARC060 传送门 C: 由于难以维护和更新平均数的值: $Average->Sum/Num$ 这样我们只要用$dp[i][j][sum]$维护前$i$个数中取$j$个,且和为$s ...

  3. AtCoder Regular Contest 063 F : Snuke’s Coloring 2 (线段树 + 单调栈)

    题意 小 \(\mathrm{C}\) 很喜欢二维染色问题,这天他拿来了一个 \(w × h\) 的二维平面 , 初始时均为白色 . 然后他在上面设置了 \(n\) 个关键点 \((X_i , Y_i ...

  4. [Atcoder Regular Contest 061] Tutorial

    Link: ARC061 传送门 C: 暴力$dfs$就好了 #include <bits/stdc++.h> using namespace std; typedef long long ...

  5. [Atcoder Regular Contest 065] Tutorial

    Link: ARC065 传送门 C: 最好采取逆序贪心,否则要多考虑好几种情况 (从前往后贪心的话不能无脑选“dreamer”,"er"可能为"erase"/ ...

  6. [Atcoder Regular Contest 064] Tutorial

    Link: ARC064 传送门 C: 贪心+对边界的特殊处理 #include <bits/stdc++.h> using namespace std; typedef long lon ...

  7. [Atcoder Regular Contest 062] Tutorial

    Link: ARC 062 传送门 C: 每次判断增加a/b哪个合法即可 并不用判断两个都合法时哪个更优,因为此时两者答案必定相同 #include <bits/stdc++.h> usi ...

  8. AtCoder Regular Contest 061

    AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...

  9. AtCoder Regular Contest 094 (ARC094) CDE题解

    原文链接http://www.cnblogs.com/zhouzhendong/p/8735114.html $AtCoder\ Regular\ Contest\ 094(ARC094)\ CDE$ ...

随机推荐

  1. 淡入淡出效果的js原生实现

    淡入淡出效果,在日常项目中经常用到,可惜原生JS没有类似的方法,而有时小的页面并不值得引入一个jQuery库,所以就自己写了一个,已封装, 有用得着的朋友, 可以直接使用. 代码中另附有一个设置元素透 ...

  2. Bash 实例,第二部分

    我们先看一下处理命令行自变量的简单技巧,然后再看看 bash 基本编程结构. 接收自变量 在 介绍性文章 中的样本程序中,我们使用环境变量 "$1" 来引用第一个命令行自变量.类似 ...

  3. (转)用python获取页面返回的cookie

    网址如下: crifan:http://www.crifan.com/get_cookie_from_web_response_in_python/ . . . .

  4. bzoj 1880 最短路

    我们首先知道,答案肯定是最短路图中的某段公共链,那么设(x,y)为x到y的最短路,那么答案为((s1,t1)+(s2,t2)-min((s1,s2)+(t1,t2),(s1,t2),(s2,t1))) ...

  5. Python阶段复习 - part 2 - Python序列/持久化

    1. 把一个数字的list从小到大排序,然后写入文件,然后从文件中读取出来文件内容,然后反序,在追加到文件的下一行中 >>> import json >>> imp ...

  6. wx.ScrolledWindow wx.PseudoDC

    # encoding: utf-8 import logging import random import wx import wx.lib.inspection def GetMyBitmap(): ...

  7. GCC编译安装

    1. 安装静态库,如果没有安装静态库,后面编译不会通过: yum install glibc-static libstdc++-static -y 2. 下载GCCxxx.tat.gz: wget h ...

  8. easyui获取当前选中的tabs

    $("#" + $("#tabs").find("iframe")[$(".tabs-header ul li").in ...

  9. Java坦克大战 (三) 之可完全控制坦克朝八个方向运动

    本文来自:小易博客专栏.转载请注明出处:http://blog.csdn.net/oldinaction 在此小易将坦克大战这个项目分为几个版本,以此对J2SE的知识进行回顾和总结,希望这样也能给刚学 ...

  10. 大数据量的Mysql数据库备份策略

    Centos下mysql常用的三种备份方法 http://www.centoscn.com/CentOS/Intermediate/2013/0807/1160.html xtrabackup备份 h ...