洛谷11月月赛round.1
#2 thwfhk 240 (801ms) 100 100 40
P2246 SAC#1 - Hello World(升级版)
题目背景
一天,智障的pipapi正在看某辣鸡讲义学程序设计。
题目描述
在讲义的某一面,他看见了一篇文章。这篇文章由英文字母(大小写均有)、数字、和空白字符(制表/空格/回车)构成。
pipapi想起了他最近刚刚学会写的Hello World程序。他非常好奇,这篇文章中,“HelloWorld”作为子序列到底出现过多少次呢?
由于papapi是个智障,大小写对于他而言毫无区别;因此,“hEllOWorLD”这样的子序列也是可以接受的。O和W之间的空格是也是可以少的;也就是说,“HelloWorld”是可以的。根据标程的意思,就是没有空格,不用考虑空格的情况。
两个子序列相同当且仅当它们每一个字符所在的位置都相同。
由于答案可能很大,请输出结果对1000000007(10^9+7)的余数。
输入输出格式
输入格式:
输入包含若干行。这些行的内容共同构成一篇文章。
文章以EOF(文件结尾)结束。
输出格式:
输出仅包含一个整数,表示这篇文章中“Hello World”出现的次数。
输入输出样例
HhEeLlLlOoWwOoRrLlDd
1536
Gou Li Guo Jia Sheng Si Yi
Qi Yin Huo Fu Bi Qu Zhi
River can feed people
Also can race boats
Hall Ellen Ok Words locked
273
说明
记n为输入的文章的长度(字符数)。
对于20%的数据,n <= 20。
对于50%的数据,n <= 500。
对于所有的数据,15 <= n <= 500000。
直接秒掉,f[i][j]前i个0到j匹配方案数,滚掉第一维
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=5e5+,MOD=1e9+;
int n,m,p,mp[];
char c;
int f[]; int main(){
char s[]="helloworld";
for(int i=;i<;i++) mp[s[i]]=; while((c=getchar())!=EOF){
if((c>='A'&&c<'Z')||(c>='a'&&c<='z')){
if(c<'a') c+='a'-'A';
if(!mp[c]) continue;
//printf("%c\n",c);
if(c=='h') f[]++;
else if(c=='e') f[]+=f[],f[]%=MOD;
else if(c=='l'){
f[]+=f[],f[]%=MOD;
f[]+=f[],f[]%=MOD;
f[]+=f[],f[]%=MOD;
}else if(c=='o'){
f[]+=f[],f[]%=MOD;
f[]+=f[],f[]%=MOD;
}else if(c=='w') f[]+=f[],f[]%=MOD;
else if(c=='r') f[]+=f[],f[]%=MOD;
else if(c=='d') f[]+=f[],f[]%=MOD; }
}
printf("%d",f[]);
}
P2247 SAC#1 - ACOJ云评测计划
题目背景
本题由世界上最蒟蒻最辣鸡最撒比的SOL提供。
寂月城网站是完美信息教室的官网。地址:http://191.101.11.174/mgzd 。
题目描述
ACOJ的服务器简直是差到了一个令人发指的地步。于是SAC的出题人,也就是傻逼SOL,不得不强制要求每一个通过下载ACOJ软件包而搭建的分站,都为主站启动云端评测服务。
云评测服务是由网络来连接的。这样的网络连接是双向的;但是由于地理位置等因素的限制,并不是任意两台服务器都可以直接相连。ACOJ主站已经得到了可以直连的服务器的表,其中包含n个分站(包括主站)以及它们的m条连接情况,可以根据这个来分配各个分站的任务。
有一些分站的服主是SOL的脑残粉。他们会无条件地将他们的服务器提供给SOL。这些ACOJ分站称作“好站”。但是还有一些分站的服主是SOL黑。他们虽然拿到了ACOJ的服务端,但是并不愿意为SOL提供资源,于是利用黑科技关掉了云服务。也就是说,虽然主站仍然认为这些站点存在,但是它们不会起到任何作用——既不能传递通信,也不能进行评测。它们称作“坏站”。
经过千辛万苦的调查,SOL确定了ACOJ云评测系统中有最多k个坏站存在,而且这k个坏站似乎会使得ACOJ的云网络不再联通!大危机!
但是SOL太弱智了,并不能确定是哪k个。于是他请你来帮他找出任意一组可能会使得网络不再联通的k个站点,以便加强防范。
输入输出格式
输入格式:
输入包含m+1行。
第1行3个整数n、m、k。
接下来m行,每行两个整数a、b,表示标号为a和b的站点可以直接相连。
输出格式:
输出包含1行。
不超过k个整数,表示能够将原图割开的任意一组节点组合。
因为使用了Special Judge,所以节点的顺序并不用担心。只需要满足能够割开原图即可。
如果不存在这样的站点集合,输出“How oversuspicious you are, SOL!”;如果网络不存在任何坏站时本来就无法连通,输出“Poor SOL!”。
输入输出样例
4 4 2
1 2
2 3
3 4
4 1
1 3
4 6 2
1 2
2 3
3 4
4 1
1 3
2 4
How oversuspicious you are, SOL!
4 0 2
Poor SOL!
说明
对于20%的数据,n <= 15。
对于另外20%的数据,n <= 100,k=1。
对于另外20%的数据,n <= 100,k=2。
对于100%的数据,3 <= n <= 500,k <= 3,n-k >= 2,云网络不存在自环和重边。
枚举再求割点
也可以每次重构图
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int N=505;
inline int read(){
char c=getchar();int x=0,f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
int n,m,k,a,b;
struct edge{
int v,w,ne;
}e[N*N<<1];
int h[N],cnt=0;
inline void ins(int u,int v){
cnt++;
e[cnt].v=v;e[cnt].ne=h[u];h[u]=cnt;
cnt++;
e[cnt].v=u;e[cnt].ne=h[v];h[v]=cnt;
} int dfn[N],low[N],dfc,scc,iscut[N],cv,nc;
void init(){
for(int i=0;i<=n;i++) dfn[i]=low[i]=iscut[i]=0;
dfc=scc=cv=0;
}
void dfs1(int u,int fa){ nc++;
dfn[u]=low[u]=++dfc;
int child=0;
for(int i=h[u];i;i=e[i].ne){
int v=e[i].v;
if(!dfn[v]){
child++;
dfs1(v,u);
low[u]=min(low[u],low[v]);
if(low[v]>=dfn[u]) iscut[u]=1;
}else if(v!=fa) low[u]=min(low[u],dfn[v]);
}
if(fa==0&&child==1) iscut[u]=0;
if(iscut[u]) cv=u;
} void dfs2(int u,int fa,int del){
dfn[u]=low[u]=++dfc;
int child=0;
for(int i=h[u];i;i=e[i].ne){
int v=e[i].v; if(v==del) continue;
if(!dfn[v]){
child++;
dfs2(v,u,del);
low[u]=min(low[u],low[v]);
if(low[v]>=dfn[u]) iscut[u]=1;
}else if(v!=fa) low[u]=min(low[u],dfn[v]);
}
if(fa==0&&child==1) iscut[u]=0;
if(iscut[u]) cv=u;
} void dfs3(int u,int fa,int del1,int del2){
dfn[u]=low[u]=++dfc;
int child=0;
for(int i=h[u];i;i=e[i].ne){
int v=e[i].v; if(v==del1||v==del2) continue;
if(!dfn[v]){
child++;
dfs3(v,u,del1,del2);
low[u]=min(low[u],low[v]);
if(low[v]>=dfn[u]) iscut[u]=1;
}else if(v!=fa) low[u]=min(low[u],dfn[v]);
}
if(fa==0&&child==1) iscut[u]=0;
if(iscut[u]) cv=u;
}
int main(){
n=read();m=read();k=read();
for(int i=1;i<=m;i++){a=read();b=read();ins(a,b);} dfs1(1,0);
if(nc<n) {puts("Poor SOL!");return 0;}
else if(cv) {printf("%d",cv);return 0;} init();
if(k==2){
dfs2(2,0,1);
if(cv){printf("%d %d",1,cv);return 0;} for(int i=2;i<=n;i++){
init();
dfs2(1,0,i);
if(cv){printf("%d %d",i,cv);return 0;}
}
}else if(k==3){
dfs3(3,0,1,2);
if(cv){printf("%d %d %d",1,2,cv);return 0;}
for(int i=3;i<=n;i++){
init();
dfs3(2,0,1,i);
if(cv){printf("%d %d %d",1,i,cv);return 0;}
}
for(int i=2;i<=n;i++)
for(int j=i+1;j<=n;j++){
init();
dfs3(1,0,i,j);
if(cv){printf("%d %d %d",i,j,cv);return 0;}
}
}
puts("How oversuspicious you are, SOL!");
return 0;
}
P2248 分段
题目描述
给定你n个数,要求将它们分成若干连续的段。
要求:
有m对给定的数不能被分到同一段。
分出一个段的代价是
,其中K和S均为给定的常数,而P则是该段中所有数的最大值,Q是该段中所有数的最小值。
- 要求你求出每段代价之和最小的分段方案。
输入输出格式
输入格式:
第一行两个正整数n和m,表示数的个数和不能共存的m对数。
第二行两个非负整数K和S,含义见题面。
第三行n个非负整数,即给定的n个数。
接下来m行每行2个数和
,表示
和
这两个编号的数不能共存。(编号从1开始)
输出格式:
输出仅一行,表示最小的每段代价之和。
输入输出样例
5 2
3 1
2 3 12 14 16
2 3
3 1
11
说明
对于10%的数据,;
对于30%的数据,;
对于另外10%的数据,;
对于另外30%的数据,;
对于100%的数据,1≤m,n≤100000,0≤K,S,a_i≤100000,1≤pi,qi≤n,pi≠qi。
想了个O(n^2)的DP就打上了,特判了一下S==0,好像没什么用
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=1e5+;
const ll INF=1e18;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int n,m,K,S,a[N],pos[N],p,q;
int mx[N][],mn[N][];
void initRMQ(){
for(int i=;i<=n;i++) mx[i][]=mn[i][]=a[i]; for(int j=;j<=;j++)
for(int i=;i+(<<j)-<=n;i++)
mx[i][j]=max(mx[i][j-],mx[i+(<<(j-))][j-]),
mn[i][j]=min(mn[i][j-],mn[i+(<<(j-))][j-]);
}
int rmq(int l,int r){
int k=log(r-l+)/log();
return max(mx[l][k],mx[r-(<<k)+][k])-min(mn[l][k],mn[r-(<<k)+][k]);
} ll f[N];
void dp(){
for(int i=;i<=n;i++){
f[i]=INF;int p=pos[i];
for(int j=i-;j>=p;j--){
f[i]=min(f[i],f[j]+K+(ll)S*(ll)rmq(j+,i));
p=max(p,pos[j]);
}
}
}
struct range{
int a,b;
bool operator <(const range &r)const{return b<r.b;}
}d[N];
void sol(){
int cnt=;
for(int i=;i<=n;i++) if(pos[i]) d[++cnt]=(range){pos[i],i}; sort(d+,d++cnt);
int last=,ans=;
for(int i=;i<=cnt;i++){
if(d[i].a<=last) continue;
last=d[i].b;
ans++;
}
printf("%d",ans*K+K);
} int main(){
n=read();m=read();K=read();S=read();
for(int i=;i<=n;i++) a[i]=read();
for(int i=;i<=m;i++){
p=read();q=read();
if(p>q) swap(p,q);
pos[q]=max(pos[q],p);
}
if(S==){
sol();
}else{
initRMQ();
dp();
printf("%lld",f[n]);
}
}
洛谷11月月赛round.1的更多相关文章
- 洛谷11月月赛round.2
P3414 SAC#1 - 组合数 题目背景 本题由世界上最蒟蒻最辣鸡最撒比的SOL提供. 寂月城网站是完美信息教室的官网.地址:http://191.101.11.174/mgzd . 题目描述 辣 ...
- 「P4996」「洛谷11月月赛」 咕咕咕(数论
题目描述 小 F 是一个能鸽善鹉的同学,他经常把事情拖到最后一天才去做,导致他的某些日子总是非常匆忙. 比如,时间回溯到了 2018 年 11 月 3 日.小 F 望着自己的任务清单: 看 iG 夺冠 ...
- 「P4994」「洛谷11月月赛」 终于结束的起点(枚举
题目背景 终于结束的起点终于写下句点终于我们告别终于我们又回到原点…… 一个个 OIer 的竞赛生涯总是从一场 NOIp 开始,大多也在一场 NOIp 中结束,好似一次次轮回在不断上演.如果这次 NO ...
- 「LuoguP4995」「洛谷11月月赛」 跳跳!(贪心
题目描述 你是一只小跳蛙,你特别擅长在各种地方跳来跳去. 这一天,你和朋友小 F 一起出去玩耍的时候,遇到了一堆高矮不同的石头,其中第 ii 块的石头高度为 h_ihi,地面的高度是 h_0 = 0 ...
- 洛谷11月月赛(284pts rank85)
https://www.luogu.org/contestnew/show/12006 我是比赛完后在去写的 这是我第一次打洛谷月赛,之前一次是比赛完才去看而且写了第一题就没写后面的了 284分,太水 ...
- 【CSGRound2】逐梦者的初心(洛谷11月月赛 II & CSG Round 2 T3)
题目描述# 给你一个长度为\(n\)的字符串\(S\). 有\(m\)个操作,保证\(m≤n\). 你还有一个字符串\(T\),刚开始为空. 共有两种操作. 第一种操作: 在字符串\(T\)的末尾加上 ...
- 洛谷10月月赛Round.1| P3400 仓鼠窝[单调栈]
题目描述 萌萌哒的Created equal是一只小仓鼠,小仓鼠自然有仓鼠窝啦. 仓鼠窝是一个由n*m个格子组成的行数为n.列数为m的矩阵.小仓鼠现在想要知道,这个矩阵中有多少个子矩阵!(实际上就是有 ...
- 洛谷11月月赛题解(A-C)
心路历程 辣鸡T3卡我1.5h题意,要不是最后nlh跟我解释了一下大样例估计这次是真凉透了.. A P4994 终于结束的起点 打出暴力来发现跑的过最大数据?? 保险起见还是去oeis了一波,然后被告 ...
- 【LGR-065】洛谷11月月赛 III Div.2
临近$CSP$...... 下午打了一发月赛,感觉很爽. 非常菜的我只做了前两题......然而听说前两题人均过...... 写法不优秀被卡到$#1067$...... T1:基础字符串练习题: 前缀 ...
随机推荐
- luogg_java学习_13_GUI
本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! GUI 容器 JFrame , JPanel , JS ...
- 转载:《TypeScript 中文入门教程》 4、类
版权 文章转载自:https://github.com/zhongsp 建议您直接跳转到上面的网址查看最新版本. 介绍 传统的JavaScript程序使用函数和基于原型的继承来创建可重用的组件,但这对 ...
- 从零开始学 Java - Spring 一主多从、多主多从 数据库配置
待会苹果要开发布会 我写完这篇文章就准备去看发布会了,因为我买了好几包瓜子和啤酒.由于苹果的保密做的越来越差劲,该曝光的信息差不多全部曝光了,我们这种熬夜看发布会的只不过是让这些信息更加真实,或者说是 ...
- Lind.DDD.Domain领域模型介绍
回到目录 Lind.DDD.Domain位于Lind.DDD核心项目中,它主要面向领域实体而设计,由一个IEntity的标识接口,EntityBase基类和N个Entity实体类组成,其中IEntit ...
- 线程.FTP.SFTP.打包
Windows就是多线程模式.每一个解决方案就是一个进程.一个进程下拥有多个线程. 简单点.单核的处理器不存在多线程.是CPU在每一个线程上切换处理.在人反应不过来的情况下完成同步的效果. 比如左手画 ...
- Java基础学习--抽象类与抽象函数
abstract class 抽象类不能制造对象,但是可以定义变量,赋给这个变量的一定是他非抽象子类的对象: 抽象类中的抽象函数没有函数体,例如:public abstract void move() ...
- 一个强大的jquery分页插件
点击这里查看效果 这个分页插件使用方便,引用keleyidivpager.js和keleyidivpager.css文件,然后在htm(或者php,aspx,jsp等)页面中对分页总数,参数名,前缀后 ...
- 字典转模型框架 Mantle的使用:国外程序员最常用的iOS模型
Mantle简介 Mantle 是iOS和Mac平台下基于Objective-C编写的一个简单高效的模型层框架. Mantle能做什么 Mantle可以轻松把JSON数据.字典(Dictionary) ...
- CSS background-color 、image 背景图片
背景颜色 background-color 语法: background-color:<color> 默认值:transparent 透明 适用于:所有元素 继承性:无 动画性:是 计算 ...
- MVC学习系列5--Layout布局页和RenderSection的使用
我们开发网站项目的时候,都会遇到这样的问题:就是页面怎么统一风格,有一致的外观,在之前ASP.NET的时代,我们有两种选择,一个是使用MasterPage页,一个是手动,自己在每个页面写CSS样式,但 ...