首页 > 其他分享 >CodeTON Round 4 (Div. 1 + Div. 2, Rated, Prizes!) A-E

CodeTON Round 4 (Div. 1 + Div. 2, Rated, Prizes!) A-E

时间:2023-04-01 17:44:10浏览次数:48  
标签:遍历 int ch read while Rated Prizes ans Div

从C题开始写好了 

Make It Permutation

首先我们分析假如我们确定了要选择一个长度为n的序列,该怎么计算代价 

很明显 一个是算保留多少个 一个是算要加多少个,然后如果我们算完了选择长度n-1的序列 那么更新答案的时候只需要看n这个数字是否存在就可以了,然后更新一下删掉多少个数字 

所以我们把原序列排序 然后枚举选长度为b[i]的排列 就可以每次o(1)计算了 时间复杂度O(n) 

#include<bits/stdc++.h>
using namespace std ;
#define maxn 400100
#define int long long
int read(){
    int ans = 0 , f = 1 ; char ch = getchar() ;
    while ( !isdigit(ch) ){ if( ch == '-' ) f = -1 ; ch = getchar() ; }
    while ( isdigit(ch) ) ans = (ans * 10) + (ch ^ '0') , ch = getchar() ;
    return ans * f ;
}
int t , n , c , d ; 
int ans; 
int a[maxn] , b[maxn] ; 
signed main(){
    t = read() ; 
    while(t--){
        n = read() , c = read() ,d = read() ; 
        for(int i = 1 ; i <= n ; i++)
            a[i] = read() , b[i] = a[i] ; 
        sort(b + 1 , b + 1 + n) ; 
        int size = unique(b + 1 , b + 1 + n) - b - 1; 
        ans = 99999999999999 ; int temp = 0 ;  
        if(b[1] != 1)
            ans = n * c + d ; 
        for(int i = 1 ; i <= size ; i++){
            int sum = 0 ; 
            temp += (b[i] - b[i - 1] - 1) * d ; 
            sum = (n - i) * c + temp ;
//            printf("sunm : i : %lld %lld temp : %lld \n" , i , sum , temp) ; 
            ans = min(ans , sum) ; 
        }
        printf("%lld\n" , ans) ; 
    }
    return 0 ;
 }

D - Climbing the Tree

 

 感觉题解其实写的非常明白 实际上这个题也很简单 考试的时候很快公式就推出来了 结果最后错在用了 ceil((L-a)/ (a - b)) 可能精度会有点问题 最后爆在这里了 查了好久没查出来 警钟长鸣!!!

E.Monsters

其实这个难就难在你可以证明暴力是对的 

考虑从一个点出发可以到哪些点 我们可以用类似于bfs的方式来完成 每次取一个最小的a值的可以便利的点,判断一下可不可以遍历即可 

此时的复杂度是nlogn的 因为我们可以用一个堆来维护可能遍历的点的状态 

所以最后,我们从每一个从a值为0,且没有被遍历过的点开始bfs即可 

所以我们现在需要考虑 一个点最多会被遍历多少次 

假如现在有三个点 a , b , c a还连着很多边 c也是

a点是之前已经遍历过的点 我们现在在c点上 c是我们第一次遍历的点 

也就是说 之前从a那边开始遍历的时候 它遍历不过来 也就是没法到c的位置 为什么 因为b把它卡住了!

那么现在 假设我们从c这边有这个能力遍历过去,也就是说 我们有能力打败这个c 这意味着什么呢

意味从c这边的已经打过的怪物数量已经大于a[b],也就是c这边的点集的大小大于a【b】

而且a这边的点集大小是小于a【b】的 , 因为a没打过去 

所以最终c这边的大小一定是a这边的大小的两倍 ,因为c最后会把a这边也遍历一遍 点集的大小自然就扩大了

所以说,a每次被遍历的时候,新的点集的大小至少是翻倍的,所以a这个点最终会被遍历logn次 

因此 总复杂度就是n(logn)^2的

#include<bits/stdc++.h>
using namespace std ;
#define maxn 400100
#define int long long
int read(){
    int ans = 0 , f = 1 ; char ch = getchar() ;
    while ( !isdigit(ch) ){ if( ch == '-' ) f = -1 ; ch = getchar() ; }
    while ( isdigit(ch) ) ans = (ans * 10) + (ch ^ '0') , ch = getchar() ;
    return ans * f ;
}
int t , n , m ; 
int a[maxn] ; 
#define pii pair<int,int> 
vector<int> G[maxn] ; 
int vis[maxn] ; 
set<pii> q ; 
bool check(int u){
    q.clear() ; 
    q.insert({a[u] , u}) ; 
    int sum = 0 ; 
    while(!q.empty()){
        pii now = *q.begin() ; 
        q.erase(q.begin()) ; 
        if(now.first > sum){
            return 0 ; 
        }
        vis[now.second] = u ; 
        sum++ ; 
        for(int i = 0 ; i < G[now.second].size() ; i++){
            int v = G[now.second][i] ; 
            if(vis[v] < u)
                q.insert({a[v] , v}) ; 
        }
    }
    return sum == n ; 
}
signed main(){
    t = read() ; 
    while(t--){
        n = read() , m = read() ; 
        for(int i = 1 ; i <= n ; i++)
            G[i].clear() , a[i] = read() , vis[i] = 0; 
        for(int i = 1 ; i <= m ; i++){
            int u = read() , v = read(); 
            G[u].push_back(v) ; 
            G[v].push_back(u) ; 
        }
        bool flag = 0 ; 
        for(int i = 1 ; i <= n ; i++){
            if(a[i] == 0 && vis[i] == 0){
                if(check(i)){
                    flag = 1; 
                    break ; 
                }
            }
        }
        if(flag == 1){
            printf("yes\n") ; 
        }
        else printf("no\n") ; 
    }
    return 0 ;
 }

 

