题目:

1.寿司

给定一个环形的RB串··要求经过两两互换后RB分别形成两段连续区域,求最少操作次数(算法时间O(n))

2.金字塔

给定一个金字塔的侧面图有n层··已知每一层的宽度··高度均为1··要求在图中取出恰好K个互不相交的矩形(边缘可以重叠),求最多可以取出多少面积

n<=20000,k<=100

3.心灵治愈

给定n,m要求取出不大于m的n个正整数,问有多少种取法使n个数和m的最大公因数为1,n,m<=10^15

题解:

1.分析

首先为了方便我们把环从中间断开看成一个序列,我们考虑如果移动R串··那么肯定是找到某一B为中心··B的左边R移到一起··B的右边R移到一起(这里描述有点模糊···如果序列左边的R都移到一起,且序列最左边为R,右边同理··则实际在环中R肯定是连续的一段··)

因此我们先随意找一个B为中心··然后计算答案··之后我们一次将序列最左端的字符移到最右端(比如序列BBRRR移动后就变成BRRRB)然后考虑答案的变化即可···具体实现参见代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int N=2e6+;
int T,n,num[N];
char s[N];
int main()
{
//freopen("a.in","r",stdin);
//freopen("a.out","w",stdout);
scanf("%d",&T);
while(T--)
{
long long ans=,cnt=;
int tot1=,tot2=,totl=,totr=,mid;
scanf("%s",s+);n=strlen(s+);
for(int i=;i<=n;i++)
{
if(s[i]=='B') num[i]=num[i+n]=,tot1++;
else num[i]=num[i+n]=,tot2++;
}
int half=(tot1+)/;int temp=;
for(int i=;i<=n;i++)
{
if(num[i]==) {temp++;if(temp==half) mid=i;}
else
{
if(temp<half){totl++;cnt+=temp;}
else {totr++;cnt+=(tot1-temp);}
}
}
ans=cnt;
for(int i=;i<n;i++)
{
if(num[i]==)
{
int tot=,j;
for(j=mid+;num[j]!=;j++) tot++;
cnt-=totl;cnt+=(totr-tot);mid=j;
totl+=tot;totr-=tot;
if(tot1%==) cnt-=tot;
ans=min(ans,cnt);
}
else
{
totl-=;totr+=;
}
}
cout<<ans<<endl;
}
return ;
}

2.dp+决策单调性/斜率优化

dp方程肯定很好想··第一要明确取的方案··我们肯定是以某一层的宽度为矩形的一边··然后往下取到某一层为一个矩形·矩形的高就是两层高的差··

然后设f[j][i]为第j块矩形以第i层为一边的最大面积··转移方程即为:

f[j][i]=max(f[j][i],f[k][i-1]+(long long)len[j]*(j-k));

其中k为我们往下枚举的层数··len为j层的宽度··

然后通过打表(dalao也可以分析)得出该方程满足决策单调性且使用于斜率优化····这里两种方法都能过

