【NOI 2010】能量采集&&超级钢琴

其实这两个题一点关系都没有,同一天做的,写在一起= =

能量采集

ans=∑x=1n∑y=1m2?gcd(x,y)+1

∑x=1n∑y=1m[d|gcd(x,y)]=?nd???md?

code

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
long long n,m,maxn;
long long f[100001];
int main()
{
    long long ans=0,i,j,x,t=0;
    scanf("%lld%lld",&n,&m);
    maxn=min(n,m);
    for (i=maxn;i>=1;--i)
      {
        t=(n/i)*(m/i);
        for (j=2*i;j<=maxn;j+=i)
          t-=f[j];
        f[i]=t;
        ans+=t*(2*i-1);
      }
    printf("%lld\n",ans);
}

超级钢琴

堆加线段树乱搞 code:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define inf 2100000000LL
#define mid (l+r)/2
#define lch i<<1,l,mid
#define rch i<<1|1,mid+1,r
using namespace std;
long long n,k,l,r;
struct hp{
    long long maxn,maxi;
}seg[2000001];
struct heapnode{
    long long i,l,r,maxn,maxi;
    bool operator < (const heapnode &a) const {return maxn<a.maxn;}
};
priority_queue<heapnode> heap;
long long a[500001],s[500001],ans,ansi;
void updata(int i)
{
    if (seg[i<<1].maxn>=seg[i<<1|1].maxn)
      {
        seg[i].maxn=seg[i<<1].maxn;
        seg[i].maxi=seg[i<<1].maxi;
      }
    else
      {
        seg[i].maxn=seg[i<<1|1].maxn;
        seg[i].maxi=seg[i<<1|1].maxi;
      }
}
void build(int i,int l,int r)
{
    if (l==r)
      {
        seg[i].maxn=s[l];
        seg[i].maxi=l;
        return;
      }
    build(lch); build(rch);
    updata(i);
}
void query(int i,int l,int r,int x,int y)
{
    if (x<=l&&y>=r)
      {
        if (seg[i].maxn>ans)
          {
            ans=seg[i].maxn;
            ansi=seg[i].maxi;
          }
        return;
      }
    if (x<=mid) query(lch,x,y);
    if (y>mid) query(rch,x,y);
}
int main()
{
    long long i,tot=0;
    heapnode temp,t;
    scanf("%lld%lld%lld%lld",&n,&k,&l,&r);
    s[0]=0;
    for (i=1;i<=n;++i)
      {
        scanf("%lld",&a[i]);
        s[i]=s[i-1]+a[i];
      }
    build(1,1,n);
    for (i=1;i<=n;++i)
      {
        temp.i=i;
        if (i+l-1>n) continue;
        temp.l=i+l-1;
        temp.r=min(i+r-1,n);
        ans=-inf; ansi=0;
        query(1,1,n,temp.l,temp.r);
        temp.maxn=ans-s[i-1]; temp.maxi=ansi;
        heap.push(temp);
        //cout<<temp.l<<‘ ‘<<temp.r<<‘:‘<<ans<<endl;
      }
    for (i=1;i<=k;++i)
      {
        temp=heap.top(); heap.pop();
        tot+=temp.maxn;
        //cout<<temp.i<<‘ ‘<<temp.maxi<<endl;
        if (temp.l<=temp.maxi-1)
          {
            t.i=temp.i; t.l=temp.l; t.r=temp.maxi-1;
            ans=-inf; ansi=0;
            query(1,1,n,t.l,t.r);
            t.maxn=ans-s[temp.i-1]; t.maxi=ansi;
            heap.push(t);
          }
        if (temp.r>=temp.maxi+1)
          {
            t.i=temp.i; t.l=temp.maxi+1; t.r=temp.r;
            ans=-inf; ansi=0;
            query(1,1,n,t.l,t.r);
            t.maxn=ans-s[temp.i-1]; t.maxi=ansi;
            heap.push(t);
          }
      }
    printf("%lld\n",tot);
} 

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-19 16:42:37

【NOI 2010】能量采集&&超级钢琴的相关文章

●BZOJ 2005 NOI 2010 能量采集

题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2005 题解: 一个带有容斥思想的递推.%%% 首先,对于一个点 (x,y) 在路径 (0,0)->(x,y)上,经过的点数为 GCD(x,y)-1所以改点的贡献为 2*GCD(x,y)-1            N    M那么,ANS = ∑    ∑(2*GCD(i,j)-1)           i=1 j=1显然超时.考虑到 GCD<=100000,那么是否可以求出 f[i] 表

