首页 > 其他分享 >Codeforces Round #813 (Div. 2)

Codeforces Round #813 (Div. 2)

时间:2022-09-20 11:00:28浏览次数:91  
标签:lcm now int Codeforces 枚举 Div 813 我们 2k

Codeforces Round #813 (Div. 2)

D. Empty Graph

分析

我们通过简单的分析,可以得出一个结论,我们的答案一定来自于相邻两个点的位置或是最小值的两倍

我们考虑如何给构造。

第一种

我们希望最终的最大值来自于u直接走到v,根据刚才的结论答案就是min(a[i], a[i + 1]),那么他们之间一定存在一个最小值。因此我们要用一次操作把其中一个变成无穷大,因此最终我们一定能取到最大权值的那个数。剩余的k - 1次我们只需要把最小的那k - 1次变成正无穷即可。

第二种

我们希望最终的最大值来自于2 * 最小权值。我们要尽量抬高最小的值,因此我们只需要将最小k个权值变成无穷大即可。那么最终答案就来自于2 * minv并且枚举一遍相邻位置上的最小值min(a[i], a[i + 1])即可。

我们直接看代码。

AC_code

#include <bits/stdc++.h>
#define fi first    
#define se second    
#define endl '\n'
#define ios ios::sync_with_stdio(false); cin.tie(0), cout.tie(0)
typedef long long LL;
using namespace std;
typedef pair<int,int> PII;
const int N = 1e5 + 10,M = N*2,INF = 1e9;
   
void solve() {
    int n,k;cin>>n>>k;
    vector<int> a(n);
    vector<PII> p(n);
    for(int i=0;i<n;i++) cin>>a[i],p[i] = {a[i],i};
    sort(p.begin(),p.end());
    for(int i=0;i<k-1;i++)
    {
        p[i].first = INF;
        a[p[i].second] = INF;
    }
    sort(p.begin(),p.end());
    int res1 = INF,res2 = INF;
    res1 = min(res1,p[0].first*2);
    res1 = min(res1,p[n-1].first);

    p[0].first = INF;a[p[0].second] = INF;
    sort(p.begin(),p.end());
    res2 = min(res2,p[0].first*2);
    int tmp = -INF;
    for(int i=0;i<n;i++) a[p[i].second] = p[i].first;
    for(int i=0;i<n-1;i++) tmp = max(tmp,min(a[i],a[i+1]));
    res2 = min(tmp,res2);
    cout<<max(res1,res2)<<"\n";
}
 
int main() 
{
    ios;
    int T=1;
    cin>>T;
 
    while(T -- ) {
        solve();
    }
 
    return 0;
}

E2. LCM Sum (hard version)

题目大意

t组样例,每组给定一个区间[l,r]\((r\leq2*10^5)\)。问满足\(l\leq i\leq j \leq k \leq r,lcm(i,j,k)\geq i+j+k\)的三元组数目。

easy version中\(t\leq5\),hard version中\(t\leq 10^5\)。

分析

如果直接去分析\(lcm(i,j,k)\geq i + j + k\),其并不好求。我们考虑逆向求,\(lcm(i,j,k)<i+j+k<3k\)。

此时,只有两种情况。lcm(i,j,k)=klcm(i,j,k)=2k

对于第一种情况,则不等式成立当且ij都为k的因子。

第二种情况,不等式成立,当且仅当ij都为2k的因子,且需要i+j>k*(这里是因为\(lcm(i,j,k)=2k<i+j+k\))。

先计算每个k在[l,r]中有多少个小于k的因子,记作f[k]

枚举k,第一种情况答案等于从f[k]个因子中随机任取两个的因子,即为(f[k]-1)*f[k]/2

此时我们可以推导出来,j只能等于2k/3,而i只能等于k/2或者2k/5

因为\(k/2<j<k\),同时又必须是2k的因子,因此设j=2k/p

所以可以推出,2<p<4,即p只能等于3j=2k/3

i+j>k可知,\(i>\frac{1}{3}k\),又因i2k因子,则设i = 2k/q

则我们可以推得,3<q<6,因此q只能等于4或5,此时i=k/2或者2k/5

则第二种减去这些情况即可。

对于easy version我们考虑直接暴力枚举即可。

但是对于hard version。若我们每个询问都暴力枚举,铁炸无疑。同时考虑没有修改,我们考虑离线。

