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;
}

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;
}

DZY Loves Sequences

枚举修改的位置即可 水

#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;
}

DDZY Loves Modification

给定一个矩阵 进行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 补题的更多相关文章

  1. 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 ...

  2. 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 ...

  3. Codeforces round 419 div2 补题 CF 816 A-E

    A Karen and Morning 水题 注意进位即可 #include<bits/stdc++.h> using namespace std; typedef long long i ...

  4. codeforces round 418 div2 补题 CF 814 A-E

    A An abandoned sentiment from past 水题 #include<bits/stdc++.h> using namespace std; int a[300], ...

  5. codeforces round 417 div2 补题 CF 812 A-E

    A Sagheer and Crossroads 水题略过(然而被Hack了 以后要更加谨慎) #include<bits/stdc++.h> using namespace std; i ...

  6. codeforces round 416 div2 补题 CF 811 A B C D E

    A. Vladik and Courtesy 水题略过 #include<cstdio> #include<cstdlib> #include<cmath> usi ...

  7. codeforces round 420 div2 补题 CF 821 A-E

    A Okabe and Future Gadget Laboratory 暴力 #include<bits/stdc++.h> using namespace std; typedef l ...

  8. Codeforces - 2019年11月补题汇总

    大概目标是补到 #500 为止的 Div. 2 ,先定个小目标,寒假开始前补到 #560 为止 Codeforces Round #599 (Div. 2) 5/6 备注:0-1BFS(补图连通块) ...

  9. Codeforces 1214 F G H 补题记录

    翻开以前打的 #583,水平不够场上只过了五题.最近来补一下题,来记录我sb的调试过程. 估计我这个水平现场也过不了,因为前面的题已经zz调了好久-- F:就是给你环上一些点,两两配对求距离最小值. ...

随机推荐

  1. 字符串匹配(codevs 1404)

    题目描述 Description 给你两个串A,B,可以得到从A的任意位开始的子串和B匹配的长度.给定K个询问,对于每个询问给定一个x,求出匹配长度恰为x的位置有多少个.N,M,K<=20000 ...

  2. [USACO08OPEN]牛的车Cow Cars

    题目描述 N (1 <= N <= 50,000) cows conveniently numbered 1..N are driving in separate cars along a ...

  3. castle problem——(深度优先搜索,递归实现和stack实现)

    将问题的各状态之间的转移关系描述为一个图,则深度优先搜索遍历整个图的框架为:Dfs(v) {if( v 访问过)return;将v标记为访问过;对和v相邻的每个点u: Dfs(u);}int main ...

  4. 创建SSH keys

    1.检查是否已经有SSH Key存在 windows: type "%userprofile%\.ssh\id_rsa.pub" Linux: cat ~/.ssh/id_rsa. ...

  5. I NEED A OFFER!---hdu1203(01背包)

     http://acm.hdu.edu.cn/showproblem.php?pid=1203   Problem Description Speakless很早就想出国,现在他已经考完了所有需要的考 ...

  6. 操作redis有关的命令

    )连接操作命令 quit:关闭连接(connection) auth:简单密码认证 help cmd: 查看cmd帮助,例如:help quit )持久化 save:将数据同步保存到磁盘 bgsave ...

  7. NodeJS+MongoDB+AngularJS+Bootstrap书店示例

    目录 一.Bootstrap 1.1.添加引用 1.2.在页面中使用BootStrap 1.3.可视化布局 二.使用MongoDB创建数据库 2.1.启动MongoDB数据库 2.2.启动数据库GUI ...

  8. Android之怎样实现滑动页面切换【Fragment】

    Fragment 页面切换不能滑动 所以对于listview 能够加入的左右滑动事件 .不会有冲突比如(QQ的好友列表的删除)  Fragment 和viewpager 的差别  Viewpager ...

  9. dhcp 过程

    The Question SuperUser reader Sagnik Sarkar wants to know what the difference between 127.0.0.1 and ...

  10. Windows 8.1更新变化

     在上个月微软公布了Windows 8.1更新(KB2919355),假设大家使用的是Windows 8.1的系统,而且启用了自己主动更新,那这个更新就会被自己主动安装.伴随着这个更新,微软同一时 ...