【Codeforces】Educational Codeforces Round 46(Contest 1000)
题目
传送门:QWQ
A:Codehorses T-shirts
题意:
给定一些字符串表示去年和今年的衣服型号大小( XL XXL M...... ),要求用最少的次数把去年的衣服大小改成今年需要的。每次改动只能更改字符,不能增添字符。
分析:
把今年和去年的型号字典序排一下。然后用挨个对上(因为题目保证合法,所以长度一样的数量必定相等)。在字符串长度是1的时候要暴力匹配一下,因为长度为1时有L S M三种东西。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=;
string a[maxn], b[maxn], q1[maxn], q2[maxn];
int vis[maxn];
int main(){
int n; scanf("%d",&n);
for(int i=;i<=n;i++) cin>>a[i];
for(int i=;i<=n;i++) cin>>b[i];
sort(a+,a++n);sort(b+,b++n);
int ans=;
for(int i=;i<=n;i++){
if(a[i].length()==) continue;
for(int j=;j<a[i].length();j++)
{
if(a[i][j]!=b[i][j]) ans++;
}
}
int k=;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++){
if(a[i].length()!=||b[j].length()!=) continue;
if(a[i]==b[j] && vis[j]==) {
vis[j]=; k--; break;
}
}
for(int i=;i<=n;i++) if(a[i].length()==) k++;
printf("%d\n",ans+k);
return ;
}
B:Light It Up
题意:
给定一个$ 10^18 $ 次方的数轴,在数轴上有一些点表示时间。其中有端点0和M。随着时间的推移,每到一个时间点就改变等的状态。
你可以新插入一个点(或者不插),求插入后总的灯亮的时间。
分析:
显然我插的点肯定是在给的点左一个或右一个·。然后前缀和优化模拟一下。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=;
ll A1[maxn],A2[maxn];
ll M[maxn],maxans;ll sum=;
int main(){
int n;ll m;scanf("%d%I64d",&n,&m);
memset(A1,,sizeof(A1));memset(A2,,sizeof(A2));memset(M,,sizeof(M));
M[]=;M[n+]=m;
for(int i=;i<=n+;i++){
scanf("%I64d",&M[i]);
}
M[n+]=M[n+];
for(int i=;i<=n+;i+=){
A1[i-]=A1[i-];
A1[i]+=A1[i-]+M[i+]-M[i];
}A1[n+]=A1[n+];
for(int i=;i<=n+;i+=){
A2[i-]=A2[i-];
A2[i]+=A2[i-]+M[i+]-M[i];
}
A2[n+]=A2[n+];
for(int i=;i<=n+;i++){
ll ma1,ma2;
if(i%== && M[i]!=M[i-]+){
ma1=A1[i-]-+(A2[n+]-A2[i-]);
ma2=A1[i]-+(A2[n+]-A2[i-]);
}
else if(M[i]!=M[i+]-){
ma1=A1[i-]-+(A2[n+]-A2[i-]);
ma2=A1[i]-+(A2[n+]-A2[i-]);
}
if(i!=) maxans=max(maxans,max(ma1,ma2));
else maxans=ma2;
}
printf("%I64d\n",max(A1[n+],maxans));
return ;
}
C:Covered Points Count
题意:
线段覆盖数轴相关
分析:
大力算一下,如果是左端点就ans++,否则ans--
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=;
ll sum[maxn];
struct Node{
ll a;int type;
bool operator < (const Node& b) const{return a<b.a;}
}A[maxn];
int main(){
int n,cnt=;scanf("%d",&n);
ll l,r;
for(int i=;i<=n;i++){
scanf("%I64d%I64d",&l,&r);
A[++cnt].a=l; A[cnt].type=; A[++cnt].a=r+; A[cnt].type=-;
}
sort(A+,A++cnt);
A[].a=A[].a;
int ans=,preans=;
for(int i=;i<=cnt;i++){
preans=ans; ans+=A[i].type;
sum[preans]+=A[i].a-A[i-].a;
}
for(int i=;i<=n;i++){
printf("%I64d ",sum[i]);
}
return ;
}
/*
5
10000000000 20000000000
10 100000000000000000
10 100000000000000000
10 100000000000000000
10 100000000000000000
*/
D:Yet Another Problem On a Subsequence
题意:
如果一个数组$ a_1.......a_k $ 且 $ a_1 = k-1$,辣么这个数组就是好数组。
一个好序列由好序列和(或)好数组组成。
给出一序列,求他有多少子序列是好序列。
分析:
很显然想到组合数计数一下,但不好处理子序列这个问题。
用$ dp[i] $表示以i开头的好序列的数量
然后对于每个$ a[i] $更新$ dp $
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2000l;const ll MOD=;
ll C[maxn][maxn], a[maxn], dp[maxn];
int main(){
int n;scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%I64d",&a[i]); for(int i=;i<=n+;i++)
for(int j=;j<=n+;j++){
if(j==) C[i][j]=i;
else C[i][j]=(C[i-][j]+C[i-][j-])%MOD;
} dp[n+]=;
for(int i=n-;i>=;i--){
if(a[i]<= || a[i]+i>n) continue;
for(int j=i+a[i]+;j<=n+;j++){
dp[i]=(dp[i]+C[j-i-][a[i]]*dp[j])%MOD;
}
} ll ans=;
for(int i=;i<=n;i++){
ans=(ans+dp[i])%MOD;
}
printf("%I64d\n",ans);
return ;
}
E:We Need More Bosses
题意:
求一张图桥最多的路径上桥的数量
分析:
缩点后求树的直径
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=;
struct Edge{ int u,v; };
vector<Edge> edges; vector<int> G[maxn], g[maxn];
int n, m ;
void Addedge(int a,int b){
edges.push_back((Edge){a,b}); edges.push_back((Edge){b,a});
int m=edges.size(); G[a].push_back(m-);G[b].push_back(m-);
}
int dfs_clock, low[maxn], pre[maxn], q[maxn], fron, scc_cnt, scc[maxn];
int dfs(int u,int fa){
int lowu=pre[u]=++dfs_clock;
q[++fron]=u;
for(int i=;i<G[u].size();i++){
int v=edges[G[u][i]].v, lowv;
if(u==fa) continue;
if(!pre[v]){
lowv=dfs(v,u); lowu=min(lowu,lowv);
// if(lowv>=pre[u]){ ok[G[u][i]]=1; ok[G[u][i]^1]=1;}
}
else{
if(pre[v]<pre[u] && v!=fa) lowu=min(lowu,pre[v]);
}
}
low[u]=lowu;
if(pre[u]==low[u]){
scc_cnt++;
for(;;){
int x=q[fron--]; scc[x]=scc_cnt;
if(x==u) break;
}
}
return lowu;
}
queue<int> que;
int dis[maxn], inq[maxn];
void dist(int x,int f){
dis[x]=dis[f]+;
for(int i=;i<g[x].size();i++){ int v=g[x][i]; if(v==f) continue;//printf("============ %d\n",v);
dist(v,x);
}
}
int main(){
scanf("%d%d",&n,&m);
int x,y;
for(int i=;i<=m;i++){
scanf("%d%d",&x,&y); Addedge(x,y);
}
dfs(,-);
for(int i=;i<edges.size();i++){
Edge e=edges[i];
// printf("--------- %d %d\n",scc[e.u],scc[e.v]);
if(scc[e.u]!=scc[e.v]) g[scc[e.u]].push_back(scc[e.v]);
}
dist(,);int mx=,mp=;
for(int i=;i<=scc_cnt;i++){
if(dis[i]>mx) mx=dis[i],mp=i;
}
memset(dis,,sizeof(dis));
dist(mp,); mx=;
for(int i=;i<=scc_cnt;i++) mx=max(mx,dis[i]);
printf("%d\n",mx-);
return ;
}
【Codeforces】Educational Codeforces Round 46(Contest 1000)的更多相关文章
- 【SPOJ】Longest Common Substring II (后缀自动机)
[SPOJ]Longest Common Substring II (后缀自动机) 题面 Vjudge 题意:求若干个串的最长公共子串 题解 对于某一个串构建\(SAM\) 每个串依次进行匹配 同时记 ...
- 【BZOJ1717】产奶的模式(后缀数组)
[BZOJ1717]产奶的模式(后缀数组) 题面 权限题 hihocoder 洛谷 题解 \(hihocoder\)里面讲的非常好了 这题要求的就是最长可重叠重复K次子串 所谓相同的子串 我们可以理解 ...
- 【BZOJ2154】Crash的数字表格(莫比乌斯反演)
[BZOJ2154]Crash的数字表格(莫比乌斯反演) 题面 BZOJ 简化题意: 给定\(n,m\) 求\[\sum_{i=1}^n\sum_{j=1}^mlcm(i,j)\] 题解 以下的一切都 ...
- 【BZOJ2588】Count On a Tree(主席树)
[BZOJ2588]Count On a Tree(主席树) 题面 题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第 ...
- 【BZOJ3436】小K的农场(差分约束)
[BZOJ3436]小K的农场(差分约束) 题面 由于BZOJ巨慢无比,使用洛谷美滋滋 题解 傻逼差分约束题, 您要是不知道什么是差分约束 您就可以按下\(Ctrl+W\)了 #include< ...
- 【Luogu3732】[HAOI2017]供给侧改革(Trie树)
[Luogu3732][HAOI2017]供给侧改革(Trie树) 题面 洛谷 给定一个纯随机的\(01\)串,每次询问\([L,R]\)之间所有后缀两两之间的\(LCP\)的最大值. 题解 一个暴力 ...
- 【BZOJ5339】[TJOI2018]教科书般的亵渎(斯特林数)
[BZOJ5339][TJOI2018]教科书般的亵渎(斯特林数) 题面 BZOJ 洛谷 题解 显然交亵渎的次数是\(m+1\). 那么这题的本质就是让你求\(\sum_{i=1}^n i^{m+1} ...
- 【BZOJ1814】Ural 1519 Formula 1 (插头dp)
[BZOJ1814]Ural 1519 Formula 1 (插头dp) 题面 BZOJ Vjudge 题解 戳这里 上面那个链接里面写的非常好啦. 然后说几个点吧. 首先是关于为什么只需要考虑三进制 ...
- 【BZOJ1880】[Sdoi2009]Elaxia的路线(最短路)
[BZOJ1880][Sdoi2009]Elaxia的路线(最短路) 题面 BZOJ 洛谷 题解 假装我们知道了任意两点间的最短路,那么我们怎么求解答案呢? 不难发现公共路径一定是一段连续的路径(如果 ...
随机推荐
- 这是一份很详细的 Retrofit 2.0 使用教程(含实例讲解)
前言 在Andrroid开发中,网络请求十分常用 而在Android网络请求库中,Retrofit是当下最热的一个网络请求库 今天,我将献上一份非常详细Retrofit v2.0的使用教程,希望你们会 ...
- 强大的XML
2018-04-23 20:29:26 XML:Extensible Markup Language,也就是可扩展标记语言.XML和HTML格式是古老的标记通用语言SGML的衍生语言. XML文件是可 ...
- wpf--- TextBlock文字设置属性
ProgressBar控件的重要属性: FontFamily——控件中显示文本的字体 FontSize——控件中显示的字体的大小 Foreground——控件 ...
- 《高级Web应用程序设计》课程学习(20170911)
一.课程内容 本学期课件,点击查看 二.作业相关 上交作业的方法 访问ftp://192.168.42.254:22,登录后找到自己的姓名文件夹,放入作业即可.登录账号为stu1,密码为空 作业列表, ...
- vue/webpack的一些小技巧
都知道我比较懒,今天给大家分享的就是如何让自己省事. 一.vue修改打包后的结构(不知道怎么描述合理,看效果图) /config/index.js 默认的: 修改的:(顺手修改了打包后的文件名) 这样 ...
- TryUpdateModel方法 模型绑定
文档资料:https://msdn.microsoft.com/zh-cn/library/ee728634.aspx 有很多重载其中 Controller.TryUpdateModel<TMo ...
- vue 表单校验 一
表单校验 一 最近使用elment-ui表单进行各种校验,心力交瘁,依旧不能很好地解决,先列出自己的归类,后期一个个攻破 表单校验史 表单校验准则 参考资源 1 2 3 4 5 第一种 显示明确的错误 ...
- LoadRunner设置监控Windows系统资源步骤
一般在客户端通过LoadRunner对服务器进行压力测试,都需要实时监控服务器端的系统资源,本篇主要简单介绍一下如何设置在LoadRunner的Controller中配置监控Windows Resou ...
- 利用U盘大白菜软件来重装win7系统
个人装win7系统用了两个U盘,一个做启动盘(FAT32格式),另外一个当做系统盘(NTFS格式). 首先在电脑里面下载一个大白菜软件,并且安装好,打开软件,插上U盘,检测到了该U盘即可一键制作启动盘 ...
- bootstrap table教程--后台数据绑定、特殊列处理、排序
上一篇文章介绍了基本的使用教程.本节主要介绍Bootstrap的后台数据绑定.特殊列处理及列的排序功能 1.数据绑定 一般做程序设计,很少是使用json文件直接绑定数据.基本上我们都是使用编程语言进行 ...