决策单调性:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
inline int R()
{
char c;int f=;
for(c=getchar();c<''||c>'';c=getchar());
for(;c<=''&&c>='';c=getchar()) f=(f<<)+(f<<)+c-'';
return f;
}
const int N=;
const int M=;
struct node
{
int l,r,pos;
}Que[N];
int n,K;
long long len[N],f[N][M];
inline long long calc(int i,int j,int now)
{
return f[j][now-]+(long long)len[i]*(i-j);
}
inline int find(node a,int b,int now)
{
int le=a.l,ri=a.r,ans=a.r+;
while(le<=ri)
{
int mid=(le+ri)/;
if(calc(mid,b,now)>calc(mid,a.pos,now)) ri=mid-,ans=mid;
else le=mid+;
}
return ans;
}
inline void dp(int now)
{
int Head=,Tail=;
node tmp;tmp.l=now;tmp.r=n;tmp.pos=now-;Que[++Tail]=tmp;
for(int i=now;i<=n;i++)
{
while(Que[Head].r<i) Head++;
f[i][now]=calc(i,Que[Head].pos,now);
if(calc(n,i,now)>calc(n,Que[Tail].pos,now))
{
while(Head<=Tail&&calc(Que[Tail].l,i,now)>calc(Que[Tail].l,Que[Tail].pos,now)) Tail--;
if(Head<=Tail)
{
int t=find(Que[Tail],i,now);
Que[Tail].r=t-;
node tmp;tmp.l=t,tmp.r=n,tmp.pos=i;Que[++Tail]=tmp;
}
else
{
node tmp;tmp.l=i+;tmp.r=n;tmp.pos=i;Que[++Tail]=tmp;
}
}
}
}
int main()
{
//freopen("pyramid.out","w",stdout);
n=R(),K=R();int x,y;
if(n<=)
{
for(int i=;i<=n;i++)
{
x=R(),y=R();len[i]=y-x+;f[i][]=(long long)len[i]*i;
}
for(int i=;i<=K;i++)
for(int j=i;j<=n;j++)
for(int k=i-;k<j;k++) f[j][i]=max(f[j][i],f[k][i-]+(long long)len[j]*(j-k));
long long ans=;
for(int i=K;i<=n;i++) ans=max(f[i][K],ans);
cout<<ans<<"\n";
}
else
{
for(int i=;i<=n;i++)
{
x=R(),y=R();len[i]=y-x+;f[i][]=(long long)len[i]*i;
}
for(int i=;i<=K;i++)
dp(i);
long long ans=;
for(int i=K;i<=n;i++) ans=max(f[i][K],ans);
cout<<ans<<"\n";
}
return ;
}

3.质因数分解+容斥原理

这道题和之前跳蚤的那道题是一模一样的··这里就并不多说了··

唯一注意的是我发现了自己快速幂的一个漏洞··求a^b之前要将a取模···之前一直没有注意到···还有就是注意最后答案为负的问题

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
vector<long long>zhiyinzi;
const long long mod=1e9+;
long long n,m,ans=;
inline long long ksm(long long a,long long b)
{
long long ans=;a%=mod;
while(b)
{
if(b%==) ans=(ans*a)%mod;
b/=;a=(a*a)%mod;
}
return ans;
}
inline void dfs(int u,long long tot,long long f)
{
if(u==zhiyinzi.size())
{
long long temp=m/tot;
ans=(ans+f*ksm(temp,n))%mod;
ans=(ans%mod+mod)%mod;
return;
}
dfs(u+,tot,f);
dfs(u+,tot*zhiyinzi[u],-f);
}
int main()
{
scanf("%I64d%I64d",&n,&m);
long long temp=m;
for(long long i=;i*i<=m;i++)
{
if(i>temp) break;
if(temp%i==)
{
while(temp%i==) temp/=i;
zhiyinzi.push_back(i);
}
}
if(temp!=) zhiyinzi.push_back(temp);
dfs(,,);
ans=(ans%mod+mod)%mod;
cout<<ans<<endl;
return ;
}

