循环移动

(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. HADOOP docker(九):hdfs权限

    1. 概述2. 用户身份标识3. 组映射4.关于权限的实现5.文件系统API的变更6.应用程序shell的变更7.超级用户8.ACLs9.ACL 文件系统API10.ACL命令11.参数配置12.总结 ...

  2. POJ 1655 Balancing Act(求树的重心)

    Description Consider a tree T with N (1 <= N <= 20,000) nodes numbered 1...N. Deleting any nod ...

  3. 拓扑排序(Toposort)

    摘自:https://blog.csdn.net/qq_35644234/article/details/60578189 <图论算法> 1.拓扑排序的介绍 对一个有向无环图(Direct ...

  4. “Hello World!”团队第三周召开的第五次会议

    一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七.燃尽图 八.代码地址 一.会议时间 2017年10月31日  11:45-12:17 二.会议地点: ...

  5. BAT批处理(三)

    1.set set命令:显示.设置或删除变量.显示变量:set 或 set s 前者显示批处理当前已定义的所有变量及其值,后者显示所有以s开头的变量及值.设置变量:set aa=abcd 此句命令便可 ...

  6. 【Linux】- CentOS查看IP

    1.查询命令: ip addr 显示如图: 可以看到ens33没有inet这个属性,那么就没办法通过IP远程连接. 2.设置配置文件: vi /etc/sysconfig/network-script ...

  7. centos7 下pycharm无法输入中文问题解决方案

    作者使用的pycharm是2017.2 在pycharm.sh脚本的如下行(大约在201行): # -------------------------------------------------- ...

  8. 如何在flink中传递参数

    众所周知,flink作为流计算引擎,处理源源不断的数据是其本意,但是在处理数据的过程中,往往可能需要一些参数的传递,那么有哪些方法进行参数的传递?在什么时候使用?这里尝试进行简单的总结. 使用conf ...

  9. Android基础------高级ul:消息提示

    前言:Android消息提示笔记,刚刚接触Android 1.静态方法Toast 直接调用静态方法 //消息提示(context,"内容",固定时间) Toast.makeText ...

  10. WPF如何将数据库中的二进制图片数据显示在Image控件上

    首先在xaml文件里定义一个Image控件,取名为img MemoryStream stream = new MemoryStream(获得的数据库对象): BitMapImage bmp = new ...