牛客网NOIP赛前集训营-提高组(第八场)
染色
链接:https://ac.nowcoder.com/acm/contest/176/A
来源:牛客网
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld
题目描述
fizzydavid和leo有n个方格排成一排,每个方格初始是白色。fizzydavid有红色染料,leo有蓝色染料。他们共进行了m次操作,在每次操作中,fizzydavid或者leo会选择若干个(可以是零个)连续相邻的方格并用自己的染料给这些格子染色。当一个格子被染成某个颜色时,这种染料会覆盖之前这个格子上的颜色。
现在你并不知道他们每次操作选择了哪些格子,只知道每次操作是谁进行的,以及最终这n个方格的颜色。你需要判断是否存在某种选择格子的方式使得操作完之后n个方格的颜色与给定的相同。你还发现,n个格子最终都不是白色。
输入描述:
第一行包含一个整数T,表示本组数据共有T组测试点。 对每组测试点的第一行是一个由R和B组成的字符串s表示最终格子的颜色。R表示红色,B表示蓝色,同时字符串的长度为n。 第二行是一个由F和L组成的字符串t表示m次操作,F表示某次是fizzydavid操作,L表示是leo操作,同时字符串的长度为m。 所有数据满足T<=20。 50%的数据满足n,m<=15 80%的数据满足n,m<=100 100%的数据满足n,m<=100000
输出描述:
对每组测试点输出一行,如果满足条件输出Yes否则输出No。
输入例子:
3
R
FL
RRRBR
FFFF
BRRBBRB
LFL
输出例子:
Yes
No
Yes
-->
说明
对第一个测试点,第二次操作可以是空的。 对第二个测试点,s中有B,但是t中没有L,因此不合法。 对第三个测试点,BBBBBBB -> BRRRRRB -> BRRBBRB就是合法的。
/*
正序涂色比较难操作,因为一个格子可以被染很多次。可以考虑倒序涂色
会发现每个格子最多会被染色一次。
因为后面的染色会覆盖前面的染色。
所以可以染完色后把格子删掉。然后合并删掉两边的同色格子。
考虑贪心
1.一定会删除尽量多的连续格子 2.一定会优先删中间的格子(删两边没有合并)。 具体实现不必直接操作。只需要统计每个连续的同色的区域个数然后每次做减法就好。
最优操作和不优的操作在这里不会体现出来,这样可以默认是最优操作。
*/
#include<bits/stdc++.h> #define N 100007 using namespace std;
int n,m,T;
char a[N],opt[N]; int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%s",a+);scanf("%s",opt+);
n=strlen(a+);m=strlen(opt+);
int r=,b=;
for(int i=; i<=n; i++)
{
if(a[i]!=a[i-])
{
if(a[i]=='R') r++;
else b++;
}
}
for(int i=m; i>=; i--)
{
if(opt[i]=='F')
{
r--;if(b>=) b--;
}
else
{
b--;
if(r>=) r--;
}
}
if(r<=&&b<=) puts("Yes");
else puts("No");
}
return ;
}
链接:https://ac.nowcoder.com/acm/contest/176/B
来源:牛客网
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld
题目描述
在平面上有n个箱子,每个箱子都可以看成一个矩形,两条边都和坐标轴平行。任何两个矩形都不相交,但可能有某个点或某条边重合。约定x轴正方向为右,y轴正方向为上。
现在Fizzydavid要推这些箱子。他会选择某个箱子开始,并以每秒1个单位的速度使这个箱子向右移动。如果路上正面碰上某个箱子,被碰上的箱子会在碰到的那个瞬间开始进入运动状态,以1个单位的速度向右移动,不会转动或改变运动方向。
准确地说,在某个时刻一个箱子i处于移动状态当且仅当:i是选择的箱子;或者存在一个处于移动状态的箱子j,它的右边界等于箱子i的左边界,且它们在y轴上的投影的公共长度>0。你可以发现在这种情况下,任意时刻每个矩形仍然不相交。
Fizzydavid告诉了你所有的信息,需要你求出k秒后每个矩形的位置。
输入描述:
第一行两个整数n,t和k。Fizzydavid开始选择的是输入的第t个矩形。
对于30%的数据,k<=100。
对于另外40%的数据,n<=1000。
对于所有的数据,n<=105,1<=t<=n,1<=k<=109,所有坐标都在-109和109之间。保证任意两个矩形不相交。
输出描述:
输出一行n个整数,第i个整数表示k秒后第i个矩形的左下角的x坐标。你可以发现只要知道这个值就能唯一确定矩形的位置。
输入例子:
3 1 5
0 0 1 1
1 0 2 1
4 0 5 1
输出例子:
5 6 7
-->
/*
copy
发现矩形之间可以连边
可以转化为类似最短路的问题。
但只能过40
发现有序处理矩形是不严格n^2的,竟然跑过70...
*/
#include<bits/stdc++.h>
#define int long long
#define inf 66666666666ll
#define max(a,b) (a>b?a:b)
using namespace std;
int n,t,k;
struct node
{
long long x1,y1,x2,y2;
int pos;
bool operator <(const node a)const
{
if(x1!=a.x1) return x1<a.x1;
return y1<a.y1;
}
} num[];
int tim[];
long long answer[];
inline long long min(long long a,long long b)
{
return a<b?a:b;
}
signed main()
{
scanf("%lld%lld%lld",&n,&t,&k);
for(int i=; i<=n; i++) scanf("%lld%lld%lld%lld",&num[i].x1,&num[i].y1,&num[i].x2,&num[i].y2),num[i].pos=i;
sort(num+,num+n+);
for(int i=; i<=n; i++) tim[i]=inf;
int start=;
while(num[start].pos!=t && start<=n) start++;
tim[start]=;
for(int i=start+; i<=n; i++)
{
int ans=inf;
for(int j=start; j<i; j++)
{
if((num[j].y1>=num[i].y1 && num[j].y1<num[i].y2) || (num[j].y1<=num[i].y1 && num[j].y2>num[i].y1))
ans=min(ans,tim[j]+num[i].x1-num[j].x2);
}
tim[i]=ans;
if(ans<inf && ans>k) break;
}
for(int i=; i<=n; i++) answer[num[i].pos]=num[i].x1+max(k-tim[i],);
for(int i=; i<=n; i++)
printf("%lld ",answer[i]);
}
70暴力
/*
正解有地方不太懂
时间比较紧了就这样吧...
*/
#include<bits/stdc++.h> #define N 100007 #define ls cur<<1
#define rs cur<<1|1 using namespace std;
int n,t,k,a[N],num,pre[N],ans[N];
struct qwq{
int x1,y1,x2,y2,id;
bool operator <(const qwq &x) const{
return x1<x.x1||(x1==x.x1&&y1<x.y1);
}
} m[N];
struct Node{
int mx,lazy;
} tr[N<<]; inline void pushup(int cur)
{
tr[cur].mx=max(tr[ls].mx,tr[rs].mx);
} inline void pushdown(int cur)
{
if(tr[cur].lazy!=-)
{
tr[ls].mx=tr[cur].lazy,tr[rs].mx=tr[cur].lazy;
tr[ls].lazy=tr[rs].lazy=tr[cur].lazy;
tr[cur].lazy=-;
}
} inline void update(int cur,int l,int r,int L,int R,int c)
{
if(L<=l && r<=R)
{
tr[cur].lazy=tr[cur].mx=c;
return;
}
pushdown(cur);
int mid=(l+r)>>;
if(L<=mid) update(ls,l,mid,L,R,c);
if(mid<R) update(rs,mid+,r,L,R,c);
pushup(cur);
} inline int query(int cur,int l,int r,int L,int R)
{
if(L<=l && r<=R) return tr[cur].mx;
pushdown(cur);
int mid=(l+r)>>,res=;
if(L<=mid) res=max(res,query(ls,l,mid,L,R));
if(mid<R) res=max(res,query(rs,mid+,r,L,R));
return res;
} int main()
{
scanf("%d%d%d",&n,&t,&k);
for(int i=; i<=n; i++)
{
scanf("%d%d%d%d",&m[i].x1,&m[i].y1,&m[i].x2,&m[i].y2);
m[i].id=i;
a[++num]=m[i].y1; a[++num]=m[i].y2;
}
sort(a+,a+num+);
num=unique(a+,a+num+)-a-;
sort(m+,m+n+);
for(int i=; i<=n; i++)
{
ans[m[i].id]=m[i].x1;
if(m[i].id==t)
{
int x=lower_bound(a+,a+num+,m[i].y1)-a;
int y=lower_bound(a+,a+num+,m[i].y2)-a;
update(,,num,x,y,m[i].x2-m[i].x1);
t=i;
break;
}
}
k+=m[t].x1;
ans[m[t].id]=k;
for(int i=t+; i<=n; i++)
{
int x=lower_bound(a+,a+num+,m[i].y1)-a;
int y=lower_bound(a+,a+num+,m[i].y2)-a;
int pre=query(,,num,x,y);
if(!pre || pre+k<=m[i].x1) ans[m[i].id]=m[i].x1;
else
{
ans[m[i].id]=k+pre;
update(,,num,x,y,m[i].x2-m[i].x1+pre);
}
}
for(int i=;i<=n;i++) printf("%d ",ans[i]);
return ;
}
链接:https://ac.nowcoder.com/acm/contest/176/C
来源:牛客网
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld
题目描述
输入描述:
本题有多组测试数据。第一行一个整数T表示测试数据组数。接下来分别是T组数据。每组数据内:
40%的数据保证 1 ≤ n,K ≤ 1000
另外20%的数据保证 1 ≤ n ≤ 10000, K ≥ 100
80%的数据保证 1 ≤ n,K ≤ 10000
100%的数据保证n-1是K的倍数,0 ≤ T ≤ 100,1 ≤ K < n ≤ 100000,0 ≤ S, P, ai ≤ 109,类型为raw的数据的n的和不超过500000。
输出描述:
每组数据输出一行表示答案,一共输出T行。
输入例子:
3
raw
5 2
5 3 4 2 1
raw
7 2
5 3 4 2 1 6 7
random
13 3 2 20
输出例子:
3
4
2
-->
说明
对于样例中第一个测试数据,初始有5个位置未标记,他们的权值是: 5 3 4 2 1 第一回合,最优策略下你选择标记右端的两个位置(即第4个位置和第5个位置),剩下来未被标记的位置的权值为: 5 3 4 第二回合,最优策略下你的对手选择标记左端的一个位置和右端的一个位置(即第1个位置和第3个位置),剩下来未被标记的位置的权值为: 3 这个游戏的最终得分为3。注意当你和你的对手都是用最优策略进行操作时,游戏最终的得分是唯一的。
#include<bits/stdc++.h> #define N 5001
#define M 100007
#define ll long long
#define inf 0x3f3f3f3f using namespace std;
ll n,m,k,s,p,ans,cnt,T;
ll f[N][N],a[M],sum[M];
bool opt; inline int read()
{
int x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} ll min(ll a,ll b){return a<b?a:b;} void solve1()
{
for(int i=;i<=n;i++) for(int j=;j<=n;j++) f[i][j]=-;
for(int i=;i<=n;i++) f[i][i]=a[i];
if(((n-)/k)%==) opt=;
else opt=; for(int L=k;L<n;L+=k)
{
if(L%k!=) continue;
opt^=;
for(int i=;i+L<=n;i++)
{
int j=i+L;ll res1=inf,res2=;
res1=min(res1,f[i+k][j]); res2=max(res2,f[i+k][j]);
res1=min(res1,f[i][j-k]); res2=max(res2,f[i][j-k]);
for(int x=;x<k;x++)
{
if(i+x>j-k+x) break;
if(i+x>n || j-k+x<) continue;
if(f[i+x][j-k+x]==-) continue;
res1=min(res1,f[i+x][j-k+x]); res2=max(res2,f[i+x][j-k+x]);
}
if(opt) f[i][j]=res1;
else f[i][j]=res2;
}
}
ans=max(ans,f[][n]);
} int main()
{
freopen("data.txt","r",stdin);
freopen("2.out","w",stdout);
cin>>T;
while(T--)
{
ans=;
char ch[];scanf("%s",ch);
if(ch[]=='w')
{
n=read();k=read();
for(int i=;i<=n;i++) a[i]=read();
}
else
{
n=read();k=read();a[]=s=read();p=read();
for(int i=;i<=n;i++) a[i]=((*a[i-])%p+)%p;
}
if(n<= && k<=)
{
solve1();//solve2();
}
//else solve2();
cout<<ans<<endl;
}
return ;
}
/*
1
raw
7 2
1 1 9 2 2 2 2 ans=9
*/
40暴力
/*
60暴力
改变一下40暴力dp状态,定义f[i]为以i开头的长度为x*k+1的dp值
这样f[i]就可以对每次操作用单调队列维护答案了。
*/
#include<bits/stdc++.h> #define N 100007
#define ll long long char ch[];
int T,n,k,Tim,head,tail,S,P;
ll num[N],Q[N];; ll Nxt(ll v){return (2333LL*v+6666LL)%P;} bool cmp(ll a, ll b, int d)
{
if(d) return a<=b;
return a>=b;
} int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%s",ch);
if(ch[]=='w')
{
scanf("%d%d",&n,&k);
for(int i=;i<=n;++i) scanf("%lld", &num[i]);
}
else
{
scanf("%d%d%lld%lld",&n,&k,&S,&P);
num[]=S;
for(int i=;i<=n;++i) num[i]=Nxt(num[i-]);
}
Tim=(n-)/k;
for(int t=,d=Tim&;t<=Tim;++t,d=!d)
{
head=tail=;
memset(Q,,sizeof Q);
for(int i=,q=-k;i<=n;++i,++q)
{
while(head<tail && Q[head]<q) ++head;
while(head<tail && cmp(num[Q[tail-]], num[i], d)) --tail;
Q[tail++]=i;
if(q>) num[q]=num[Q[head]];
}
n-=k;
}
printf("%lld\n",num[]);
}
return ;
}
牛客网NOIP赛前集训营-提高组(第八场)的更多相关文章
- 牛客网NOIP赛前集训营-普及组(第二场)和 牛客网NOIP赛前集训营-提高组(第二场)解题报告
目录 牛客网NOIP赛前集训营-普及组(第二场) A 你好诶加币 B 最后一次 C 选择颜色 D 合法括号序列 牛客网NOIP赛前集训营-提高组(第二场) A 方差 B 分糖果 C 集合划分 牛客网N ...
- 牛客网NOIP赛前集训营-提高组(第二场)A 方差
链接:https://www.nowcoder.com/acm/contest/173/A来源:牛客网 题目描述 一个长度为 m 的序列 b[1...m] ,我们定义它的方差为 ,其中 表示序列的平 ...
- [牛客网NOIP赛前集训营-提高组(第一场)]C.保护
链接:https://www.nowcoder.com/acm/contest/172/C来源:牛客网 题目描述 C国有n个城市,城市间通过一个树形结构形成一个连通图.城市编号为1到n,其中1号城市为 ...
- 牛客网NOIP赛前集训营-提高组(第一场)
牛客的这场比赛感觉真心不错!! 打得还是很过瘾的.水平也比较适合. T1:中位数: 题目描述 小N得到了一个非常神奇的序列A.这个序列长度为N,下标从1开始.A的一个子区间对应一个序列,可以由数对[l ...
- 比赛总结——牛客网 NOIP赛前集训营提高组模拟第一场
第一场打的很惨淡啊 t1二分+前缀最小值没想出来,20分的暴力也挂了,只有10分 t2数位dp,调了半天,结果因为忘了判0的特殊情况WA了一个点,亏死 t3emmmm.. 不会 imone说是DSU ...
- 牛客网NOIP赛前集训营-提高组(第一场)B 数数字
数数字 思路: 数位dp 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) #include< ...
- 牛客网NOIP赛前集训营-提高组(第一场)A 中位数
中位数 思路: 二分答案 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) #include< ...
- 牛客网NOIP赛前集训营 提高组 第5场 T2 旅游
[题解] 我们可以发现不在最小生成树上的边一定不能多次经过,因为一条不在最小生成树上的边(u,v)的边权比最小生成树上(u,v)之间的路径更长,选择不在最小生成树上的边一定不划算. 我们还需要确定最小 ...
- 牛客网NOIP赛前集训营-提高组(第四场)游记
牛客网NOIP赛前集训营-提高组(第四场)游记 动态点分治 题目大意: \(T(t\le10000)\)组询问,求\([l,r]\)中\(k(l,r,k<2^{63})\)的非负整数次幂的数的个 ...
- 牛客网NOIP赛前集训营-提高组(第四场)B区间
牛客网NOIP赛前集训营-提高组(第四场)B区间 题目描述 给出一个序列$ a_1 \dots a_n$. 定义一个区间 \([l,r]\) 是好的,当且仅当这个区间中存在一个 \(i\),使得 ...
随机推荐
- Bootstrap3 为何无法显示Glyphicons 图标
Bootstrap3 为何无法显示Glyphicons 图标 在CSS引入字体即可解决 @font-face { font-family: 'Glyphicons Halflings'; src: u ...
- python学习之-- Mysql 基础知识
数据库介绍及MYSQL基础操作了解 关系型数据库(RDBMS)是按照数据结构来组织,存储和管理数据的仓库.特点:1:数据以表格的形式出现2:每行为各种记录名称3:每列为记录名称所对应的数据域4:许多的 ...
- UVAlive 3026 KMP 最小循环节
KMP算法: 一:next数组:next[i]就是前面长度为i的字符串前缀和后缀相等的最大长度,也即索引为i的字符失配时的前缀函数. 二:KMP模板 /* pku3461(Oulipo), hdu17 ...
- HDU 5700 区间交
枚举起点 二分终点 树状数组check #include<iostream> #include<cstring> #include<cmath> #include& ...
- HDU——1054 Strategic Game
Strategic Game Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 如何在 Linux 环境下配置 Nagios Remote Plugin Executor (NRPE)
为 NRPE 配置自定义命令 远程服务器上安装 下面列出了一些可以用于 NRPE 的自定义命令.这些命令在远程服务器的 /etc/nagios/nrpe.cfg 文件中定义. ## 当 1.5.15 ...
- db2安装配置备份还原
环境 cenos 7.0 db2版本 db2_v101_linuxx64_expc.tar 安装db2 解压db2 tar zxvf db2_v101_linuxx64_expc.tar cd exp ...
- 把A表中的a字段和b字段数据 复制到B表中的aa字段和bb字段
insert into tab2 (column1,column2) select column1,column2 from tab1
- 【手记】小心在where中使用NEWID()的大坑 【手记】解决启动SQL Server Management Studio 17时报Cannot find one of more components...的问题 【C#】组件分享:FormDragger窗体拖拽器 【手记】注意BinaryWriter写string的小坑——会在string前加上长度前缀length-prefixed
[手记]小心在where中使用NEWID()的大坑 这个表达式: ABS(CHECKSUM(NEWID())) % 3 --把GUID弄成正整数,然后取模 是随机返回0.1.2这三个数,不可能返回其它 ...
- 挖掘更合适的MVP模式的架构设计
关于MVP,关于android,不得不说这篇博客已经来的非常晚了,这篇博客早就想写了,一直都在偷懒,就不给自己这么久的偷懒找借口了.尽管这篇文章po出来的比較晚.可是我所接触的程序猿一些朋友之 ...