首页 > 其他分享 >P4145 上帝造题的七分钟 2 / 花神游历各国 势能

P4145 上帝造题的七分钟 2 / 花神游历各国 势能

时间:2023-06-18 22:44:55浏览次数:43  
标签:势能 int ll typedef long 七分钟 P4145 造题

P4145 上帝造题的七分钟 2 / 花神游历各国

这道题解法很多,但我主要想提一下势能这个概念。

就像重力势能一样,一个物体只会往下落,且到达零势面之后不会再继续往下落(虽然和真实情况有出入)

因此,我们往往可以利用这个特性,来减少许多不必要的操作;

对于这道题而言,我们发现一个数如果已经开到1,那么再多的操作对他都毫无意义(即到达零势面),此后我们可以忽略掉他。

观察数据范围,每个数最多开六次根,就会变成1,那么我们开一个变量,记录它是否变成1.如果一个区间已全部变成1,那么对于他的修改可直接跳过。

GSS4 - Can you answer these queries IV  (双倍经验)

具体细节见代码。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3e5+555;
typedef long double lb;
typedef long long ll;
typedef double db;
const ll inf=1e18+10;
const ll mod=1e9+7;
ll a[N];
struct node{
    int l,r;
    ll mx,sum;
}t[N<<2];
void build(int u,int l,int r){
    t[u].l=l;t[u].r=r;
    if(l==r){
        t[u].mx=a[l];
        t[u].sum=a[l];
        return;
    }
    int M=(l+r)>>1;
    build(u<<1,l,M);build(u<<1|1,M+1,r);
    t[u].mx=max(t[u<<1].mx,t[u<<1|1].mx);
    t[u].sum=t[u<<1].sum+t[u<<1|1].sum;
    return;
}
ll ask(int u,int l,int r){
    int L=t[u].l,R=t[u].r;
    if(L>=l&&R<=r){
        return t[u].sum;
    }
    int M=(L+R)>>1;
    ll val = 0;
    if(l <= M) val += ask(u << 1, l, r);
    if(r > M) val += ask(u << 1 | 1, l, r);
    return val;
}
void change(int u,int l,int r){
    int L=t[u].l,R=t[u].r;
    if(t[u].mx<=1) return;
    if(L==R){
        t[u].sum=t[u].mx=sqrt(t[u].mx);
        return;
    }
    int M=(L+R)>>1;
    if(M>=l) change(u<<1,l,r);
    if(M<r) change(u<<1|1,l,r);
    t[u].sum=t[u<<1].sum+t[u<<1|1].sum;
    t[u].mx=max(t[u<<1].mx,t[u<<1|1].mx);
    
}
int n,q;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    int q;
    cin>>q;
    build(1,1,n);
    while(q--){
        int op,l,r;
        cin>>op>>l>>r;
        if(l>r) swap(l,r);
        if(!op) change(1,l,r);
        else cout<<ask(1,l,r)<<endl;
    }
    return 0;
}
View Code

 

我们再思考一道题:

对于一个有正有负的数列,我们有两种操作:

区间加上一个正数;

询问区间绝对值之和。

显然,一个数如果已经被加成正数,那么它永远也无法回到负数的状态。因此我们新增一个变量,记录该区间是否全部变成正数。如果不是的话,我们需要跳到更小区间,对于负数需要单独修改。而一个区间一旦全部为正,就变成了最普通的线段树。

我并不知道这个题应该交到哪

有人知道了告诉我一声

势能线段树虽然考的不多,但势能作为一种很重要的思想,还是有必要掌握的。

标签:势能,int,ll,typedef,long,七分钟,P4145,造题
From: https://www.cnblogs.com/DongPD/p/17489925.html

相关文章

  • 有趣的构造题
    前言:这篇题单里放了一些个人认为很有用/新奇的构造题,这些是我第一次见比较难想出来题,建议想不出来先看下思路。CF1198C题意给一个无向简单图,\(3\timesn\)个点,\(m\)条边,请找大小为\(n\)的点独立集或边独立集。输出点独立集、边独立集均可,或输出无解。输出方案的同时需输出......
  • [P4145 上帝造题的七分钟 2 / 花神游历各国]题解
    P4145上帝造题的七分钟2/花神游历各国题目描述分析一开始在思考有没有一个数学公式来处理每一个开方的操作但发现数据的\(\le10^{12}\)那么最多开六次就变成1了(突破口)这样每一个数的有用操作只有6次其他就全部是1很显然,我们可以去记录每一段是否全为1再用线段树、分......
  • UVa 11129 An antiarithmetic permutation (构造题&想法题&分治)
    11129-AnantiarithmeticpermutationTimelimit:3.000secondshttp://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=113&page=show_problem&problem=2070Apermutationof n+1 isabijectivefunctionoftheinitial n+1......
  • [做题记录] 构造题选做
    一、CF743C-Vladikandfractions(*1500)目标:给定\(n\),构造\(x,y,z\)满足\(x\neqy,x\neqz,y\neqz\)且\(\dfrac{2}{n}=\dfrac{1}{x}+\dfrac{1}{y}+\dfrac......
  • 构造题学习笔记
    抽屉原理在构造题中,若我们遇到了\(n/k\)这样的操作次数的时候,可以考虑将所有数划分为\(k\)个集合。这样,最小的那个集合的大小就一定小于等于\(n/k\)了。CF1198C给......
  • Luogu P4145 上帝造题的七分钟 2 / 花神游历各国 题解
    Luogu链接:上帝造题的七分钟2/花神游历各国${\scr\color{Orchid}{\text{Solution}}}$题目大意支持两种操作:区间开方(向下取整)区间求和分析发现线段树容易实......
  • 【刷题记录】CF 交互构造题
    CF1779E给一张竞赛图,问一个\(n-1\)场淘汰赛之后可能的冠军有哪些。通过交互得到竞赛图的度。然后运用竞赛图的一些性质:可能的冠军\(u\)能够到达其他所有节点;......
  • Digit Problem(构造题)
    原题链接官方题解个人理解:AC代码#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;intmain(){ inta,b,c; cin>>a>>b>>c; if(c>a+b-1||......
  • CodeForces 构造题专项解题报告(二)
    CodeForces构造题专项解题报告(二)\(\newcommand\m\mathbf\)\(\newcommand\oper\operatorname\)\(\newcommand\txt\texttt\)\(\text{ByDaiRuiChen007}\)来源:CodeF......
  • CF构造题1600-1800(2)
    H.HotBlackHotWhite(COMPFEST14-PreliminaryOnlineMirror(Unrated,ICPCRules,TeamsPreferred))题意有\(n\)个石头,每个石头有一个值\(a_i\),现在需要给这......