首页 > 其他分享 >l洛谷 P7870 兔已着陆——题解

l洛谷 P7870 兔已着陆——题解

时间:2024-08-11 20:49:10浏览次数:9  
标签:cnt le 洛谷 P7870 题解 second 团子 Downarrow first

洛谷P7870题解


传送锚点


摸鱼环节

「Wdoi-4」兔已着陆

题目背景

铃瑚和清兰是从月之都到达幻想乡的两只月兔。正因为降落到了幻想乡进行调查,因此她们通过开团子屋制作团子出售的方式,在幻想乡生活。

为了应对越发繁荣的市场,她们向河城荷取购置了一台团子机器,可以高效地生产出五颜六色的团子。不同颜色的团子的售价不尽相同。由于每天顾客数量很多,购买的团子数量也不少,所以清兰总是搞不清楚一大堆团子的售价如何。

清兰找到了你,希望你能告诉她每次售出团子时,这些团子的总价格。

题目描述

清兰使用河童的机器可以生产出各种各样颜色的团子。她发现,对于颜色为 \(\bm c\) 的团子,它的售价为 \(\bm c\)。同时,团子机器有个特性,那就是生产出来的团子的颜色必然是一段连续的整数。

为了储存已经生产出来的团子,清兰使用了一种类似于「栈」的结构。在一天的开始,这个栈为空栈。现在有 \(n\) 次操作,分为两种:

  1. \(\colorbox{f0f0f0}{\verb!1 l r!}\) :团子机器生产出来了颜色为 \(l,l+1,\cdots r-1,r\) 的团子。清兰将这些团子依次入栈。也就是在栈顶依次加入 \(l,l+1,l+2,\cdots r-1,r\) 。
  2. \(\colorbox{f0f0f0}{\verb!2 k!}\) :有一位客人想要购买 \(k\) 个团子。此时清兰会依次从栈顶取出 \(k\) 个团子并售出。保证 \(k\) 不大于当前栈内的团子个数。

你要做的,就是对于每个操作 \(2\) 输出这些团子的总价格。

输入格式

第一行有一个整数 \(n\),表示操作的个数。
接下来 \(n\) 行描述一组询问。第一个整数 \(op\) 表示询问的种类,若为 \(1\) 则为操作 \(1\),为 \(2\) 则为操作 \(2\)。

  • 对于操作 \(1\),接下来有两个整数 \(l,r\),含义如题面所示。
  • 对于操作 \(2\),接下来有一个整数 \(k\),含义如题面所示。

输出格式

若干行。对于每次操作 \(2\),输出这些团子的售价之和。

样例 #1

样例输入 #1

6
1 1 14
2 5
1 14 19
1 1 9
2 8
2 10

样例输出 #1

60
44
124

提示

样例 \(2\) 见下发的附件 \(\textbf{\textit{stack2.in}/\textit{stack2.out}}\)。


数据范围

  • 对于前 \(30\%\) 的数据,\(n,l,r\le100\)。
  • 对于另外 \(20\%\) 的数据,\(l=r\)。
  • 对于另外 \(20\%\) 的数据,\(k\le 10\)。
  • 对于 \(100\%\) 的数据,\(1\le n\le 5\times 10^5\),\(0\le l\le r \le 10^6\),\(1\le k \le 10^{12}\)。

窝又来水题解了最近比较懒,于是还是日更一篇8。这道题有效得训练了我们圈钱处理有序大数据的新方法。


正片开始

一眼数据范围,很明显不能直接暴力塞。但是呢,咱可以发现这些有序的团子可以用公式直接计算出,即\(ans=\frac{(l+r)(r-l+1)}{2}\),so只需要维护个团子段的左右端点即可。

操作一,
code:

cin>>l>>r;
s[cnt++]=make_pair(l,r);

操作二,
code:

cnt--;
cin>>k;
while(k)
{
   if(s[cnt].second-s[cnt].first+1>k)
    {
        ans+=(s[cnt].second*2-k+1)*k/2;
        s[cnt].second-=k;//新右端点
        k=0;
    }
    else
    {
        ans+=(s[cnt].first+s[cnt].second)*(s[cnt].second-s[cnt].first+1)/2;
        k-=(s[cnt].second-s[cnt].first+1);
        cnt--;
    }
}
cout<<ans<<endl;
cnt++;

注意数据大小,需要开\(long\) \(long\)。

十年OI一场空,不开\(long\) \(long\)见祖宗。


