华中农业大学第四届程序设计大赛网络同步赛 G.Array C 线段树或者优先队列

Problem G: Array C

Time Limit: 1 Sec  Memory Limit: 128 MB

Description

Giving two integers  and  and two arrays  and  both with length , you should construct an array  also with length  which satisfied:

1.0≤CiAi(1≤in)

2.

and make the value S be minimum. The value S is defined as:

Input

There are multiple test cases. In each test case, the first line contains two integers n(1≤n≤1000) andm(1≤m≤100000). Then two lines followed, each line contains n integers separated by spaces, indicating the array Aand B in order. You can assume that 1≤Ai≤100 and 1≤Bi≤10000 for each i from 1 to n, and there must be at least one solution for array C. The input will end by EOF.

Output

For each test case, output the minimum value S as the answer in one line.

Sample Input

3 4
2 3 4
1 1 1

Sample Output

6思路:首先我们会想找到最小的一直下去,但是有个A数组为上界不好处理,所以先将C数组全部修改成A数组,一直向下减,当C相加等于M的时候得到答案;
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000007
#define inf 999999999
#define esp 0.00000000001
//#pragma comment(linker, "/STACK:102400000,102400000")
int scan()
{
    int res = 0 , ch ;
    while( !( ( ch = getchar() ) >= ‘0‘ && ch <= ‘9‘ ) )
    {
        if( ch == EOF ) return 1 << 30 ;
    }
    res = ch - ‘0‘ ;
    while( ( ch = getchar() ) >= ‘0‘ && ch <= ‘9‘ )
        res = res * 10 + ( ch - ‘0‘ ) ;
    return res ;
}
struct is
{
    ll l,r;
    ll maxx;
    ll num;
    ll sum;
}tree[10010];
ll a[1010];
ll b[1010];
void buildtree(ll l,ll r,ll pos)
{
    tree[pos].l=l;
    tree[pos].r=r;
    if(l==r)
    {
        tree[pos].num=a[l];
        tree[pos].maxx=(a[l]*a[l]-(a[l]-1)*(a[l]-1))*b[l];
        tree[pos].sum=a[l];
        return;
    }
    ll mid=(l+r)/2;
    buildtree(l,mid,pos*2);
    buildtree(mid+1,r,pos*2+1);
    tree[pos].maxx=max(tree[pos*2].maxx,tree[pos*2+1].maxx);
    tree[pos].sum=tree[pos*2+1].sum+tree[pos*2].sum;
}
void update(ll l,ll r,ll pos,ll change)
{
    if(tree[pos].r==change&&tree[pos].l==change)
    {
        ll kk=tree[pos].num-1;
        tree[pos].num=kk;
        tree[pos].maxx=(kk*kk-(kk-1)*(kk-1))*b[change];
        tree[pos].sum=kk;
        return;
    }
    ll mid=(l+r)/2;
    if(change<=mid)
    update(l,mid,pos*2,change);
    else
    update(mid+1,r,pos*2+1,change);
    tree[pos].sum=tree[pos*2].sum+tree[pos*2+1].sum;
    tree[pos].maxx=max(tree[pos*2].maxx,tree[pos*2+1].maxx);
}
ll findmax(ll l,ll r,ll pos,ll gg)
{
    if(tree[pos].l==tree[pos].r)
    return tree[pos].l;
    ll mid=(l+r)/2;
    if(tree[pos*2].maxx==gg)
    return findmax(l,mid,pos*2,gg);
    else
    return findmax(mid+1,r,pos*2+1,gg);
}
ll getans(ll l,ll r,ll pos)
{
    if(l==r)
    return tree[pos].num*tree[pos].num*b[l];
    ll mid=(l+r)/2;
    return getans(l,mid,pos*2)+getans(mid+1,r,pos*2+1);
}
int main()
{
    ll x,y,z,i,t;
    while(~scanf("%lld%lld",&x,&y))
    {
        for(i=1;i<=x;i++)
        scanf("%lld",&a[i]);
        for(i=1;i<=x;i++)
        scanf("%lld",&b[i]);
        buildtree(1,x,1);
        while(tree[1].sum!=y)
        {
            ll pos=findmax(1,x,1,tree[1].maxx);
            update(1,x,1,pos);
        }
        printf("%lld\n",getans(1,x,1));
    }
    return 0;
}
 
