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. poj 2104 可持久化线段树

    我们先离散化,然后根据权值建立线段树,假设我们现在有一颗权值线段树,表示在区间1-n中每个数出现了几次,那么我们可以二分的求出来这个区间的k大值,类似sbt的select操作,那么因为点的权值插入是无 ...

  2. js_md5加密和base64的加密解密

    1.最近有些人在爬我们公司的数据,然有了这个md5加密的小需求.为什么叫小需求呢?嗯,之前没做过,会以为很复杂. 其实,是想多了. 2.前端md5加密,其实也并不是安全的,因为代码是可见的.也就是说, ...

  3. mybatis 显示 sql日志

    #项目日志logging.level.com.zhang.com=debug #mybatis sql相关日志显示logging.level.org.mybatis.spring=DEBUGloggi ...

  4. Codeforces Round #483 (Div. 1) 简要题解

    来自FallDream的博客,未经允许,请勿转载,谢谢. 为了证明一下我又来更新了,写一篇简要的题解吧. 这场比赛好像有点神奇,E题莫名是道原题,导致有很多选手直接过掉了(Claris 表演24s过题 ...

  5. 2017-2018-1 20179205《Linux内核原理与设计》第八周作业

    <Linux内核原理与设计>第八周作业 视频学习及操作分析 预处理.编译.链接和目标文件的格式 可执行程序是怎么来的? 以C语言为例,经过编译器预处理.编译成汇编代码.汇编器编译成目标代码 ...

  6. monkey测试===monkeyrunner测试教程(2)

    我先引入一段代码: #test.py from com.android.monkeyrunner import MonkeyRunner as mr device=mr.waitForConnecti ...

  7. FineReport——JS二次开发(局部刷新)

    在FR中,可以通过在form表单设置多个报表模板,然后通过对某一模板刷新实现局部刷新的功能,在cpt模板中,由于只存在一个模板,所以无法实现局部刷新. 其实,最好的局部刷新办法是自定义一个页面,然后添 ...

  8. Mycat 读写分离

    简介 Mycat 是 MySQL中间件,Mycat的原理中最重要的一个动词就是'拦截',它拦截了用户发送过来的SQL语句,首先对SQL语句做了一些特定的分析:如分片分析.路由分析.读写分离分析.缓存分 ...

  9. linux命令(1):sed命令

    实例一: Config_file文件内容如下: sed去除注释行:sed -i -c -e '/^#/d' config_file  [会删除指定文件带有注释行] sed去除空行: sed -i -c ...

  10. liunx命令大全

    Linux常用命令大全   Linux常用命令大全(非常全!!!) 最近都在和Linux打交道,感觉还不错.我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制,当然,这也是很多人 ...