循环移动

(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的更多相关文章

  1. 2017 济南综合班 Day 7

     a 两个指针L.R R开始指向恰好[R,n]有不超过k个逆序对的地方 随着L的右移,R指针只会右移 逆序对有2部分 1.L左侧与其他位置形成的逆序对 2.R右侧与其他位置形成的逆序对 用树状数组分别 ...

  2. 2017 济南综合班 Day 5

    毕业考试 (exam.cpp/c/pas) (1s/256M) 问题描述 快毕业了,Barry希望能通过期末的N门考试来顺利毕业.如果他的N门考试平均分能够达到V分,则他能够成功毕业.现在已知每门的分 ...

  3. 2017 济南综合班 Day 4

    T1 外星人 二维前缀和 #include<cstdio> #define N 1001 using namespace std; bool v[N][N]; int sum[N][N]; ...

  4. 2017 济南综合班 Day 3

    T1  黑化 题意: 求一个字符串是否可能包含另一个字符串 字符串中的?可以匹配任意字母 可能输出 God bless You! 一定不可能 输出 Game Over! 计算fail数组时,fail数 ...

  5. 2017 济南综合班 Day 2

    木棍(stick) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK有很多木棍,具体的,总共有n根,且每根木棍都有一个长度.为了方便起见,我们可以用一个正 ...

  6. 2017 济南综合班 Day 1

    送分题(songfen) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK喜欢干一些有挑战的事,比如说求区间最大子段和.它知道这个题目有O(n)的做法.于 ...

  7. 2017 济南精英班 Day1

    不管怎么掰都是n*m-1 #include<cstdio> using namespace std; int main() { freopen("bpmp.in",&q ...

  8. JavaScript脚本语言基础(四)

    导读: JavaScript和DOM DOM文档对象常用方法和属性 DOW文档对象运用 JSON数据交换格式 正则表达式 1.JavaScript和DOM [返回] 文档对象模型(Document O ...

  9. JeeSite(2):导入数据,进入系统

    本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/50954485 未经博主同意不得转载. 博主地址是:http://blog.csd ...

随机推荐

  1. Fluent Python: Classmethod vs Staticmethod

    Fluent Python一书9.4节比较了 Classmethod 和 Staticmethod 两个装饰器的区别: 给出的结论是一个非常有用(Classmethod), 一个不太有用(Static ...

  2. Python3 循环表达式

    一 While循环 基本循环 while 条件: 执行内容 #循环体 ... #循环体 ... #循环体 # 若条件为真,执行循环体内容 # 若条件为假,不执行循环体内容 实例1(Python 3.0 ...

  3. “Hello world!”团队第三周贡献分规则

    一.贡献规则制定: (1)基础分:9 , 9 , 8 , 7 , 7 , 7 , 6(按在本次编程中承担模块的重要度制定,某一模块重要度的认定通过组内开会讨论决定) (2)会议分:每人没出勤一次会议记 ...

  4. Notes of the scrum meeting(12.10)

    meeting time:20:00~20:30p.m.,December 10th,2013 meeting place:20号公寓前 attendees: 顾育豪                  ...

  5. Java 动态绑定和多态

    动态绑定和多态 动态绑定是指:"在执行程序期间(而非编译期间),判断引用所指对象的实际类型,调用其相应的方法." 动态绑定(多态)存在的条件 要有继承. 要有重写. 父类引用指向子 ...

  6. ubuntu apache nginx 启动 关闭

    转载自:http://www.comflag.com/2011/05/01/apache-web.htm 电影<社交网络>中,facebook创始人马克.扎克失恋后入侵哈佛大学宿舍楼服务器 ...

  7. iOS开发热更新JSPatch

    JSPatch,只需在项目中引入极小的引擎,就可以使用JavaScript调用任何Objective-C的原生接口,获得脚本语言的能力:动态更新APP,替换项目原生代码修复bug. 是否有过这样的经历 ...

  8. 在mysql启用远程连接

    1.在ubuntu下面安装mysql. apt-get install mysql-server mysql-client -y 2.修改/etc/mysql/my.cnf文件. #bind-addr ...

  9. endnote的安装和使用必备的几个步骤(简单有效整理版)

    endnote:文献检索和管理工具 一 准备工作 endnote大客户版/破解版获取地址:http://blog.sina.com.cn/s/blog_6de000c20101n7ac.html 之所 ...

  10. BZOJ 1227 虔诚的墓主人(离散化+树状数组)

    题目中矩形的尺寸太大,导致墓地的数目太多,如果我们统计每一个墓地的虔诚度,超时是一定的. 而常青树的数目<=1e5.这启发我们从树的方向去思考. 考虑一行没有树的情况,显然这一行的墓地的虔诚度之 ...