codeforces 447 A-E div2 补题
A DZY Loves Hash 水题
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
bool f[300];
int main()
{
long long int p,t;
int i,j,k,m,n;
cin>>p>>n;
bool fs=0;
memset(f,0,sizeof(f));
for(i=1;i<=n;i++)
{
cin>>t;
t=t%p;
if(!f[t])f[t]=1;
else
{
fs=1;
cout<<i;
break;
}
}
if(!fs)cout<<-1;
return 0;
}
B DZY Loves Strings 水题
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
char s[1001];
int v[26],i,j,k,m,n,maxv=0;
cin>>s;
cin>>k;
for(i=0;i<26;i++)
{
cin>>v[i];
if(v[i]>maxv)maxv=v[i];
}
long long int ans=0;
m=strlen(s);
for(i=0;i<m;i++)
ans+=(i+1)*(v[s[i]-'a']);
for(;i<m+k;i++)
ans+=(i+1)*maxv;
cout<<ans;
return 0;
}
枚举修改的位置即可 水
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=100005;
typedef long long int LL;
LL num[maxn];
int ac[maxn],dc[maxn];
int main()
{//freopen("t.txt","r",stdin);
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%I64d",&num[i]),ac[i]=dc[i]=1;
for(int i=1;i<=n;)
{
int len=1;
for (int j=i+1;j<=n&&num[j]>num[j-1];j++)len++;
for(int j=i;len>1;len--,j++)
ac[j]=len;
i=i+ac[i];
}
for(int i=n;i>=1;)
{
int len=1;
for (int j=i-1;j>=1&&num[j]<num[j+1];j--)len++;
for(int j=i;len>1;len--,j--)
dc[j]=len;
i=i-dc[i];
}
dc[0]=ac[0]=dc[n+1]=ac[n+1]=0;
num[0]=-999999999999LL;
num[n+1]=9999999999999LL;
int ans=1;
for(int i=1;i<=n;i++)
{
if(num[i-1]<num[i+1]-1)ans=max(ans,1+dc[i-1]+ac[i+1]);
else ans=max(ans,max(1+dc[i-1],1+ac[i+1]));
}
printf("%d\n",ans);
return 0;
}
给定一个矩阵 进行k次操作 每次取一行或一列 累加他们的和 并且将取中的每一个元素减p
每次找最大行或最大列的贪心方法是错误的。可以找到反例。
那么我们考虑如果p=0 我们找最大行或者最大列 K次即可
如果p不等于0 我们发现一个事实
我们必然取a次行和b次列 a+b=k 且最后答案等于p=0的情况下贪心的ans 减去 a*b*p(尝试自己证明)
于是我们枚举取了多少次行 取最大值就行了。
很有趣的一道贪心题。
#include<bits/stdc++.h>
using namespace std;
typedef long long l;
priority_queue<l>Q;
int n,m,k,p,d;
l r[1001],c[1001],S[1000001],P[1000001],a=-99999999999999;
int main(){scanf("%d%d%d%d",&n,&m,&k,&p);
for(int i=1;i<=n;Q.push(r[i]),i++) for(int j=1;j<=m;j++) scanf("%d",&d),r[i]+=d,c[j]+=d;
for(int i=1;i<=k;i++)S[i]=Q.top(),Q.pop(),Q.push(S[i]-m*p);
while(!Q.empty())Q.pop();for(int i=1;i<=m;i++)Q.push(c[i]);
for(int i=1;i<=k;i++)P[i]=Q.top(),Q.pop(),Q.push(P[i]-n*p);
for(int i=1;i<=k;i++)S[i]+=S[i-1],P[i]+=P[i-1];
for(int i=0;i<=k;i++)a=max(a,S[i]+P[k-i]-(l)(i)*(k-i)*p);
printf("%I64d\n",a);}
E. DZY Loves Fibonacci Numbers
首先我们要学习斐波那契数列的两个性质
我们定义原始斐波那契数列即f(1)=f(2)=1 当n>2 f(n)=f(n-1)+f(n-2)
性质一:然后我们定义一般斐波那契数列 即F(1)=a F(2)=b 此时有 F(n)= a*f(n-2)+b*f(n-1)(用归纳法易证得)
性质二:对于一般斐波那契数列的前缀和 我们有如下推导
{fib[n]=fib[n−1]+fib[n−2]fib[n−1]=fib[n−2]+fib[n−3]⇒fib[n]=fib[n−2]+⋯+fib[3]+2⋅fib[2]+fib[1]⇒∑i=1nfib[i]=fib[n+2]−fib[2]
发现了以上两个性质后 我们可以在常数时间内对斐波那契数列进行分解了!
这意味着我们可以用线段树来储存斐波那契数列了 因为不同的一般斐波那契数列之间显然满足线性可加性。(这样意味着我们可以使用线段树的“懒”功能了)
剩下的看代码吧 有点长 不过很清晰
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#define MAX 300007 using namespace std; typedef long long LL; int n,m,a[MAX];
const LL mod = 1e9+9;
LL fib[MAX]; struct Tree
{
int l,r;
LL sum,f1,f2;//当前区间要加的一般斐波那契数列前2项(满足线性可加性)
}tree[MAX<<2]; void push_up ( int u )
{
tree[u].sum = tree[u<<1].sum + tree[u<<1|1].sum;
tree[u].sum %= mod;
} void build ( int u , int l , int r )
{
tree[u].l = l;
tree[u].r = r;
tree[u].f1 = tree[u].f2 = 0;
if ( l == r )
{
tree[u].sum = a[l];
return;
}
int mid = l+r>>1;
build ( u<<1 , l , mid );
build ( u<<1|1 , mid+1 , r );
push_up ( u );
} void init ( )
{
fib[1] = fib[2] = 1;
for ( int i = 3 ; i < MAX ; i++ )
{
fib[i] = fib[i-1] + fib[i-2];
fib[i] %= mod;
}
} LL get ( LL a , LL b , int n )//一般斐波那契数列的第n项
{
if ( n == 1 ) return a%mod;
if ( n == 2 ) return b%mod;
return (a*fib[n-2]%mod+b*fib[n-1]%mod)%mod;
} LL sum ( LL a , LL b , int n )//一般斐波那契数列的前缀和
{
if ( n == 1 ) return a;
if ( n == 2 ) return (a+b)%mod;
return ((get ( a , b , n+2 )-b)%mod+mod)%mod;
} void push_down ( int u )//常数复杂度的拆分
{
int f1 = tree[u].f1;
int f2 = tree[u].f2;
int l = tree[u].l;
int r = tree[u].r;
int ll = (l+r)/2-l+1;
int rr = r-(l+r)/2;
if ( f1 )
{
if ( l != r )
{
tree[u<<1].f1 += f1;
tree[u<<1].f1 %= mod;
tree[u<<1].f2 += f2;
tree[u<<1].f2 %= mod;
tree[u<<1].sum += sum ( f1 , f2 , ll );
tree[u<<1].sum %= mod;
int x = f1 , y = f2;
f2 = get ( x , y , ll+2 );
f1 = get ( x , y , ll+1 );
tree[u<<1|1].f2 += f2;
tree[u<<1|1].f2 %= mod;
tree[u<<1|1].f1 += f1;
tree[u<<1|1].f1 %= mod;
tree[u<<1|1].sum += sum ( f1 , f2 , rr );
tree[u<<1|1].sum %= mod;
}
tree[u].f1 = tree[u].f2 = 0;
}
} void update ( int u , int left , int right )
{
int l = tree[u].l;
int r = tree[u].r;
int mid = l+r>>1;
if ( left <= l && r <= right )
{
tree[u].f1 += fib[l-left+1];
tree[u].f1 %= mod;
tree[u].f2 += fib[l-left+2];
tree[u].f2 %= mod;
int f1 = fib[l-left+1], f2 = fib[l-left+2];
tree[u].sum += sum ( f1 , f2 , r-l+1 );
tree[u].sum %= mod;
return;
}
push_down ( u);
if ( left <= mid && right >= l )
update ( u<<1 , left , right );
if ( left <= r && right > mid )
update ( u<<1|1 , left , right );
push_up ( u );
} LL query ( int u , int left , int right )
{
int l = tree[u].l;
int r = tree[u].r;
int mid = l+r>>1;
if ( left <= l && r <= right )
return tree[u].sum;
push_down ( u );
LL ret = 0;
if ( left <= mid && right >= l )
{
ret += query ( u<<1 , left , right );
ret %= mod;
}
if ( left <= r && right > mid )
{
ret += query ( u<<1|1 , left , right );
ret %= mod;
}
return ret;
} int main ( )
{
init ( );
while ( ~scanf ( "%d%d" , &n , &m ) )
{
for ( int i = 1; i <= n ; i++ )
scanf ( "%d" , &a[i] );
build ( 1 , 1 , n );
while ( m-- )
{
int x,l,r;
scanf ( "%d%d%d" , &x , &l , &r );
if ( x == 1 )
update ( 1 , l , r );
else
printf ( "%lld\n" , query ( 1 , l , r ) );
}
}
}
通过这道题 我们对斐波那契数列的认识应该到了一个新的高度了。
codeforces 447 A-E div2 补题的更多相关文章
- codeforces round 422 div2 补题 CF 822 A-F
A I'm bored with life 水题 #include<bits/stdc++.h> using namespace std; typedef long long int LL ...
- codeforces round 421 div2 补题 CF 820 A-E
A Mister B and Book Reading O(n)暴力即可 #include<bits/stdc++.h> using namespace std; typedef lon ...
- Codeforces round 419 div2 补题 CF 816 A-E
A Karen and Morning 水题 注意进位即可 #include<bits/stdc++.h> using namespace std; typedef long long i ...
- codeforces round 418 div2 补题 CF 814 A-E
A An abandoned sentiment from past 水题 #include<bits/stdc++.h> using namespace std; int a[300], ...
- codeforces round 417 div2 补题 CF 812 A-E
A Sagheer and Crossroads 水题略过(然而被Hack了 以后要更加谨慎) #include<bits/stdc++.h> using namespace std; i ...
- codeforces round 416 div2 补题 CF 811 A B C D E
A. Vladik and Courtesy 水题略过 #include<cstdio> #include<cstdlib> #include<cmath> usi ...
- codeforces round 420 div2 补题 CF 821 A-E
A Okabe and Future Gadget Laboratory 暴力 #include<bits/stdc++.h> using namespace std; typedef l ...
- Codeforces - 2019年11月补题汇总
大概目标是补到 #500 为止的 Div. 2 ,先定个小目标,寒假开始前补到 #560 为止 Codeforces Round #599 (Div. 2) 5/6 备注:0-1BFS(补图连通块) ...
- Codeforces 1214 F G H 补题记录
翻开以前打的 #583,水平不够场上只过了五题.最近来补一下题,来记录我sb的调试过程. 估计我这个水平现场也过不了,因为前面的题已经zz调了好久-- F:就是给你环上一些点,两两配对求距离最小值. ...
随机推荐
- CodeForces - 592D Super M 题解
题目大意: 一棵树 n个点 有m个点被标记 求经过所有被标记的点的最短路径的长度以及起点(如有多条输出编号最小的起点). 思路: 1.当且仅当一个点本身或其子树中有点被标记时该点在最短的路径上因此,可 ...
- [Usaco2009 Open]工作安排Job
Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1457 Solved: 687[Submit][Status][Discuss] Descriptio ...
- C#路径,文件,目录,I/O常见操作汇总
原文发布时间为:2008-10-25 -- 来源于本人的百度文章 [由搬家工具导入] 路径,文件,目录,I/O常见操作汇总 摘要: 文件操作是程序中非常基础和重要的内容,而路径、文件、目录以及 ...
- hihoCoder #1055 : 刷油漆 [ 树形dp ]
传送门 结果:Accepted 提交时间:2015-05-11 10:36:08 #1055 : 刷油漆 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到 ...
- msp430项目编程06
msp430中项目---设计扫描键盘 1.扫描键盘工作原理 2.电路原理说明 3.代码(显示部分) 4.代码(键盘驱动) 5.项目总结 msp430项目编程 msp430入门学习
- [转]JAVA异常
异常 异常就是导致程序中断执行的一段指令流. 在java中, 对于异常在API中也有明确的定义,叫做异常类. Error : JVM的错误, 程序中不进行处理, 交给虚拟机. Exception : ...
- C++MFC编程笔记day06 MFC向导、MFC画图类使用
MFC画图 MFC画图类包含画图设备类和画图对象类 1 画图设备类 CDC类-父类是CObject,封装的是一般的画图设备,比如:显示器, 打印机等. ...
- Centos 6.4 搭建LANMP一键安装版
lanmp一键安装包是wdlinux官网2010年开始推出的lamp,lnmp,lnamp(apache,nginx,php,mysql,zend,eAccelerator,pureftpd)应用环境 ...
- Linux(Ubuntu14.04)下Google Chrome / Chromium标题栏乱码问题
注:我使用的Linux发行版是Ubuntu 14.04,不同Linux发行版可能会有不同. 最近在使用Chromium的时候tab的标题栏中文显示乱码,在地址栏输入中文是同样时乱码,就像下图: 看起来 ...
- sizeof、strlen
一.sizeof sizeof(...)是运算符,sizeof操作符的结果类型是size_t.它在头文件里typedef为unsigned int类型.是以字节为单位进行计数的.所以位域成员不 能用s ...