[USACO 2017 Open Gold] Tutorial
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的更多相关文章
- [USACO 2017 Dec Gold] Tutorial
Link: USACO 2017 Dec Gold 传送门 A: 为了保证复杂度明显是从终结点往回退 结果一开始全在想优化建边$dfs$……其实可以不用建边直接$multiset$找可行边跑$bfs$ ...
- [USACO 2017 Feb Gold] Tutorial
Link: 传送门 A: 分层图最短路(其实就是最短路转移时多记录一维的数据 #include <bits/stdc++.h> using namespace std; #define X ...
- [USACO 2017 Jan Gold] Tutorial
Link: 传送门 A: 按值大小插入后用树状数组统计两边个数 #include <bits/stdc++.h> using namespace std; #define X first ...
- [USACO 2018 Feb Gold] Tutorial
Link: USACO 2018 Feb Gold 传送门 A: $dp[i][j][k]$表示前$i$个中有$j$个0且末位为$k$的最优解 状态数$O(n^3)$ #include <bit ...
- [USACO 2018 Jan Gold] Tutorial
Link: USACO 2018 Jan Gold 传送门 A: 对于不同的$k$,发现限制就是小于$k$的边不能走 那么此时的答案就是由大于等于$k$的边形成的图中$v$所在的连通块除去$v$的大小 ...
- USACO 2017 February Gold
那天打cf前无聊练手 T1.Why Did the Cow Cross the Road 题目大意:N*N的矩阵,从左上角走到右下角,走一步消耗T,每走3步消耗当前所在位置上的权值,求最小消耗 思路: ...
- USACO 2017 FEB Gold visitfj 最短路
题意 有一幅n*n的方格图,n <= 100,每个点上有一个值.从(1,1)出发,走到(n,n),只能走四联通.每走一步花费t,每走三步需要花费走完三步后到达格子的值.求最小花费的值. 拆点,d ...
- [USACO 2016 Dec Gold] Tutorial
Link: 传送门 A: 贪心从小到大插入,用并查集维护连通性 #include <bits/stdc++.h> using namespace std; #define X first ...
- [USACO 2018 Open Gold] Tutorial
Link: 传送门 A: 对于每一条分割线,设本不应在其左侧的个数为$x$ 重点要发现每次一来一回的操作恰好会将一对分别应在左/右侧的一个数从右/左移过去 这样就转直接用树状数组求出最大的$x$即可 ...
随机推荐
- 透彻理解Spring事务设计思想之手写实现(山东数漫江湖)
前言 事务,是描述一组操作的抽象,比如对数据库的一组操作,要么全部成功,要么全部失败.事务具有4个特性:Atomicity(原子性),Consistency(一致性),Isolation(隔离性),D ...
- HDU 1231 最大连续子序列 (dp)
题目链接 Problem Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= ...
- position的用法与心得
position的四个属性值: relative absolute fixed static 为了便于理解,首先创建对应的div <div class="main"> ...
- 浅谈游戏中BUFF的设计要点
其实这类帖子并没有多少的设计理论,对于策划的提升和帮助也并不大,原因其实在于其适用性太窄,当我要设计XX象棋的时候,它就滚一边去了. 废话不多说切入正题: 游戏中的BUFF/DEBUFF我们见过很多, ...
- face_recognition 人脸识别报错
[root@localhost examples]# python facerec_from_video_file.py RuntimeError: module compiled against A ...
- arm---先搞清楚各种版本号【转】
转自:http://blog.csdn.net/linnoo/article/details/53214689 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] ARM的几种版本 ...
- glob模块的使用
glob模块 功能描述:glob模块可以使用Unix shell风格的通配符匹配符合特定格式的文件和文件夹,跟windows的文件搜索功能差不多.glob模块并非调用一个子shell实现搜索功能,而是 ...
- pycharm模板参数
# -*- coding: utf-8 -*-# @Time : ${DATE} ${TIME}# @Author : cxa# @File : ${NAME}.py# @Software: ${PR ...
- c#导出文件,下载文件,命名下载后的文件名
Page.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpU ...
- SqlServer存储过程中使用事务,示例
create proc pro_GetProTrans @GoodsId int, @Number int, @StockPrice money, @SupplierId int, @EmpId in ...