不知道该更些什么

随便写点东西吧

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. SpringBoot中使用JNnit4(一)之Mockito的使用

    经过入门篇,可以编写出一个简单的测试用例. 这篇讲的是BDDMockito的使用. BDDMockito用于测试时进行打桩处理:通过它可以指定某个类的某个方法在什么情况下返回什么样的值. 在单元测试时 ...

  2. Loj #2331. 「清华集训 2017」某位歌姬的故事

    Loj #2331. 「清华集训 2017」某位歌姬的故事 IA 是一名会唱歌的女孩子. IOI2018 就要来了,IA 决定给参赛选手们写一首歌,以表达美好的祝愿.这首歌一共有 \(n\) 个音符, ...

  3. Linux新手随手笔记1.1

    ifconfig   查询网卡信息 分别是网卡名称,物理IP地址,MAC地址,RX收到数据包大小,TX发送数据包大小 # uname # uname -a 查看内核版本号 # hostname 查看主 ...

  4. C#使用异步操作时的注意要点(翻译)

    异步操作时应注意的要点 使用异步方法返回值应避免使用void 对于预计算或者简单计算的函数建议使用Task.FromResult代替Task.Run 避免使用Task.Run()方法执行长时间堵塞线程 ...

  5. PHP按权重随机

    之前业务部门提了一个需求,要求将广告按照ecpm高低进行随机.(即:ecpm高的获取流量的几率大) 如下数组: //要求AD1的概率要求为50%,AD2概率为25% ,AD3的概率为15%,AD4的概 ...

  6. git@github.com: Permission denied (publickey).////remote: Permission to xxx/test.git denied to xxx.等权限问题

    Error msg git@github.com: Permission denied (publickey) 或者: remote: Permission to xxx/test.git denie ...

  7. iic接口介绍

    最近遇到一个BUG,跟IIC通信有关,所以借这个机会总结一下IIC总线协议 1.引脚接口介绍 1.A0,A1,A2为24LC64的片选信号,IIC总线最多可以挂载8个IIC接口器件,通过对A0,A1, ...

  8. Photoshop调出田园照片唯美手绘油画效果

    先看看效果图 原片分析:妹子脸上的光不够通透,有些灰暗,整体色调不够分明. 后期思路:色彩往油画风格调整,让画面色彩更加油润.丰富. 基础调整 (1)曝光根据照片的实际情况进行调整 (2)增加阴影部分 ...

  9. vue scoped >>> & git conflict <<<<<<< HEAD

    vue scoped >>> & git conflict <<<<<<< HEAD Q: ???还有这操作 A: > > ...

  10. python 所有常用模块汇总

    time:时间 时间戳(timestamp):time.time() 延迟线程的运行:time.sleep(secs) (指定时间戳下的)当前时区时间:time.localtime([secs]) ( ...