题目

传送门: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)的更多相关文章

  1. 【SPOJ】Longest Common Substring II (后缀自动机)

    [SPOJ]Longest Common Substring II (后缀自动机) 题面 Vjudge 题意:求若干个串的最长公共子串 题解 对于某一个串构建\(SAM\) 每个串依次进行匹配 同时记 ...

  2. 【BZOJ1717】产奶的模式(后缀数组)

    [BZOJ1717]产奶的模式(后缀数组) 题面 权限题 hihocoder 洛谷 题解 \(hihocoder\)里面讲的非常好了 这题要求的就是最长可重叠重复K次子串 所谓相同的子串 我们可以理解 ...

  3. 【BZOJ2154】Crash的数字表格(莫比乌斯反演)

    [BZOJ2154]Crash的数字表格(莫比乌斯反演) 题面 BZOJ 简化题意: 给定\(n,m\) 求\[\sum_{i=1}^n\sum_{j=1}^mlcm(i,j)\] 题解 以下的一切都 ...

  4. 【BZOJ2588】Count On a Tree(主席树)

    [BZOJ2588]Count On a Tree(主席树) 题面 题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第 ...

  5. 【BZOJ3436】小K的农场(差分约束)

    [BZOJ3436]小K的农场(差分约束) 题面 由于BZOJ巨慢无比,使用洛谷美滋滋 题解 傻逼差分约束题, 您要是不知道什么是差分约束 您就可以按下\(Ctrl+W\)了 #include< ...

  6. 【Luogu3732】[HAOI2017]供给侧改革(Trie树)

    [Luogu3732][HAOI2017]供给侧改革(Trie树) 题面 洛谷 给定一个纯随机的\(01\)串,每次询问\([L,R]\)之间所有后缀两两之间的\(LCP\)的最大值. 题解 一个暴力 ...

  7. 【BZOJ5339】[TJOI2018]教科书般的亵渎(斯特林数)

    [BZOJ5339][TJOI2018]教科书般的亵渎(斯特林数) 题面 BZOJ 洛谷 题解 显然交亵渎的次数是\(m+1\). 那么这题的本质就是让你求\(\sum_{i=1}^n i^{m+1} ...

  8. 【BZOJ1814】Ural 1519 Formula 1 (插头dp)

    [BZOJ1814]Ural 1519 Formula 1 (插头dp) 题面 BZOJ Vjudge 题解 戳这里 上面那个链接里面写的非常好啦. 然后说几个点吧. 首先是关于为什么只需要考虑三进制 ...

  9. 【BZOJ1880】[Sdoi2009]Elaxia的路线(最短路)

    [BZOJ1880][Sdoi2009]Elaxia的路线(最短路) 题面 BZOJ 洛谷 题解 假装我们知道了任意两点间的最短路,那么我们怎么求解答案呢? 不难发现公共路径一定是一段连续的路径(如果 ...

随机推荐

  1. 理解if __name__ == '__main__':

    一开始没怎么注意这个语句,这两天在模拟知乎登陆时准备刨根问底了,先看两行代码片段 第一个例子:这是在login.py文件的一部分,其他我们忽略,只关注print()函数的内容 import time ...

  2. mongodb的安装与增删改查

    mongodb是一款分布式的文件存储的数据库,注意这两个词,分布式和文件存储.mongodb支持复制和分片,可以合理的运用空间的大小,也可以达到容灾的目的.另外文件存储也是一个特点,抛弃了传统的表的概 ...

  3. BZOJ 4569 【SCOI2016】 萌萌哒

    题目链接:萌萌哒 我先不吐槽题目名……这道题的并查集好像我们考过……既然那道题我没写就来把这道题写了吧(雾 这道题由于合并操作只有\(m\)次,那么很显然的一个想法就是把建一棵线段树类似物,然后每次在 ...

  4. taglist-plus 安装使用

    taglist 可以查看文件中的 类,函数,变量等信息. 在.vimrc中添加: Plugin 'taglist-plus' 然后打开vim编辑器 PluginInstall 使用: 打开taglis ...

  5. 最全android Demo

    1.BeautifulRefreshLayout-漂亮的美食下拉刷新 https://github.com/android-cjj/BeautifulRefreshLayout/tree/Beauti ...

  6. js比较时间大小(时间为以-分割的字符串时)

    function dateCompare(startdate, enddate) {    var arr = startdate.split("-");    var start ...

  7. HDU-4550-贪心

    卡片游戏 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submis ...

  8. bzoj1449&&bzoj2895

    题解: S连每场比赛流量1费用0 每场比赛连参赛队流量1费用0 我们发现调整一次 由win,lose变为 win+1,lose-1的费用为 (C*(win+1)^2+D*(lose-1)^2) - ( ...

  9. Sizzle源码分析:一 设计思路

    一.前言 DOM选择器(Sizzle)是jQuery框架中非常重要的一部分,在H5还没有流行起来的时候,jQuery为我们提供了一个简洁,方便,高效的DOM操作模式,成为那个时代的经典.虽然现在Vue ...

  10. vue.js 源代码学习笔记 ----- text-parse.js

    /* @flow */ import { cached } from 'shared/util' import { parseFilters } from './filter-parser' //找到 ...