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+1);
    len=strlen(s+1);
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d%d%d",&l,&r,&k);
        k%=(r-l+1);
        if(!k) continue;
        t=l;
        for(int i=r-k+1;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+1);
}

阅读计划

(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[501],read[1001];
int first[501];
bool v[501];
int main()
{
    freopen("book.in","r",stdin);
    freopen("book.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&weight[i]);
    for(int i=1;i<=m;i++)
    {
        scanf("%d",&x);
        read[i]=x;
        if(!first[x])
        {
            first[x]=i;
            ans+=cnt;
            cnt+=weight[x];
        }
    }
    for(int i=1;i<=m;i++)
        if(first[read[i]]!=i)
        {
            for(int j=i-1;j && read[j]!=read[i];j--)
              if(!v[read[j]]) ans+=weight[read[j]],v[read[j]]=true;
            memset(v,0,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]=1;
    int siz=e[now].size();
    for(int i=0;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]]+1)%mod;
    }
}
int main()
{
    freopen("set.in","r",stdin);
    freopen("set.out","w",stdout);
    scanf("%d%d",&d,&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    int u,v;
    for(int i=1;i<n;i++)
    {
        scanf("%d%d",&u,&v);
        e[u].push_back(v);
        e[v].push_back(u);
    }
    for(int i=1;i<=n;i++)
    {
        rt=i;
        l=a[i];
        r=a[i]+d;
        dfs(i,0);
        ans=(ans+dp[i])%mod;
    }
    printf("%d",ans);
}

时间: 2024-10-06 07:04:37

2017 济南综合班 Day 6的相关文章

2017 济南综合班 Day 5

毕业考试 (exam.cpp/c/pas) (1s/256M) 问题描述 快毕业了,Barry希望能通过期末的N门考试来顺利毕业.如果他的N门考试平均分能够达到V分,则他能够成功毕业.现在已知每门的分数不能够超过R:他的第i门考试目前得分为Ai,如果想要在这门科目增加一分则需要多写Bi篇论文.Barry想知道,如果想要毕业的话,他最少需要写多少篇论文? 输入格式(exam.in) 第一行三个整数,N, R, V,分别代表考试科目数,每门考试的最高分,需要达到的平均分. 接下来的N行每行两个整数A

2017 济南综合班 Day 4

T1 外星人 二维前缀和 #include<cstdio> #define N 1001 using namespace std; bool v[N][N]; int sum[N][N]; int main() { freopen("alien.in","r",stdin); freopen("alien.out","w",stdout); int r,c,p,q; scanf("%d%d%d%d&quo

2017 济南综合班 Day 3

T1  黑化 题意: 求一个字符串是否可能包含另一个字符串 字符串中的?可以匹配任意字母 可能输出 God bless You! 一定不可能 输出 Game Over! 计算fail数组时,fail数组不具有传递性 例: pqkbpqsbqszzpqkbpq?z 在z处失配后: pqkbpqsbqszz        pqkbpq?z z匹配成功,误认为包含 因为计算fail时,?匹配了 k,而匹配时 ?匹配了s s不和k匹配 即?不具有传递性 #include<cstdio> #includ

2017 济南综合班 Day 7

 a 两个指针L.R R开始指向恰好[R,n]有不超过k个逆序对的地方 随着L的右移,R指针只会右移 逆序对有2部分 1.L左侧与其他位置形成的逆序对 2.R右侧与其他位置形成的逆序对 用树状数组分别维护这两部分 同时维护当前逆序对个数 每次L右移,新的L会增加与L左侧的逆序对和与R右侧的逆序对 每次R右移,R的消失会减少R右侧的逆序对和与L左侧的逆序对 #include<cstdio> #include<algorithm> #define N 100012 using name

2017 济南精英班 Day1

不管怎么掰都是n*m-1 #include<cstdio> using namespace std; int main() { freopen("bpmp.in","r",stdin); freopen("bpmp.out","w",stdout); int n,m; scanf("%d%d",&n,&m); int ans=(1ll*n*m-1)%998244353; prin

罗森伯格再次荣获《2017年度综合布线十大品牌》以及《2017年度数据中心解决方案优秀供应商》两项大

"中国智能建筑品牌奖"由千家品牌实验室评选并颁发,综合了千家智客全年品牌监测数据.市场调查分析.用户反馈.专家评议以及用户投票等因素,评选出十大综合布线品牌等多项大奖.罗森伯格再次荣获<2017年度综合布线十大品牌>以及<2017年度数据中心解决方案优秀供应商>两项大奖. "中国智能建筑品牌奖"是智能建筑领域极具含金量的年度大奖,自2002年首次颁发,至今已有十五年的历史.由于评选客观.公正.权威,"中国智能建筑品牌奖"也

2017 济南集训DAY1.AF

LIST T1 水题(water) T2 梦境(dream) T2 动态规划(dp) T1 水题(water) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK出了道水题. 这个水题是这样的:有两副牌,每副牌都有n张. 对于第一副牌的每张牌长和宽分别是xi和yi.对于第二副牌的每张牌长和宽分别是aj和bj.第一副牌的第i张牌能覆盖第二副牌的第j张牌当且仅当xi>=aj并且yi>=bj.(注意牌不能翻转)当然一张牌只能去覆盖最多一张牌,而不能覆盖好多

如何解读梯形图编程原则?

如何解读梯形图编程原则?plc程序设计方法又是怎样的?与大家一起学习!! 梯形图编程原则与PLC程序设计方法 (1)  输入/输出继电器.内部辅助继电器.定时器.计数器等器件的触点可以多次重复使用,无需复杂的程序结构来减少触点的使用次数. (2) 梯形图每一行都是从左母线开始,线圈终止于右母线.触点不能放在线圈的右边,如下图所示 (3)除步进程序外,任何线圈.定时器.计数器.高级指令等不能直接与左母线相连. (4)在程序中,不允许同一编号的线圈两次输出(双线圈输出).下面的梯形图是不允许的. (

2017-2018-2 20179225 《密码与安全新技术专题》 第5周作业

2017-2018-2 <密码与安全新技术>第3周作业 课程:<密码与安全新技术> 班级:2017级92班 学号:20179225 上课教师:谢四江 主讲教师:王志强 上课日期:2018年5月10日 必修/选修: 必修 主要内容:基于模糊测试的漏洞挖掘及攻防技术 一.背景及意义 1 安全漏洞定义: 简单来说安全漏洞就为存在的缺陷与不足,使别人容易攻破或着入侵电脑. 精确定义:是指信息系统在设计.实现或者运行管理过程中存在的缺陷或不足,从而使攻击者能够在未授权的情况下利用这些缺陷破坏