Codeforces Round #441 Div. 2题解
比赛的时候E调了好久...F没时间写T T
A:直接走到短的路上来回走就好了
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=,inf=1e9;
int n,a,b,c;
inline void read(int &k)
{
int f=;k=;char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(c<=''&&c>='')k=k*+c-'',c=getchar();
k*=f;
}
int main()
{
read(n);read(a);read(b);read(c);
if(n==)return puts(""),;
int mn=min(a,min(b,c));int now=;
if(a==mn||b==mn)printf("%d\n",mn*(n-));
else printf("%d\n",min(a,b)+mn*(n-));
}
B:将所有数%m,找到最多的相同的数即可
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=,inf=1e9;
int n,k,m,ans,ansi,cntt;
int x[maxn],y[maxn];
int v[maxn];
inline void read(int &k)
{
int f=;k=;char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(c<=''&&c>='')k=k*+c-'',c=getchar();
k*=f;
}
int main()
{
read(n);read(k);read(m);
for(int i=;i<=n;i++)read(x[i]),y[i]=x[i]%m;
for(int i=;i<=n;i++)
{
v[y[i]]++;
if(v[y[i]]>ans)
{
ans=v[y[i]];
ansi=y[i];
}
}
if(ans>=k)
{
puts("Yes");
for(int i=;i<=n;i++)
{
if(y[i]==ansi)printf("%d ",x[i]),cntt++;
if(cntt==k)return ;
}
}
else puts("No");
}
C:答案只可能在[n-100,n]之间,枚举一下就好
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=,inf=1e9;
int n,cnt;
int ans[maxn];
inline void read(int &k)
{
int f=;k=;char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(c<=''&&c>='')k=k*+c-'',c=getchar();
k*=f;
}
int main()
{
read(n);
for(int i=max(,n-);i<=n;i++)
{
int x=i,sum=i;
while(x)
{
sum+=x%;
x/=;
}
if(sum==n)ans[++cnt]=i;
}
printf("%d\n",cnt);
for(int i=;i<=cnt;i++)printf("%d ",ans[i]);
}
D:最后连续的硬币删掉,前面还剩多少个硬币就是答案
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=,inf=1e9;
int n,x;
bool b[maxn];
inline void read(int &k)
{
int f=;k=;char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(c<=''&&c>='')k=k*+c-'',c=getchar();
k*=f;
}
int main()
{
puts("");read(n);int N=n;
for(int i=;i<=n;i++)
{
// printf("%dQAQ\n",N);
read(x);b[x]=;
while(b[N])N--;
printf("%d ",i-(n-N)+);
}
}
E:从每种数字可以改或者不改想到2-SAT,如果第i个字符串比第i+1个字符串小,v[i][j]和v[i+1][j]不一样,那么v[i+1][j]改,v[i][j]就必须改,v[i][j]不改,v[i+1][j]就不能改,如果第i个字符串比第i+1个字符串大,那么v[i][j]必须改,v[i+1][j]不能改,如上连边跑一个可行方案即可。
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cmath>
#include<map>
#define ll long long
using namespace std;
const int maxn=,inf=1e9;
struct poi{int too,pre,x;}e[maxn<<],e2[maxn<<];
int last[maxn],last2[maxn],dfn[maxn],low[maxn],col[maxn],lack[maxn],ru[maxn],rs[maxn],st[maxn],op[maxn];
int n,m,x,y,z,tot,tot2,tott,top,color,flag,len,cnt;
int ans[maxn];
vector<int>v[maxn];
void read(int &k)
{
int f=;k=;char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(c<=''&&c>='')k=k*+c-'',c=getchar();
k*=f;
}
void add(int x,int y){e[++tot].too=y;e[tot].x=x;e[tot].pre=last[x];last[x]=tot;}
void add2(int x,int y){e2[++tot2].too=y;e2[tot2].x=x;e2[tot2].pre=last2[x];last2[x]=tot2;}
int next(int x){return x&?x+:x-;}
void tarjan(int x)
{
dfn[x]=low[x]=++tott;st[++top]=x;lack[x]=top;
for(int i=last[x];i;i=e[i].pre)
if(!dfn[e[i].too])tarjan(e[i].too),low[x]=min(low[x],low[e[i].too]);
else if(!col[e[i].too])low[x]=min(low[x],dfn[e[i].too]);
if(dfn[x]==low[x])for(color++;top>=lack[x];top--)col[st[top]]=color;
}
void topsort()
{
top=;for(int i=;i<=color;i++)if(!ru[i])st[++top]=i;
while(top)
{
int now=st[top--];
if(!rs[now])rs[now]=,rs[op[now]]=;
for(int i=last2[now];i;i=e2[i].pre)
if(!(--ru[e2[i].too]))st[++top]=e2[i].too;
}
}
int main()
{
read(n);read(m);
for(int i=;i<=n;i++)
{
read(len);
for(int j=;j<=len;j++)
read(x),v[i].push_back(x);
}
for(int i=;i<n;i++)
{
int flagg=;
for(int j=;j<min(v[i].size(),v[i+].size());j++)
if(v[i][j]!=v[i+][j])
{
if(v[i][j]<v[i+][j])add(next(v[i+][j]<<),next((v[i][j])<<)),add(v[i][j]<<,v[i+][j]<<);
else add(v[i][j]<<,next((v[i][j])<<)),add(next((v[i+][j])<<),v[i+][j]<<);
flagg=;break;
}
if(!flagg&&v[i].size()>v[i+].size())return puts("No"),;
// else add(next(v[i][min(v[i].size(),v[i+1].size())]<<1),next((v[i+1][min(v[i].size(),v[i+1].size())])<<1));
}
for(int i=;i<=m<<;i++)if(!dfn[i])tarjan(i);
for(int i=;i<=m;i++)
{
if(col[i<<]==col[next(i<<)]){printf("No\n");flag=;break;}
else op[col[i<<]]=col[next(i<<)],op[col[next(i<<)]]=col[i<<];
}
if(flag)return ;
for(int i=;i<=tot;i++)if(col[e[i].x]!=col[e[i].too])add2(col[e[i].too],col[e[i].x]),ru[col[e[i].x]]++;
topsort();
// for(int i=1;i<=tot;i++)printf("QAQ%d %d\n",e[i].x,e[i].too);
//if(rs[col[(i<<1)]]==rs[col[next(i<<1)]])return puts("No"),0;
for(int i=;i<=m;i++)if(rs[col[(i<<)]]!=)ans[++cnt]=i;
printf("Yes\n%d\n",cnt);
for(int i=;i<=cnt;i++)printf("%d ",ans[i]);
return ;
}
F:预处理出每个数每一位是0的那位左边最近的1和右边最近的1,用单调栈找出每个最大值所在的区间,统计答案即可。
T T一开始只预处理了20位查了好久错,浅谈状压写多了的后果
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=,inf=2e9;
int n,top;
int st[maxn],a[maxn],digit[maxn][],pre[maxn][],Pre[maxn],next[maxn][],Next[maxn],cnt[maxn];
ll ans;
inline void read(int &k)
{
int f=;k=;char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(c<=''&&c>='')k=k*+c-'',c=getchar();
k*=f;
}
int main()
{
read(n);
for(int i=;i<=n;i++)
{
read(a[i]);
for(int x=a[i];x;x>>=)digit[i][++cnt[i]]=x&;
}
for(int j=,last=;j<=;j++,last=)
for(int i=;i<=n;i++)
{
if(!digit[i][j])pre[i][j]=last;
if(digit[i][j])last=i;
}
for(int i=;i<=n;i++)
for(int j=;j<=;j++)
if(!digit[i][j])
Pre[i]=max(Pre[i],pre[i][j]);
memset(next,,sizeof(next));
for(int j=,last=n+;j<=;j++,last=n+)
for(int i=n;i;i--)
{
if(!digit[i][j])next[i][j]=last;
if(digit[i][j])last=i;
}
memset(Next,,sizeof(Next));
for(int i=;i<=n;i++)
for(int j=;j<=;j++)
if(!digit[i][j])
Next[i]=min(Next[i],next[i][j]);
a[++n]=inf;
for(int i=;i<=n;i++)
{
for(;top&&a[i]>=a[st[top]];top--)
{
ans+=1ll*((i-)-st[top]+)*(st[top]-(st[top-]+)+);
ans-=1ll*(1ll*st[top]-1ll*max(st[top-]+,Pre[st[top]]+)+)*(min(i-,Next[st[top]]-)-st[top]+);
}
st[++top]=i;
}
printf("%lld\n",ans);
}
Codeforces Round #441 Div. 2题解的更多相关文章
- Codeforces Round #441 (Div. 2)【A、B、C、D】
Codeforces Round #441 (Div. 2) codeforces 876 A. Trip For Meal(水题) 题意:R.O.E三点互连,给出任意两点间距离,你在R点,每次只能去 ...
- Codeforces Round #182 (Div. 1)题解【ABCD】
Codeforces Round #182 (Div. 1)题解 A题:Yaroslav and Sequence1 题意: 给你\(2*n+1\)个元素,你每次可以进行无数种操作,每次操作必须选择其 ...
- Codeforces Round #441 (Div. 2)
Codeforces Round #441 (Div. 2) A. Trip For Meal 题目描述:给出\(3\)个点,以及任意两个点之间的距离,求从\(1\)个点出发,再走\(n-1\)个点的 ...
- 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) 题 ...
随机推荐
- C语言的函数调用过程(栈帧的创建与销毁)
从汇编的角度解析函数调用过程 看看下面这个简单函数的调用过程: int Add(int x,int y) { ; sum = x + y; return sum; } int main () { ; ...
- 【ZABBIX】Zabbix触发器的告警原理及创建方法
概述: 触发器中的表达式使用很灵活,我们可以创建一个复杂的逻辑测试监控,触发器表达式形式如下: {<server>:<key>.<function>(& ...
- Kubernetes v1.10----部署kubernetes-dashboard v1.83
Kubernetes v1.10----部署kubernetes-dashboard v1.83 1.下载 kubernetes-dashboard yaml文件 #因为文件中的image指定的是谷 ...
- 安装好Oracle Client以后没有tnsnames.ora文件
安装好Oracle Client以后没有tnsnames.ora文件 安装完Oracle Client以后,发现相应目录中没有tnsnames.ora文件,其实只要手动建立一个就可以了.在 oracl ...
- Alpha发布—文案+美工展示
目录 团队简介 项目进展 组内分工 队员总结 后期计划 一.团队简介 二.项目进展 从选题发布到今天的Alpha发布,我们团队经历了许许多多的磨难.我们最终设计了如下的功能:首页.班级.个人.更多.打 ...
- 《Linux内核与分析》第四周
20135130王川东 一.用户态.内核态和中断处理过程 CPU的几种不同的执行级别: 高执行级别下,代码可以执行特权指令,访问任意的物理地址,这种执行级别对应内核态: 低级别执行状态下,代码的掌握范 ...
- Alpha冲刺——第六天
Alpha第六天 听说 031502543 周龙荣(队长) 031502615 李家鹏 031502632 伍晨薇 031502637 张柽 031502639 郑秦 1.前言 任务分配是VV.ZQ. ...
- inux下mysql的root密码忘记解决方法
1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库. 因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码保护的 状态下,其他的用户也可以任意地登录 ...
- KeyBoard 操作 !
键盘操作:tab/ enter/ crtl+c ,crtl+v ; import java.awt.*; import java.awt.datatransfer.StringSelection; i ...
- Java MD5加密类
/************************************************* md5 类实现了RSA Data Security, Inc.在提交给IETF 的RFC1321中 ...