不知道该更些什么

随便写点东西吧

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)题解的更多相关文章

  1. Codeforces Round #182 (Div. 1)题解【ABCD】

    Codeforces Round #182 (Div. 1)题解 A题:Yaroslav and Sequence1 题意: 给你\(2*n+1\)个元素,你每次可以进行无数种操作,每次操作必须选择其 ...

  2. Codeforces Round #541 (Div. 2)

    Codeforces Round #541 (Div. 2) http://codeforces.com/contest/1131 A #include<bits/stdc++.h> us ...

  3. Codeforces Round #608 (Div. 2) 题解

    目录 Codeforces Round #608 (Div. 2) 题解 前言 A. Suits 题意 做法 程序 B. Blocks 题意 做法 程序 C. Shawarma Tent 题意 做法 ...

  4. Codeforces Round #525 (Div. 2)题解

    Codeforces Round #525 (Div. 2)题解 题解 CF1088A [Ehab and another construction problem] 依据题意枚举即可 # inclu ...

  5. Codeforces Round #528 (Div. 2)题解

    Codeforces Round #528 (Div. 2)题解 A. Right-Left Cipher 很明显这道题按题意逆序解码即可 Code: # include <bits/stdc+ ...

  6. Codeforces Round #466 (Div. 2) 题解940A 940B 940C 940D 940E 940F

    Codeforces Round #466 (Div. 2) 题解 A.Points on the line 题目大意: 给你一个数列,定义数列的权值为最大值减去最小值,问最少删除几个数,使得数列的权 ...

  7. Codeforces Round #677 (Div. 3) 题解

    Codeforces Round #677 (Div. 3) 题解 A. Boring Apartments 题目 题解 简单签到题,直接数,小于这个数的\(+10\). 代码 #include &l ...

  8. Codeforces Round #665 (Div. 2) 题解

    Codeforces Round #665 (Div. 2) 题解 写得有点晚了,估计都官方题解看完切掉了,没人看我的了qaq. 目录 Codeforces Round #665 (Div. 2) 题 ...

  9. Codeforces Round #160 (Div. 1) 题解【ABCD】

    Codeforces Round #160 (Div. 1) A - Maxim and Discounts 题意 给你n个折扣,m个物品,每个折扣都可以使用无限次,每次你使用第i个折扣的时候,你必须 ...

随机推荐

  1. wifi扫描

    获取当前位置的wifi,信道,强度,mac #include "ESP8266WiFi.h" IPAddress apIP(192, 168, 4, 1); void setup( ...

  2. Django Rest Framework(二)

    •基于Django 先创建一个django项目,在项目中创建一些表,用来测试rest framework的各种组件 models.py class UserInfo(models.Model): &q ...

  3. JS JavaScript模块化(ES Module/CommonJS/AMD/CMD)

    前言 前端开发中,起初只要在script标签中嵌入几十上百行代码就能实现一些基本的交互效果,后来js得到重视,应用也广泛起来了, jQuery,Ajax,Node.Js,MVC,MVVM等的助力也使得 ...

  4. HTML之表单

    目录 表单的结构 get方式与post方式 输入 单行文本输入框 提交按钮和重置按钮 密码输入框 复选框 单选按钮 图像按钮 文本选择输入框 隐藏框 多行文本输入框 下拉列表框 新增输入元素 新增其他 ...

  5. FreeMarker 入门

    目录 FreeMarker是什么 为什么要学习FreeMarker FreeMarker相关站点

  6. MySQL之日期时间类型

    mysql(5.5)所支持的日期时间类型有:DATETIME. TIMESTAMP.DATE.TIME.YEAR. 几种类型比较如下: 日期时间类型 占用空间 日期格式 最小值 最大值 零值表示  D ...

  7. 原生js,从面向过程的方法到面向对象的方法,写个选项卡练练手

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. setInterval的简单理解和实验

    setInterval的用法 setInterval(fn_name,time_num); setInterval(fn_name,time_num,这里是函数参数); 意思是,现在不执行fn_nam ...

  9. npm link & unlink

    npm link & unlink https://dev.to/erinbush/npm-linking-and-unlinking-2h1g

  10. Capability配置简介

    什么是Capability desired capability的功能是配置Appium会话.他们告诉Appium服务器您想要自动化的平台和应用程序. Desired Capabilities是一组设 ...