完整代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=2e6+5,mod=1e9+7;
int n,cnt=1;
pair<ll,ll>s[N];
int main()
{
    cin>>n;
    {
        for(int i=1;i<=n;i++)
        {
            ll ans=0,k=0;
            int op,l,r;
            cin>>op;
            if(op==1)
            {
                cin>>l>>r;
                s[cnt++]=make_pair(l,r);
            }
            else
            {
                cnt--;
                cin>>k;
                while(k)
                {
                    if(s[cnt].second-s[cnt].first+1>k)
                    {
                        ans+=(s[cnt].second*2-k+1)*k/2;
                        s[cnt].second-=k;
                        k=0;
                    }
                    else
                    {
                        ans+=(s[cnt].first+s[cnt].second)*(s[cnt].second-s[cnt].first+1)/2;
                        k-=(s[cnt].second-s[cnt].first+1);
                        cnt--;
                    }
                }
                cout<<ans<<endl;
                cnt++;
            }
        }
    }
    return 0;
}

完结收工!!!!!

个人主页

看完点赞,养成习惯

\(\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\)

标签:cnt,le,洛谷,P7870,题解,second,团子,Downarrow,first
From: https://www.cnblogs.com/qc0817/p/18353878

相关文章

  • CF1264E Beautiful League 题解
    CF1264E你有一张竞赛图,给你竞赛图中\(m\)条边的方向,让你对于没有给定的边确定方向使得整张图的三元环个数最多\(n\leq50,m\leq\frac{(n-1)n}{2}\)费用流好题三元环是一个非常难考虑的东西,我们考虑求他的补集:不是三元环的个数最少我们发现不是三元环的情况是存......
  • CF1586E. Moment of Bloom 题解
    CF1586E胡桃是一个小恶作剧高手,她用这个图问题试图吓唬你!你有一个包含\(n\)个节点和\(m\)条边的连通无向图。你还需要处理\(q\)个查询。每个查询由两个节点\(a\)和\(b\)组成。最初,图中的所有边的权重都是\(0\)。对于每个查询,你必须选择一条从\(a\)开始并以\(b\)......
  • CF1515F Phoenix and Earthquake 题解
    CF1515F给定一张\(n\)个点\(m\)条边的无向连通图和正整数\(x\),点有非负权值\(a_i\)。如果一条边\((u,v)\)满足\(a_u+a_v\gex\),可以将\(u,v\)缩起来,新点的点权为\(a_u+a_v-x\)。判断这张图是否可以缩成一个点。如果是,还要输出每次缩的是哪条边。\(2\len\le3......
  • CF1654E Arithmetic Operations 题解
    CF1654E给定一个长度为\(n\)的序列\(a\)。问至少需要修改几个数才能使得\(a\)变为一个等差数列。\(n\leq10^5\),\(1\leqa_i\leq10^5\)。我们可以发现值域\(\leq10^5\)实属可疑,我们可以就这点进行分析考虑对于序列的公差\(d\),如果\(d\)太大的话经过若干......
  • CF1508C Complete the MST 题解
    CF1508C给定一个有\(n\)个节点的完全图,其中\(m\)条边有给定的边权,剩下的没有给定。你需要给所有没有给定边权的边赋上非负整数边权,使得所有边的边权的异或和等于\(0\)。我们认为这个图的“丑陋值”为这个图的最小生成树的边权之和,求所有可能的赋值方案中,“丑陋值”的最小......
  • ABC366 题解
    D-CuboidSumQuery三维前缀和。不过有一维范围小,可以暴力然后二位前缀和。E-ManhattanMultifocalEllipse横纵坐标的距离是独立的。扫描线扫横坐标,维护每个可行点的纵坐标的距离和,查询就是\(\lex\)的数的个数。可以通过桶做到线性。F-MaximumCompositionExchan......
  • HDU 不要62 题解
    题目传送门思路数位dp数位dp数位dp模版题。依次考虑每一位,满足题目给出的限制,统计数量,是一些较简单的数位dp题目的过程。数位dp运用了差分的思想,即求\(ans(l-r)\)的答案用\(ans(1-r)-ans(1-(l-1))\)来表示.对于本题,我们需要满足的性质很简单:使数不超......
  • P1502 窗口的星星 题解
    题目传送门。思路扫描线扫描线首先,将题目中给出的条件和问题进行转化:首先先不考虑边框上的点不算在内的限制,考虑一个点可以对那些矩形产生贡献。只考虑矩形的右上角,容易发现,每个星星的亮度只对右上角在以星星为左下角的长为\(W\),高为\(H\)的矩形有贡献。如图。那么便可......
  • 洛谷 4道水题 题解(字符串入门)
    题目目录:No.1 B2109统计数字字符个数 No.2 B2110找第一个只出现一次的字符 No.3 B2111基因相关性No.4 B2113输出亲朋字符串OK开始正文!第一题:B2109统计数字字符个数题目描述输入一行字符,统计出其中数字字符的个数。输入格式一行字符串,总长度不超过 255。......
  • ABC366简要题解
    C直接维护一个桶,表示每个元素当前的出现次数。再利用这个桶直接维护答案即可。D三维前缀和模板题。E注意到答案中只会出现\(O(n)\)个不同\(x\),以及\(O(n)\)个不同的\(y\)。于是单独考虑\(x\)和\(y\),最后尺取求一下答案即可。F首先我第一个尝试的思路是贪心,但是......