2017 济南综合班 Day 6
循环移动
(cyclic.cpp/c/pas)
(1s/256M)
问题描述
给出一个字符串S与N个操作。每个操作用三元组(L, R, K)进行描述:操作将字符串第L个到第R个位置构成的子串循环移动K次。一次循环移动就是将字符串最后的这个字符移动到第一位,其余的字符顺次后移。
例如,对于字符串abacaba,操作(L=3, R=6, K=1)后得到的字符串即为abbacaa。
求出在N个操作后得到的字符串。
输入格式(cyclic.in)
第一行一个字符串S。
第二行一个整数N,代表操作的总数。
接下来N行每行三个数L,R,K,每行代表一个操作。
输出格式(cyclic.out)
一行一个字符串,代表N个操作后的字符串。
样例输入
abbacaa
2
3 6 1
1 4 2
样例输出
ababaca
数据范围与约束
设|S|为字符串S的长度。
对于30%的数据,|S|<=100, N<=100, K<=100
对于100%的数据,|S|<=10000, N<=300, K<=1000,000,1<=L<=R<=|S|
#include<cstdio>
#include<cstring>
#define N 10010
using namespace std;
char s[N],tmp[N];
int n,l,r,k,t,len;
int main()
{
freopen("cyclic.in","r",stdin);
freopen("cyclic.out","w",stdout);
scanf("%s",s+);
len=strlen(s+);
scanf("%d",&n);
while(n--)
{
scanf("%d%d%d",&l,&r,&k);
k%=(r-l+);
if(!k) continue;
t=l;
for(int i=r-k+;i<=r;i++) tmp[t++]=s[i];
for(int i=l;i<=r-k;i++) tmp[t++]=s[i];
for(int i=l;i<=r;i++) s[i]=tmp[i];
}
printf("%s",s+);
}
阅读计划
(book.cpp/c/pas)
(1s/256M)
问题描述
暑假到了,Rick制定了一个长达M天的阅读计划。他一共有N本书,从1至N进行标号;Rick将它们从上至下摞成一堆。他每天都会读一本书,假设他要读编号为X的书,他会按照以下步骤:
1. 将这本书上方的所有书搬起来
2. 将这本书拿出来
3. 将搬起来的书摞回去
4. 看完后把这本书放到顶端
每本书都会有各自的重量,Rick不希望搬起太过重的书。于是他希望能重新安排这N本书的顺序,使得读完M本书之后,搬书的重量之和最小。
输入格式(book.in)
第一行两个整数N与M,分别代表书的数量和阅读的天数。
第二行N个整数,代表每本书的重量。
第三行M个整数,代表每天要读的书的编号。
输出格式(book.out)
一行一个整数,代表最小的重量之和。
样例输入
3 5
1 2 3
1 3 2 3 1
样例输出
12
数据范围与约束
对于30%的数据,N<=10.
对于100%的数据,2<=N<=500, 1<=M<=1000, 每本书重量不超过100.
00%的数据,|S|<=10000, N<=300, K<=1000,000,1<=L<=R<=|S|
贪心:按书的第一次阅读顺序摆放
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,cnt,x,ans;
int weight[],read[];
int first[];
bool v[];
int main()
{
freopen("book.in","r",stdin);
freopen("book.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&weight[i]);
for(int i=;i<=m;i++)
{
scanf("%d",&x);
read[i]=x;
if(!first[x])
{
first[x]=i;
ans+=cnt;
cnt+=weight[x];
}
}
for(int i=;i<=m;i++)
if(first[read[i]]!=i)
{
for(int j=i-;j && read[j]!=read[i];j--)
if(!v[read[j]]) ans+=weight[read[j]],v[read[j]]=true;
memset(v,,sizeof(v));
}
printf("%d",ans);
}
树集
(set.cpp/c/pas)
(1s/256M)
问题描述
给出一棵N个节点的树,每个节点上都附有一个权值ai。现在Ann想从中选出若干个节点,满足以下条件:
1. 至少选出一个节点
2. 节点之间是连通的
3. 设节点中权值最大的为ap,最小的为aq,则需要满足ap-aq不大于某个定值D。
Ann想知道有多少种选择的方式?结果对1,000,000,007取模即可。
输入格式(set.in)
第一行包含两个整数D, N,分别代表定值D与节点总数N。
第二行包含N个整数ai,分别代表每个点的权值。
接下来N-1行,每行包含两个数u, v,代表树中节点u与节点v是相连的。
输出格式(set.out)
一个整数,代表方案数模1,000,000,007的结果。
样例输入
1 4
2 1 3 2
1 2
1 3
3 4
样例输出
8
样例解释
8个选择方式为:{1}, {2}, {3}, {4}, {1, 2}, {1, 3}, {3, 4}, {1, 3, 4}。
数据范围与约束
对于30% 的数据,1<=n<=10;
对于另外的30% 的数据,d=2000.
对于100% 的数据,0<=d<=2000, 1<=n<=2000, 1<=ai<=2000.
树形DP,如何取消d的限制?
枚举x作为选的点集中权值最小的点,
那么可以选的点的点权范围:a[x]——a[x]+d
小细节:如果点权相同,那么规定只能由编号小的走到编号大的
#include<vector>
#include<cstdio>
#define N 2001
#define mod 1000000007
using namespace std;
int d,n,l,r,ans,rt;
int a[N],dp[N];
vector<int>e[N];
void dfs(int now,int last)
{
dp[now]=;
int siz=e[now].size();
for(int i=;i<siz;i++)
{
if(e[now][i]==last) continue;
if(a[e[now][i]]<l || a[e[now][i]]>r || a[e[now][i]]==l&&e[now][i]<rt) continue;
dfs(e[now][i],now);
dp[now]=1ll*dp[now]*(dp[e[now][i]]+)%mod;
}
}
int main()
{
freopen("set.in","r",stdin);
freopen("set.out","w",stdout);
scanf("%d%d",&d,&n);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
int u,v;
for(int i=;i<n;i++)
{
scanf("%d%d",&u,&v);
e[u].push_back(v);
e[v].push_back(u);
}
for(int i=;i<=n;i++)
{
rt=i;
l=a[i];
r=a[i]+d;
dfs(i,);
ans=(ans+dp[i])%mod;
}
printf("%d",ans);
}
2017 济南综合班 Day 6的更多相关文章
- 2017 济南综合班 Day 7
a 两个指针L.R R开始指向恰好[R,n]有不超过k个逆序对的地方 随着L的右移,R指针只会右移 逆序对有2部分 1.L左侧与其他位置形成的逆序对 2.R右侧与其他位置形成的逆序对 用树状数组分别 ...
- 2017 济南综合班 Day 5
毕业考试 (exam.cpp/c/pas) (1s/256M) 问题描述 快毕业了,Barry希望能通过期末的N门考试来顺利毕业.如果他的N门考试平均分能够达到V分,则他能够成功毕业.现在已知每门的分 ...
- 2017 济南综合班 Day 4
T1 外星人 二维前缀和 #include<cstdio> #define N 1001 using namespace std; bool v[N][N]; int sum[N][N]; ...
- 2017 济南综合班 Day 3
T1 黑化 题意: 求一个字符串是否可能包含另一个字符串 字符串中的?可以匹配任意字母 可能输出 God bless You! 一定不可能 输出 Game Over! 计算fail数组时,fail数 ...
- 2017 济南综合班 Day 2
木棍(stick) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK有很多木棍,具体的,总共有n根,且每根木棍都有一个长度.为了方便起见,我们可以用一个正 ...
- 2017 济南综合班 Day 1
送分题(songfen) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK喜欢干一些有挑战的事,比如说求区间最大子段和.它知道这个题目有O(n)的做法.于 ...
- 2017 济南精英班 Day1
不管怎么掰都是n*m-1 #include<cstdio> using namespace std; int main() { freopen("bpmp.in",&q ...
- JavaScript脚本语言基础(四)
导读: JavaScript和DOM DOM文档对象常用方法和属性 DOW文档对象运用 JSON数据交换格式 正则表达式 1.JavaScript和DOM [返回] 文档对象模型(Document O ...
- JeeSite(2):导入数据,进入系统
本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/50954485 未经博主同意不得转载. 博主地址是:http://blog.csd ...
随机推荐
- 家用甲醛pm2.5温湿度传感器实验
最近在装修房子,刷完墙漆铺完了木地板以后,屋里边有很大的味,所以就买了 攀藤科技的PMS5003ST G5ST PM2.5激光粉尘甲醛温湿度三合一传感器,打算自己测一下甲醛浓度,看看什么时候能够入住. ...
- Java学习个人备忘录之关键字final
final关键字final可以修饰类,方法,变量.final修饰的类不可以被继承final修饰的方法不可以被覆盖final修饰的变量是一个常量.只能被赋值一次.内部类只能访问被final修饰的局部变量 ...
- TCP系列08—连接管理—7、TCP 常见选项(option)
一.TCP选项概述 在前面介绍TCP头的时候,我们说过tcp基本头下面可以带有tcp选项,其中有些选项只能在连接过程中随着SYN包发送,有些可以延后.下表汇总了一些tcp选项 其中我标记为红色的部分是 ...
- array_intersect_assoc 与array_intersect区别
1.array_intersect_assoc — 带索引检查计算数组的交集 说明 array array_intersect_assoc ( array $array1 , array $array ...
- Dojo初探
Dojo 是一个由 Dojo 基金会开发的 Javascript 工具包, 据说受到 IBM 的永久支持,其包括四个部分: dojo, dijit, dojox, util dojo: 有时也被称作 ...
- thinkPHP框架单一入口文件解析
一.index.php (可参考ThinkPHP学习手册http://document.thinkphp.cn/manual_3_2.html#entrance_file) index.php单入口 ...
- 【Python】面向对象--类的特殊成员方法
类的特殊成员方法 1. __doc__ 表示类的描述信息 class Func(object): '''__doc__方法是用来打印类的描述信息''' def tell(self): pass def ...
- Codeforces Round #522 Div. 1 没打记
开场被A劝退,写了得有50min于是不敢交了.unrated了喜闻乐见. A:瞎猜都能猜到如果要走到那条直线上,进入直线的点横坐标或纵坐标与起点相同,离开直线的点横坐标或纵坐标与终点相同,证明脑补一下 ...
- hdu 1054 Strategic Game (二分匹配)
Strategic Game Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 前台界面(1)---HTML基本定义及常见标签
已经很久没有更新博客了,从今天开始要继续走在学习的路上,话不多说,先来干货: 目录 1. HTML定义 2. H标签 3. Img标签 4. P标签 5. A标签 6. 无序列表 7. 有序列表 8. ...