Codeforces Round #541 (Div. 2)题解
不知道该更些什么
随便写点东西吧
https://codeforces.com/contest/1131
ABC
太热了不写了
D
把相等的用并查集缩在一起
如果$ x<y$则从$ x$往$y$连边
如果并查集内有边或边构成环则无解
否则做一遍拓扑输出答案
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rt register int
#define ll long long
using namespace std;
inline ll read(){
ll x = ; char zf = ; char ch = getchar();
while (ch != '-' && !isdigit(ch)) ch = getchar();
if (ch == '-') zf = -, ch = getchar();
while (isdigit(ch)) x = x * + ch - '', ch = getchar(); return x * zf;
}
void write(ll y){if(y<)putchar('-'),y=-y;if(y>)write(y/);putchar(y%+);}
void writeln(const ll y){write(y);putchar('\n');}
int i,j,k,m,n,x,y,z,cnt,sum;
char c[][];int fa[];
int ask(int x){
return (x==fa[x])?x:(fa[x]=ask(fa[x]));
}
void unite(int x,int y){
int p=ask(x),q=ask(y);
if(p!=q)fa[q]=p;
}
struct query{
int x,y;
}q[];int t;
int F[],L[],N[],a[],du[],ans[];
void add(int x,int y){
a[++k]=y;du[y]++;
if(!F[x])F[x]=k;
else N[L[x]]=k;
L[x]=k;
}
int qu[],h;bool vis[];
int main(){
n=read();m=read();
for(rt i=;i<=n+m;i++)fa[i]=i;
for(rt i=;i<=n;i++){
scanf("%s",c[i]+);
}
for(rt i=;i<=n;i++)
for(rt j=;j<=m;j++)if(c[i][j]=='=')unite(i,j+n);
else if(c[i][j]=='<')q[++t]={i,j+n};
else q[++t]={j+n,i};
for(rt i=;i<=t;i++){
int x=ask(q[i].x),y=ask(q[i].y);
if(x==y){
puts("No");
return ;
}
add(x,y);
}
h=t=;
for(rt i=;i<=n+m;i++)if(!du[i]&&i==ask(i))qu[++t]=i,ans[i]=;
while(h<t){
x=qu[++h];vis[x]=;
for(rt i=F[x];i;i=N[i]){
ans[a[i]]=max(ans[a[i]],ans[x]+);
if(!--du[a[i]])qu[++t]=a[i];
}
}
for(rt i=;i<=n+m;i++)if(i==ask(i)&&du[i]){
puts("No");return ;
}
puts("Yes");
for(rt i=;i<=n;i++)write(ans[ask(i)]),putchar(' ');putchar('\n');
for(rt i=n+;i<=n+m;i++)write(ans[ask(i)]),putchar(' ');
return ;
}
E
写法很多,关键是要找到一种好写的写法
对每个字符串的每个字符求出其前后缀长度和最长连续子串的长度
$ f_{i,j}$表示前$ i$个字符串的积字符$ j$的最长连续子串长度
对下一个要乘的字符串进行讨论(是否全部相同)
注意细节就好了
#include<ctime>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#define rt register int
#define ll long long
using namespace std;
inline ll read(){
ll x=;char zf=;char ch=getchar();
while(ch!='-'&&!isdigit(ch))ch=getchar();
if(ch=='-')zf=-,ch=getchar();
while(isdigit(ch))x=x*+ch-'',ch=getchar();return x*zf;
}
void write(ll y){if(y<)putchar('-'),y=-y;if(y>)write(y/);putchar(y%+);}
void writeln(const ll y){write(y);putchar('\n');}
int k,m,n,x,y,z,cnt,ans,len;
char c[];
int f[][];//最长子串
int pre[],succ[],mx[];
void chk(){
for(rt i='a';i<='z';i++){
for(rt j=;j<=len+;j++)if(c[j]!=i||j>len){
pre[i-'a']=j-;
break;
}
for(rt j=len;j>=;j--)if(c[j]!=i||j<=){
succ[i-'a']=len-j;
break;
}
int now=;mx[i-'a']=;
for(rt j=;j<=len;j++){
if(c[j]==i)now++;
if(j==len||c[j]!=i){
mx[i-'a']=max(mx[i-'a'],now);
now=;
}
}
}
}
int main(){
n=read();
for(rt i=;i<=n;i++){
scanf("%s",c+);len=strlen(c+);chk();
if(i==)for(rt j='a';j<='z';j++)f[][j-'a']=mx[j-'a'];
else {
for(rt j='a';j<='z';j++)if(f[i-][j-'a'])f[i][j-'a']=;
for(rt j='a';j<='z';j++)if(f[i-][j-'a']){
if(pre[j-'a']==len)
f[i][j-'a']=(f[i-][j-'a']+)*len+f[i-][j-'a'];
else f[i][j-'a']=+pre[j-'a']+succ[j-'a'];
}
}
for(rt j='a';j<='z';j++)f[i][j-'a']=max(f[i][j-'a'],mx[j-'a']);
}
int ans=;
for(rt i='a';i<='z';i++)ans=max(ans,f[n][i-'a']);
cout<<ans;
return ;
}
F
大送分题
按题意模拟,每次合并$x,y$的时候新建一个新点连向$ x,y$所对应的根
然后一遍$ dfs$结束
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rt register int
#define ll long long
#define p 998244353
using namespace std;
inline ll read(){
ll x = ; char zf = ; char ch = getchar();
while (ch != '-' && !isdigit(ch)) ch = getchar();
if (ch == '-') zf = -, ch = getchar();
while (isdigit(ch)) x = x * + ch - '', ch = getchar(); return x * zf;
}
void write(ll y){if(y<)putchar('-'),y=-y;if(y>)write(y/);putchar(y%+);}
void writeln(const ll y){write(y);putchar('\n');}
int i,j,k,m,n,x,y,z,cnt,sum;
int F[],N[],L[],a[],fa[];
void add(int x,int y){
a[++k]=y;fa[y]=x;
if(!F[x])F[x]=k;
else N[L[x]]=k;
L[x]=k;
}
int ask(int x){
return (x==fa[x])?x:(fa[x]=ask(fa[x]));
}
void dfs(int x){
if(x<=n)write(x),putchar(' ');
for(rt i=F[x];i;i=N[i])dfs(a[i]);
}
int main(){
n=read();
for(rt i=;i<=n;i++)fa[i]=i;
cnt=n;
for(rt i=;i<n;i++){
x=read();y=read();
cnt++;fa[cnt]=cnt;
int id1=ask(x),id2=ask(y);
add(cnt,id1);add(cnt,id2);
}
dfs(cnt);
return ;
}
G
小清新DP题
(有好多人带$\log$都过了
先对每个多米诺骨牌$ i$求出$ L_i$和$ R_i$表示往左/右最近的不能推倒的位置
用一个单调栈维护
即如果当前栈顶能够被这个多米诺骨牌推倒则一定不可能成为后面的多米诺骨牌的L/R值
求出L/R之后进行DP
设$ f_i$表示推倒了前$ i$个的最小花费
分两种转移
如果当前多米诺骨牌往左倒则$ f_i=f_{L_i}+cost_i$
这种显然可以$ O(1)$转移
如果是之前的某个多米诺骨牌往右倒则$f_i=\min(f_j+cost_{j+1})(R_j>i)$
用一个单调栈维护
容易发现由于题目的优秀性质,如果三块多米诺骨牌$ k<j<i$满足$ k和j$都能倒到$ i$
则$ R_k \geq R_j$
因此所有能够倒到当前多米诺骨牌的牌一定满足原位置越靠左R值反而越大
用一个单调栈维护R值,每次把栈中所有不能到达当前多米诺骨牌的R值弹出取栈顶转移
维护一个离栈顶越近,转移费用$ f_j+cost_{j+1}$越小,R值越大的单调栈
就可以$ O(1)$转移了
#include<ctime>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#define rt register int
#define ll long long
using namespace std;
inline ll read(){
ll x=;char zf=;char ch=getchar();
while(ch!='-'&&!isdigit(ch))ch=getchar();
if(ch=='-')zf=-,ch=getchar();
while(isdigit(ch))x=x*+ch-'',ch=getchar();return x*zf;
}
void write(ll y){if(y<)putchar('-'),y=-y;if(y>)write(y/);putchar(y%+);}
void writeln(const ll y){write(y);putchar('\n');}
int m,n,x,y,z,cnt,ans;
vector<int>a[],b[];
int k[],h[],t;ll c[];
int L[],R[];
int sta[],top;ll dp[],fy[];
int main(){
m=read();n=read();
for(rt i=;i<=m;i++){
k[i]=read();
a[i].resize(k[i]);b[i].resize(k[i]);
for(auto &x:a[i])x=read();
for(auto &x:b[i])x=read();
}
for(rt T=read();T;T--){
int id=read(),ct=read();
for(rt i=;i<k[id];i++)t++,h[t]=a[id][i],c[t]=1ll*b[id][i]*ct;
}
for(rt i=;i<=n;i++)L[i]=R[i]=i;
sta[top=]=;
for(rt i=;i<=n;i++){
while(i-sta[top]<h[i]&&top)top--;
L[i]=sta[top];sta[++top]=i;
}
sta[top=]=n+;
for(rt i=n+;i>=;i--){
while(sta[top]-i<h[i]&&top)top--;
R[i]=sta[top];sta[++top]=i;
}
dp[]=;
sta[top=]=;
for(rt i=;i<=n;i++){
dp[i]=dp[L[i]]+c[i];
while(R[sta[top]]<=i&&top)top--;
if(top)dp[i]=min(dp[i],fy[sta[top]]);fy[i]=dp[i-]+c[i];
while(top&&R[sta[top]]==R[i]&&fy[i]<=fy[sta[top]])top--;
if(top==||fy[i]<fy[sta[top]])sta[++top]=i;
}
cout<<dp[n];
return ;
}
Codeforces Round #541 (Div. 2)题解的更多相关文章
- Codeforces Round #182 (Div. 1)题解【ABCD】
Codeforces Round #182 (Div. 1)题解 A题:Yaroslav and Sequence1 题意: 给你\(2*n+1\)个元素,你每次可以进行无数种操作,每次操作必须选择其 ...
- Codeforces Round #541 (Div. 2)
Codeforces Round #541 (Div. 2) http://codeforces.com/contest/1131 A #include<bits/stdc++.h> us ...
- Codeforces Round #608 (Div. 2) 题解
目录 Codeforces Round #608 (Div. 2) 题解 前言 A. Suits 题意 做法 程序 B. Blocks 题意 做法 程序 C. Shawarma Tent 题意 做法 ...
- Codeforces Round #525 (Div. 2)题解
Codeforces Round #525 (Div. 2)题解 题解 CF1088A [Ehab and another construction problem] 依据题意枚举即可 # inclu ...
- Codeforces Round #528 (Div. 2)题解
Codeforces Round #528 (Div. 2)题解 A. Right-Left Cipher 很明显这道题按题意逆序解码即可 Code: # include <bits/stdc+ ...
- Codeforces Round #466 (Div. 2) 题解940A 940B 940C 940D 940E 940F
Codeforces Round #466 (Div. 2) 题解 A.Points on the line 题目大意: 给你一个数列,定义数列的权值为最大值减去最小值,问最少删除几个数,使得数列的权 ...
- Codeforces Round #677 (Div. 3) 题解
Codeforces Round #677 (Div. 3) 题解 A. Boring Apartments 题目 题解 简单签到题,直接数,小于这个数的\(+10\). 代码 #include &l ...
- Codeforces Round #665 (Div. 2) 题解
Codeforces Round #665 (Div. 2) 题解 写得有点晚了,估计都官方题解看完切掉了,没人看我的了qaq. 目录 Codeforces Round #665 (Div. 2) 题 ...
- Codeforces Round #160 (Div. 1) 题解【ABCD】
Codeforces Round #160 (Div. 1) A - Maxim and Discounts 题意 给你n个折扣,m个物品,每个折扣都可以使用无限次,每次你使用第i个折扣的时候,你必须 ...
随机推荐
- ASP.NET Core 下的依赖注入(一)
本文介绍利用 Microsoft.Extensions.Configuration.Binder.dll 来实现超级简单的注入. 1. appsettings.json 中定义配置 假设我们有如下配置 ...
- 为什么要花钱学 Python,自学不好吗?
买了这么多课程,有哪一门是你从头到尾听完,并且能将知识点学以致用的?如果你想成为一名相对优秀的程序员,建议你读完这篇文章,如果愿意可以分享给你的朋友. 2018过去的一年,对大多数互联网人来说,201 ...
- Mysql基本命令及数据库存储位置
连接数据库: sudo mysql -p+密码 例如:sudo mysql -p123456 1.显示数据库列表. show databases; 2.显示库中的数据表: use mysql: //打 ...
- 腾讯通信云服务端使用心得,腾讯云IM
腾讯通信云服务端使用心得 1.腾讯通信服务入口并创建应用 方便使用保留url地址 : https://cloud.tencent.com/product/im 注册账号腾讯云账号->通过审核 ...
- NIO的初步入门
NIO java NIO简介 Java NIO 简介 是从java1.4版本开始引入的一个新的IO AP可以替代标准java IO API NIO与原来的IO有同样的作用和目的,但是使用方式完全不同 ...
- 2.nginx_rewrite模块
rewrite syntax: rewrite regex replacement [flag] Default: — Context: server, location, if 如果正则表达式(re ...
- Java 学习体系结构
一. JavaWEB 阶段课程体系结构 java se基础学习 二 .JavaWEB 阶段课程体系结构 第一阶段:前端开发阶段 1 HTML 2 CSS JS 3JS 4 JQuery ...
- 调试ucosii_pendsv中断函数有感
发现自己的代码的意思和自己理解的意思有不相同的时候,自己先用printf打印输出分析 当发现是自己那一个知识点没有掌握好时,自己用其他的C编译器,仿写用到的知识点的程序,然后掌握该知识点. 最后实在找 ...
- BZOJ2339[HNOI2011]卡农——递推+组合数
题目链接: [HNOI2011]卡农 题目要求从$S=\{1,2,3……n\}$中选出$m$个子集满足以下三个条件: 1.不能选空集 2.不能选相同的两个子集 3.每种元素出现次数必须为偶数次 我们考 ...
- ZuulFilter 执行顺序
说明: 创建了两个Filter,分别是 PreFilter public class PreFilter extends ZuulFilter { public PreFilter() { super ...