[NOI 2010]能量采集

Description 题库链接 给你一个 \(n\times m\) 的坐标轴.对于坐标轴的每一个正整数整点 \((x,y)\) 其对答案产生的贡献为 \(2k+1\) ,其中 \(k\) 表示这个点与坐标原点连线,线段穿过了除端点外的 \(k\) 个点.求所有点的贡献和. \(1\leq n,m \leq 100000\) Solution 容易发现 \(k=gcd(x,y)-1\) ,故原式等于求 \[\begin{aligned}&\sum_{i=1}^n\sum_{j=1}^m(2(g

[NOI 2010]超级钢琴

Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙 的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中Ai可正可负. 一个"超级和弦"由若干个编号连续的音符组成,包含的音符个数不少于L且不多于R.我们定义超级和弦的美妙度为其包含的所有音符的美妙度之和.两个超级和 弦被认为是相同的,当且仅当这两个超级和弦所包含的音符集合是相同的. 小Z决定创作一首由k个超级和弦组成的乐曲,为了

NOI 能量采集

1 /** 2 大意: 求解 在[1,n] x, [1,m] y,之间有多少个gcd(x,y) = d d = min(n,m) 3 思路: 对于任意一个d 在[1,n] x, [1,m] y, gcd(x,y) 含有d 因子的个数为 n/i * m/i 这是所有含有因子d的组合的个数 , 再减去 gcd(x,y) = 2*d , gcd(x,y) = 3*d, gcd(x,y) = 4*d...那么最后得到的就是最大公约数为d的组合的个数 4 5 siga( 1-n ) * siga(1-m)

NOI2004 能量采集

CodeVS1937 能量采集 2010年NOI全国竞赛 题目描述 Description 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量后,栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一起. 栋栋的植物种得非常整齐,一共有n列,每列有m棵,植物的横竖间距都一样,因此对于每一棵植物,栋栋可以用一个坐标(x, y)来表示,其中x的范围是1至n,表示是在第x列,y的范围是1至m,表示是在第x列的第y棵. 由于能量汇集机器较大,不便移动,栋栋

NOI2010能量采集(数论)

没想到NOI竟然还有这种数学题,看来要好好学数论了-- 网上的题解: 完整的结题报告: 首先我们需要知道一个知识,对于坐标系第一象限任意的整点(即横纵坐标均为整数的点)p(n,m),其与原点o(0,0)的连线上除过原点整点的个数为gcd(n,m).其他象限上个数则为gcd(abs(n),abs(m)),这里的gcd(a,b)是指a与b的最大公约数(Greastest Common Divisor),abs(a)是指数a的绝对值.证明:考虑在op上最小的一个整点(x,y),这里的最小是指横纵坐标绝

超级钢琴(codevs 2934)

题目描述 Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中Ai可正可负. 一个“超级和弦”由若干个编号连续的音符组成,包含的音符个数不少于L且不多于R.我们定义超级和弦的美妙度为其包含的所有音符的美妙度之和.两个超级和弦被认为是相同的,当且仅当这两个超级和弦所包含的音符集合是相同的. 小Z决定创作一首由k个超级和弦组成的乐曲,为了使得

bzoj2006[NOI2016]超级钢琴

bzoj2006[NOI2016]超级钢琴 题意: 超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中Ai可正可负.一个“超级和弦”由若干个编号连续的音符组成,包含的音符个数不少于L且不多于R,其美妙度为包含的所有音符的美妙度之和.两个超级和弦被认为是相同的,当且仅当这两个超级和弦所包含的音符集合是相同的.现需创作一首由k个不同的超级和弦组成的乐曲.定义一首乐曲的美妙度为其所包含的所有超级和弦的美妙度之和.求能够创作出来的乐曲美妙度最大值是多少. 题解: 乍一看很难,实际上

[NOI2010]能量采集

469. [NOI2010]能量采集 ★★☆   输入文件:energy2010.in   输出文件:energy2010.out   简单对比时间限制:1 s   内存限制:512 MB [问题描述] 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量后,栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一起. 栋栋的植物种得非常整齐,一共有n列,每列有m棵,植物的横竖间距都一样,因此对于每一棵植物,栋栋可以用一个坐标(x, y)来表示,其中x