NOIP赛前模拟20171027总结的更多相关文章

  1. NOIP 赛前模拟记录

    8.11 T1 给定一个序列M,求出能过构造出的序列使得(Si+Si+1)/2=Mi成立的序列个数.保证M,S递增. T2 平面点集中最大的四边形面积 T3 不太懂得一道国家队选拔的加强版. 90+2 ...

  2. 刷题总结——纸带(NOIP赛前模拟)

    题目: 有一个无限长的纸带··上面被划分为若干个格子··现在进行N次操作,第i次操作在L到R上擦出曾经写上的数字(如果有),并写上数字i,询问最终可以看到多少个数字 N小于10^6 题解: 首先毫无疑 ...

  3. NOIP赛前集训备忘录(含每日总结)(日更?。。。)

    NOIP赛前集训备忘录(含每日考试总结) 标签: 有用的东西~(≧▽≦)/~啦啦啦 阅读体验:https://zybuluo.com/Junlier/note/1279194 考试每日总结(这个东西是 ...

  4. 牛客网NOIP赛前集训营-提高组(第四场)游记

    牛客网NOIP赛前集训营-提高组(第四场)游记 动态点分治 题目大意: \(T(t\le10000)\)组询问,求\([l,r]\)中\(k(l,r,k<2^{63})\)的非负整数次幂的数的个 ...

  5. 2018年牛客网NOIP赛前训练营游记

    2018年牛客网NOIP赛前训练营游记 提高组(第一场) 中位数 #include<cstdio> #include<cctype> #include<climits&g ...

  6. 牛客网NOIP赛前集训营-提高组(第四场)B区间

    牛客网NOIP赛前集训营-提高组(第四场)B区间 题目描述 给出一个序列$ a_1  \dots   a_n$. 定义一个区间 \([l,r]\) 是好的,当且仅当这个区间中存在一个 \(i\),使得 ...

  7. 牛客网NOIP赛前集训营-提高组(第四场)B题 区间

    牛客网NOIP赛前集训营-提高组(第四场) 题目描述 给出一个序列 a1, ..., an. 定义一个区间 [l,r] 是好的,当且仅当这个区间中存在一个 i,使得 ai 恰好等于 al, al+1, ...

  8. NOIP前模拟赛总结

    NOIP前模拟赛总结 from 2018.10.7 to ??? Date Name Score(Rank) Problems 2018.10.7 McfXH AK Contest 42(?) 期望得 ...

  9. 牛客网NOIP赛前集训营-普及组(第二场)和 牛客网NOIP赛前集训营-提高组(第二场)解题报告

    目录 牛客网NOIP赛前集训营-普及组(第二场) A 你好诶加币 B 最后一次 C 选择颜色 D 合法括号序列 牛客网NOIP赛前集训营-提高组(第二场) A 方差 B 分糖果 C 集合划分 牛客网N ...

随机推荐

  1. Codeforces Round #320 (Div. 1) [Bayan Thanks-Round] B "Or" Game (贪心)

    首先应该保证二进制最高位尽量高,而位数最高的数乘x以后位数任然是最高的,所以一定一个数是连续k次乘x. 当出现多个最高位的相同的数就枚举一下,先预处理一下前缀后缀即可. #include<bit ...

  2. volatile引发的一系列血案

    最早读<深入理解java虚拟机>对于volatile部分就没有读明白,最近重新拿来研究并记录一些理解 理解volatile前需要把以下这些概念或内容理解: 1.JMM内存模型 2.并发编程 ...

  3. 《队长说得队》第八次团队作业Alpha冲刺

    项目 内容 这个作业属于哪个课程 >>2016级计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 >>实验十二 团队作业8:软件测试与ALPHA冲刺 团队名称 ...

  4. Python——函数入门(二)

    一.函数的参数 我们在定义函数时,可以定义形式参数(简称形参),这些形参的值在函数调用的时候才会确定,形参的值由调用者负责传入. 1.关键字参数 在Python中,函数的参数名并不是没有意义的,在调用 ...

  5. Spring多种方式实现依赖注入

    平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想,即依赖类不由 ...

  6. jquery Syntax error, unrecognized expression:的解决方法

    原文地址 https://blog.csdn.net/flowingfog/article/details/42739773 问题: 将模板的html内容转换成jquery时报以下错误:Syntax ...

  7. C#基于联通短信Sgip协议构建短信网关程序

    此软件基于中国联通Sgip协议程序接口,适合在中国联通申请了短信发送端口的公司使用.短信群发已经成为现在软件系统.网络营销等必不可少的应用工具.可应用在短信验证.信息群发.游戏虚拟商品购买.事件提醒. ...

  8. linux命令行调试邮件服务器

    linux命令行调试邮件服务器 1. Linux客户端调试邮件过程 [root@mxtest ~]# telnet mail.xx.com 25 Trying 172.16.236.103... Co ...

  9. shell时间变量拼接问题

    shell时间变量拼接问题 例1 ABC=ABC_`date –date='yesterday' "+%Y%m%d"`

  10. runtime比较全面的总结

    类和对象 Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码时更具灵活性,如我们可以把消息转发给我们想要的对象,或者 ...