洛谷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:基础字符串练习题: 前缀 ...
随机推荐
- Win10 IoT C#开发 4 - UART 串口通信
Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,既可以开发设备UI与用户交互式操作,又可以控制GPIO等接口,使得原来嵌入式繁琐的开发变得简单.通过Remote Debug ...
- 基于小脚丫的ADC081S101 电压采集595数码管显示
RTL结构图 采集模块运用SPI 通讯 MISO方式收集数据 module ad_collect(input sddata,input rst_n,output reg cs,output reg s ...
- 使用eclipse作为python开发工具安装旧版pydev
在Eclipse中: Help->Install New Software add之后输入的链接地址 https://dl.bintray.com/fabioz/pydev/old/ 如果使用从 ...
- JS高程3.基本概念(4)操作符
ECMA-262用于操作数据值的操作符包括: 算术操作符 位操作符 关系操作符 相等操作符 ECMAScript操作符的不同之处在于:它能够适用于很多值,包括字符串,数字值,布尔值,甚至是对象.(在应 ...
- 移动web之用CSS样式写如苹果手机的开关键
话说这个问题纠结了近一个小时,为什么呢?看看就知道了. 在公司的商旅Web移动版本项目上有这么一个交互,需要模仿iphone自带的开关,好吧,肯定没什么问题. Tip:请使用Chrome查看以下案例 ...
- Group-buy项目总结
这是我做的第一个移动端项目,和传统PC端网站不同的是,做移动端的网站要适配各种尺寸的设备. 在默认情况下,移动设备上的viewport都是要大于浏览器可视区域的,这是因为考虑到移动设备的分辨率相对于桌 ...
- JavaScript基本语法(四)
一. JavaScript 函数 1.函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块.我们可以将一些常用的代码封装成函数,待用到的时候就能直接调用使用.利用函数可以使代码的组织结构 ...
- jQuery插件之——简单日历
最近在研究js插件的开发,以前看大神们,对插件都是信手拈来,随便玩弄,感觉自己要是达到那种水平就好了,就开始自己研究插件开发了.研究了一段时间之后,就开始写了自己的第一个日历插件,由于是初学插件开发, ...
- Linux安全基础:awk命令的使用
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各 ...
- iOS项目groups和folder的区别(组和文件夹)
在引用一个第三方框架的时候,已经拖进去了,但是引用框架里面的文件时,竟然报错说找不到.......查了一下,原来在拖进去时没有注意group和folder的选择! 其实仔细观察一下,不难发现,以gro ...