Link:

传送门

A:

由于每个颜色只染色一次就确定了所有要染色的区间

要求染色的次数其实就是求区间最多嵌套多少层,如果有区间相交则无解

以上操作明显可以将左端点排序后用栈来维护

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
#define pb push_back
typedef double db;
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=2e5+;
struct node{int x,d,col;};
node dat[MAXN];int st[MAXN],top;
int n,x,l[MAXN],r[MAXN],cur,res,tot;
bool cmp(node a,node b){return a.x==b.x?a.d<b.d:a.x<b.x;} int main()
{
scanf("%d",&n);
memset(l,0x3f,sizeof(l));
for(int i=;i<=n;i++)
{
scanf("%d",&x);
l[x]=min(l[x],i),r[x]=max(r[x],i);
if(!x) dat[++tot]=node{i,,};
}
for(int i=;i<=n;i++)
if(r[i]) dat[++tot]=node{l[i],,i},dat[++tot]=node{r[i],,i};
sort(dat+,dat+tot+,cmp); for(int i=;i<=tot;i++)
{//注意0代表没有颜色要特殊处理
if(!dat[i].col)
{
if(top) return puts("-1"),;
else continue;
}
if(!dat[i].d)
st[++top]=dat[i].col,cur++;
else
{
if(dat[i].col!=st[top])
return puts("-1"),;
top--;cur--;
}
res=max(res,cur);
}
printf("%d",res);
return ;
}

Problem A

注意零代表没有颜色要特殊处理……

B:

涉及字符串匹配想到哈希,结果一开始写成了$O(n^3*log(n))$

由于最外层的字符串长度的可行性是单调的,二分后可优化为$O(n^2*log(n)^2)$

但上述的复杂度是可以继续优化的

使用$two pointers$来利用单调性,每次可行就移动左端点,否则移动右端点

这样可以只检验$2*n$个字符串,复杂度降到了$O(2*n^2*log(n))$

同时该题也可以每次暴力构造$Trie$树来进行匹配,复杂度为$O(n^3)$

#include <bits/stdc++.h>

using namespace std;
#define X first
#define RG register
#define Y second
#define pb push_back
typedef double db;
typedef long long ll;
typedef pair<int,int> P;
typedef unsigned long long ull;
const int MAXN=1e3+,base=;
ull hs[MAXN][MAXN],pre[MAXN];
int n,m,f;char s[MAXN];
map<ull,int> mp; bool check(int x)
{
for(int i=x;i<=m;i++)
{
mp.clear();f=;
for(RG int k=;k<=n;k++)
mp[hs[k][i]-hs[k][i-x]*pre[x]]=;
for(RG int k=n+;k<=*n;k++)
if(mp[hs[k][i]-hs[k][i-x]*pre[x]]){f=;break;}
if(f) return true;
}
return false;
} int main()
{
scanf("%d%d",&n,&m);
pre[]=;
for(RG int i=;i<=m;i++) pre[i]=pre[i-]*base;
for(RG int i=;i<=*n;i++)
{
scanf("%s",s+);
for(RG int j=;j<=m;j++)
hs[i][j]=hs[i][j-]*base+(s[j]-'A');
} int l=,r=m;
while(l<=r)
{
int mid=(l+r)>>;
if(check(mid)) r=mid-;
else l=mid+;
}
printf("%d",l);
return ;
}

Problem B

$two pointers$对比二分的优越之处就在于其能更及时的纠错

如果当前长度不行就直接加长,而二分则要将该长度的所有字符串都检验过再进行调整

