洛谷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:基础字符串练习题: 前缀 ...
随机推荐
- 哈哈:sqlserver2008附加数据库时操作系统错误5(拒绝访问)错误5012的解决办法
老师说:无论干什么,出错了,先大笑三声.如果人多了,在心里也要大笑三声.哈哈哈!!! 刚刚重装系统完后,然后想学习.自己去安装sqlserver2008数据库,完之后想附加之前的数据库.可是当我一点确 ...
- MVC中实现Area几种方法
概述 ASP.NET MVC中,是依靠某些文件夹以及类的固定命名规则去组织model实体层,views视图层和控制层的.如果是大规模的应用程序,经常会由不同功能的模块组成,而每个功能模块 ...
- jQuery Mapael – 呈现动态的矢量地图
jQuery Mapael 是基于 Raphael.js 的一个 jQuery 插件,可以显示动态矢量地图.例如,使用 Mapael 可以显示国家能够点击的世界地图.此外,你可以用圈,方形或者图片来标 ...
- 【JavaScript】详解JSON
目录结构: // contents structure [-] 什么是JSON JSON和XML的比较 相同点 不同点 JSON语法 如何解析JSON文本 eval()方法 JSON.parse()方 ...
- CSS3 莲花盛开动画
点击这里查看效果:http://keleyi.com/a/bjad/32gxxsaw.htm 或者:http://keleyi.com/keleyi/phtml/css3/10a.htm 效果图: 代 ...
- 很漂亮的用户登录界面HTML模板
效果预览:http://keleyi.com/keleyi/phtml/divcss/21.htm HoverTree开源项目实现了分层后,准备实现管理员后台登录,这里先把登录界面的HTML模板整理好 ...
- ALV TREE中双击触发PAI事件的方法
用事件类实现双击事件,实例化后使用set handler注册到ALV对象.斜体部分为事件方法的具体实现. 代码如下 CLASS lcl_tree_event_receiver DEFINITION. ...
- #研发中间件介绍#异步消息可靠推送Notify
郑昀 基于朱传志的设计文档 最后更新于2014/11/11 关键词:异步消息.订阅者集群.可伸缩.Push模式.Pull模式 本文档适用人员:研发 电商系统为什么需要 NotifyServer? ...
- [转载]了解Linux的进程与线程
本文转自Tim Yang的博客http://timyang.net/linux/linux-process/ .对于理解Linux的进程与线程非常有帮助.支持原创.尊重原创,分享知识! 上周碰到部署在 ...
- SQL Server 2012 The report server cannot open a connection to the report server database
案例环境: 操作系统版本: Windows Server 2012 R2 Standard 数据库版本 : SQL SERVER 2012 SP2 案例介绍: 今天进入一台新安装的SQL ...