标签:遍历,int,ch,read,while,Rated,Prizes,ans,Div
From: https://www.cnblogs.com/Vellichor/p/17278995.html

相关文章

  • Codeforces Round 861 (Div. 2)
    题目链接C核心思路这个思路说实话有点玄学,也就是我们前面的数位按照l或者r的相同数位来填补,后面就填相同的数字也就是比如l是2345我们可以是2999,2888,23111,23777.这样构造好像肯定是最小的。但是好好巩固下数位dp来做这道题还是更好的。#include<iostream>#include<cstr......
  • CodeTON Round 4 (Div. 1 + Div. 2, Rated, Prizes!)(CF1810)A~D题题解
    今天采用的是新格式。CF1810ABeautifulSequence点击查看原题点击查看思路如果一个数字的值\(v\),不大于当前的位置\(p\),那我们可以通过删除\(p-v\)个数字,使它们两个对应上。比如\([1,7,2,5,3]\)中的\(3\),其数值为\(3\),位置为\(5\),数值\(3\)小于等于\(......
  • CodeTON Round 4 (Div. 1 + Div. 2, Rated, Prizes!) A-D题解
    题目地址A-BeautifulSequence题意:给出一个数组,问是否存在任意一个子区间,存在i,使得ai=iSolution直接比较当前的数和i的大小就行了,当前为x,如果要求答案存在,必须有i>=xvoidsolve(){ intn;cin>>n; intflag=0; for(inti=1;i<=n;i++) { intx;cin>>x; if(i>=x) {......
  • cf-div.2-860d
    题目链接:https://codeforces.com/contest/1798/problem/D贪心,比赛时一直搞C没搞出来,回头看D反而更简单。贪心策略:能填正数就填,填不了填负数。大致证明:构造的区间一定呈一个这样的特定区间,正...负正负负...负正....负负,证明一段区间为正且小于给定值易证,下面证最后一段区间的绝......
  • Codeforces Round 859 (Div. 4) ABCDE(交互题)FG1G2
    EFG1G2质量还挺好的A.PlusorMinushttps://codeforces.com/contest/1807/problem/A题目大意:给定a,b,c,问我们是a+b==c还是a-b==c?把正确的符号输出。input1112332129-7347112110336991899019-81910output+--++-++--+......
  • 定时任务@Scheduled中的cron 表达式和 fixedRated类配置参数
    1.cron表达式格式:@Scheduled(cron="******"){秒数}{分钟}{小时}{日期}{月份}{星期}{年份(可为空)}{秒数} ==>允许值范围:0~59,不允许为空值,若值不合法,调度器将抛出SchedulerException异常"*"代表每隔1秒钟触发;","代表在指定的秒数触发,比如"0,15,45"......
  • Div滚动到头以后置顶
    1<!DOCTYPEHTML>2<html>3<head>4<metacharset="utf-8"/>5<title>Div滚动到头以后置顶</title>6</head>7<bodystyle="height:2000px;">8<divstyle="height:200px&q......
  • cf-div2-860c
    题目链接:https://codeforces.com/contest/1798/problem/C大致题意:给你一个长度为\(n(n<=2e5)\)的序列的\(a_i,b_i\),让你把这个序列分成数目最少的段,每一段都有一个值\(c\),\(c=a_i的一个约数乘以b_i\)。比赛没写出的题。思路:\(首先一段里面的所有a_i*b_i能够整除c,易得c是所有b的......
  • 怎么改变div的位置、大小
    http://www.divcss5.com/rumen/r53973.shtml?ivk_sa=1024320uhttps://www.bbsmax.com/A/VGzl2Pk85b/ 可以使用css中的position来对div进行定位来改变div的位置,position属性值的含义。加上position:absolute,位置可以改变。    static:元素框正常生成。块级元素生成一个......
  • 如何让一个div拥有屏幕的高度
    有些时候登录页面需要设置一个图片有这个屏幕的大小但因为块级元素是根据自己内部的内容来撑起高度的当一开始没有内容或内容完全不足一页的时候就无法占据整个屏幕解决方法:将body,html,对应div的高度全部设置成为100%这样就可以让div撑满整个屏幕了。<body><divclass="ba......