[USACO 2017 Open Gold] Tutorial的更多相关文章

  1. [USACO 2017 Dec Gold] Tutorial

    Link: USACO 2017 Dec Gold 传送门 A: 为了保证复杂度明显是从终结点往回退 结果一开始全在想优化建边$dfs$……其实可以不用建边直接$multiset$找可行边跑$bfs$ ...

  2. [USACO 2017 Feb Gold] Tutorial

    Link: 传送门 A: 分层图最短路(其实就是最短路转移时多记录一维的数据 #include <bits/stdc++.h> using namespace std; #define X ...

  3. [USACO 2017 Jan Gold] Tutorial

    Link: 传送门 A: 按值大小插入后用树状数组统计两边个数 #include <bits/stdc++.h> using namespace std; #define X first ...

  4. [USACO 2018 Feb Gold] Tutorial

    Link: USACO 2018 Feb Gold 传送门 A: $dp[i][j][k]$表示前$i$个中有$j$个0且末位为$k$的最优解 状态数$O(n^3)$ #include <bit ...

  5. [USACO 2018 Jan Gold] Tutorial

    Link: USACO 2018 Jan Gold 传送门 A: 对于不同的$k$,发现限制就是小于$k$的边不能走 那么此时的答案就是由大于等于$k$的边形成的图中$v$所在的连通块除去$v$的大小 ...

  6. USACO 2017 February Gold

    那天打cf前无聊练手 T1.Why Did the Cow Cross the Road 题目大意:N*N的矩阵,从左上角走到右下角,走一步消耗T,每走3步消耗当前所在位置上的权值,求最小消耗 思路: ...

  7. USACO 2017 FEB Gold visitfj 最短路

    题意 有一幅n*n的方格图,n <= 100,每个点上有一个值.从(1,1)出发,走到(n,n),只能走四联通.每走一步花费t,每走三步需要花费走完三步后到达格子的值.求最小花费的值. 拆点,d ...

  8. [USACO 2016 Dec Gold] Tutorial

    Link: 传送门 A: 贪心从小到大插入,用并查集维护连通性 #include <bits/stdc++.h> using namespace std; #define X first ...

  9. [USACO 2018 Open Gold] Tutorial

    Link: 传送门 A: 对于每一条分割线,设本不应在其左侧的个数为$x$ 重点要发现每次一来一回的操作恰好会将一对分别应在左/右侧的一个数从右/左移过去 这样就转直接用树状数组求出最大的$x$即可 ...

随机推荐

  1. 【BZOJ】1188 [HNOI2007]分裂游戏

    [算法]博弈论 [题解] 我们的目的是把游戏拆分成互不影响的子游戏,考虑游戏内的转移. 如果把每堆视为子游戏,游戏之间会相互影响,不成立. 将每堆的一个石子视为子游戏,其产生的石子都在同一个子游戏中. ...

  2. java springmvc4 图片或文件上传

    1.文件配置 配置文件解析 上传文件处理的核心方法 // uploadOneFile.jsp, uploadMultiFile.jsp submit to. @RequestMapping(value ...

  3. 顺序图(Sequence Diagram)

    顺序图(Sequence Diagram): 是一种强调对象间消息传递次序的交互图,又称为时序图或序列图.描述了在一个用例或操作的执行过程中对象如何通过消息相互交互,说明了消息如何在对象之间被发送和接 ...

  4. quartz的简介

    1. 介绍  Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源的任务调度框架,是完全由java开发的一个开源的任务日程管理系统,“任务进度管理器”就是一个在预 ...

  5. Python模块学习 - Argparse

    argparse模块 在Python中,argparse模块是标准库中用来解析命令行参数的模块,用来替代已经过时的optparse模块.argparse模块能够根据程序中的定义从sys.argv中解析 ...

  6. TCP之connect

    1. connect函数: #include <sys/socket.h> int connect(int sockfd, const struct sockaddr *servaddr, ...

  7. Bit banging

    Bit banging Bit banging is a technique for serial communications using software instead of dedicated ...

  8. java===java习题---Josephu问题

    package testbotoo; /** * * @author */ public class Demo4 { public static void main(String[] args) { ...

  9. HDU 5118 GRE Words Once More!

    题目链接:HDU-5118 题意:给定一个有向无环图,每条边有一个权值.标定一些特定节点为“特殊节点”.从节点1出发到某“特殊节点”结束的路径,称为一个“GRE单词”.单词由路径上的权值组成.给定一组 ...

  10. 深入浅出Node.js(一) - 初识Node.js

    1.Node.js将Javascript解决不确定性所使用的事件驱动方式引入了进来,因为JS是一门事件驱动的语言,旨在能够对外界的事件作出响应; 2.Node.js中,所有的有关异步的操作,都在同步操 ...