时间: 2024-10-05 06:33:12

华中农业大学第四届程序设计大赛网络同步赛 G.Array C 线段树或者优先队列的相关文章

华中农业大学第四届程序设计大赛网络同步赛 I

Problem I: Catching Dogs Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 1130  Solved: 292[Submit][Status][Web Board] Description Diao Yang keeps many dogs. But today his dogs all run away. Diao Yang has to catch them. To simplify the problem, we assu

华中农业大学第四届程序设计大赛网络同步赛 J

Problem J: Arithmetic Sequence Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 1766  Solved: 299[Submit][Status][Web Board] Description Giving a number sequence A with length n, you should choosing m numbers from A(ignore the order) which can form an

[HZAU]华中农业大学第四届程序设计大赛网络同步赛

听说是邀请赛啊,大概做了做…中午出去吃了个饭回来过掉的I.然后去做作业了…… 1 #include <algorithm> 2 #include <iostream> 3 #include <iomanip> 4 #include <cstring> 5 #include <climits> 6 #include <complex> 7 #include <fstream> 8 #include <cassert&g

华中农业大学第五届程序设计大赛网络同步赛解题报告(转)

A.Little Red Riding Hood B.Choosy in Food •F[i]:从第I个点到终点的期望步数 •F[i] = (F[i + k] + k ) * P[k] •F[ed] = 0 •高斯消元求解 •注意存在从起点不能到达终点的情况 C.Friends •F[rt][len] :节点rt的子孙里,距离rt的为len的节点个数 •ans[rt][len] : 整棵树上,距离rt为len的节点个数 •F值一次简单的深搜可以得到 •而ans[rt][len] = F[rt][

华中农业大学第五届程序设计大赛网络同步赛题解

A.Little Red Riding Hood B.Choosy in Food •F[i]:从第I个点到终点的期望步数 •F[i] = (F[i + k] + k ) * P[k] •F[ed] = 0 •高斯消元求解 •注意存在从起点不能到达终点的情况 C.Friends •F[rt][len] :节点rt的子孙里,距离rt的为len的节点个数 •ans[rt][len] : 整棵树上,距离rt为len的节点个数 •F值一次简单的深搜可以得到 •而ans[rt][len] = F[rt][

华中农业大学第五届程序设计大赛 (7/12)

今天实在累了,还有的题晚点补.... 题目链接:http://acm.hzau.edu.cn/problemset.php?page=3 题目:acm.hzau.edu.cn/5th.pdf A:Little Red Riding Hood 题意:给你n朵花,每朵花有个权值,然后每次取花最少要间隔k朵,求权值最大: 思路:简单dp: #pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream&

2017年西南民族大学程序设计竞赛-网络同步赛(代码)

20598954 nmphy D 答案正确 8 512 486 C++ 2017-12-30 14:30:35 20598712 nmphy E 答案正确 3 504 695 C++ 2017-12-30 14:25:59 20598181 nmphy E 答案正确 3 484 659 C++ 2017-12-30 14:15:16 20597638 nmphy E 答案正确 3 504 505 C++ 2017-12-30 14:05:08//比赛时候这里显示的是WA,而且显示准确率5% 20

2017年西南民族大学程序设计竞赛-网络同步赛

题目描述 现在有一个N*M的矩形星图.其中包括恒星和黑洞.恒星可以向上.下.左.右发射光束,且允许光束从其中穿过:黑洞会吸收所有经过的光束. 若一颗恒星向上.下.左.右发射光束,你能告诉我,该光束能否避免被黑洞吸收,进入星图之外的区域么? 输入描述: 单组输入.第一行三个正整数N,M,Q(1 <= N,M<= 1000,1 <= Q <= 1000000),分别表示矩阵的行列,以及询问的个数,询问之间相互独立.然后一个N*M的矩阵,由’*’和’#’构成,表示星图.’*’表示恒星,’

西安电子科技大学第16届程序设计竞赛网络同步赛 G-小国的复仇

sb找规律. 分解因数. 1 #include<bits/stdc++.h> 2 #define LL long long 3 #define fi first 4 #define se second 5 #define mk make_pair 6 using namespace std; 7 8 const int N=1e6+7; 9 const int M=100+7; 10 const int inf=0x3f3f3f3f; 11 const LL INF=0x3f3f3f3f3f3