我们发现一个位置其对后面的其所有倍数有影响,因此我们只需要从后向前枚举,枚举到当前点时,我们直接考虑将该点对后面的点的影响加上。

同时维护当前点作为i时,对后面合法的j的影响即可。

AC_code

#include<bits/stdc++.h>
#define ios ios::sync_with_stdio(false); cin.tie(0), cout.tie(0)
using namespace std;
typedef long long LL;
const int N = 2e5 + 10;

struct Node
{
    int l,r,id;
    bool operator<(const Node &W) const
    {
        return l>W.l;    
    }
}query[N];

LL tr[N];
LL cnt[N],ans[N];
vector<vector<int>> ks(N);
int q;

void add(int x,int c)
{
    while(x<N)
    {
        tr[x] += c;
        x += x & -x;
    }
}

LL sum(int x)
{
    LL res = 0;
    while(x)
    {
        res += tr[x];
        x -= x & -x;
    }
    return res;
}

int main()
{
    ios;cin>>q;
    for(int i=0;i<q;i++)
    {
        int l,r;cin>>l>>r;
        query[i] = {l,r,i};
        int n = r - l + 1;
        ans[i] = 1ll*n*(n-1)*(n-2)/6;
    }
    sort(query,query+q);
    int now = N;
    for(int i=0;i<q;i++)
    {
        int l = query[i].l,r = query[i].r,id = query[i].id;
        while(now>l)
        {
            now--;
            if(now%6==0) ks[now/2].push_back(now);
            if(now%15==0) ks[now/5*2].push_back(now);
            for(int j=2*now;j<N;j+=now)  add(j,cnt[j]++);
            for(auto j:ks[now]) add(j,1);
        }
        ans[id] -= sum(r);
    }
    for(int i=0;i<q;i++) cout<<ans[i]<<'\n';
    return 0;
}

标签:lcm,now,int,Codeforces,枚举,Div,813,我们,2k
From: https://www.cnblogs.com/aitejiu/p/16710277.html

相关文章

  • CF round 812 div2 A-D 题解
    首先第一题TravelingSalesManProblem,给出一些坐标,就是问从原点出发,然后收集所有的点,问最少需要多少次移动这个就是求收集完那曼哈顿距离,这个距离稍加观察可以发现,就是......
  • Codeforces Round #640 (Div. 4) C. K-th Not Divisible by n
    CodeforcesRound#640(Div.4)翻译岛田小雅C.K-thNotDivisiblebyn出题人MikeMirzayanov有两个正整数\(n\)和\(k\),输出第\(k\)个不能被\(n\)整除的正整......
  • torch.nn.KLDivLoss
    CLASStorch.nn.KLDivLoss(size_average=None,reduce=None,reduction='mean',log_target=False)TheKullback-Leiblerdivergenceloss.Fortensorsofthesames......
  • CF1694E Keshi in Search of AmShZ#800(div.2)
    题目链接https://codeforces.com/contest/1694/problem/E题意简述\(Keshi\)准备从城市\(1\)出发,前往\(AmShZ\)所在的城市\(n\).这里一共有\(n\)个城市,编号......
  • Codeforces Round #819 D
    D.EdgeSplitn+2条边并且连通图就证明最多多3条边我们可以想到的是要是连成了环的话不如拆一条边给其他颜色所以我们一定要无环我们先跑一遍最小生成树确定成红色......
  • 一个div靠左另一个靠右
    1.使用flex布局<style> #back{ border:redsolid1px; width:800px; height:500px; display:flex; align-items:center; } #left{ ......
  • js在指定div右键菜单 js限制div内使用鼠标右键功能
     最近在做一个小东西的时候需要在某一个元素上“右击”触发一个自定义菜单,通过自定义的菜单对右击的条目进行编辑。这就要求屏蔽默认的右键菜单IE和FF下面的元素都有onc......
  • div居中方法
    1.在父元素使用display:flex;justify-content:center;align-items:center其中justify-content是左右居中,align-items是上下居中......
  • 将div排成一列
    1.在子元素使用display:inline-block注意子元素宽度加上边距不能超过父元素宽度,否则就在下一行展示<style>#back{ border:redsolid1px; width:800px; ......
  • Codeforces Round #316 (Div. 2) D Tree Requests
    TreeRequests判断\(V_i\)的子树中,深度为\(h_i\)的结点上所带有的字符,能否组成一个回文串启发式合并维护所有深度上不同字符的数量,并且维护其奇数字符出现的次数如......