首页 > 其他分享 >Hey left 1 Codeforces Round 918 (Div. 4)

Hey left 1 Codeforces Round 918 (Div. 4)

时间:2024-01-12 23:22:51浏览次数:47  
标签:int 个数 hey Codeforces while Hey 918 solve left

题目链接

A.

3个数,其中2个数相同,输出不相同的那个
可以用if else判断,较为麻烦
用的map,输出出现一次的

#include <bits/stdc++.h>
using namespace std;

const int N=1e5+10;

void solve(){
    map<int,int>mp;
    for(int i=0,x;i<3;i++){
        cin>>x;
        mp[x]++;
    }
    for(auto t:mp){
        if(t.second==1)cout<<t.first<<endl;
    }
}


signed main(){
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int hey_left=1;
    cin>>hey_left;
    while(hey_left--){
        solve();
    }
    return 0;
}

B.

3种字符每行只有一个,那么就有3个,同时每列也要有一个
所以3种字符都应该出现三次
map计数,不等于3并且不是?就输出

#include <bits/stdc++.h>
using namespace std;

const int N=1e5+10;

void solve(){
    map<char,int>mp;
    for(int i=0;i<9;i++){
        char c;cin>>c;
        mp[c]++;
    }
    for(auto t:mp){
        if(t.second!=3&&t.first!='?')cout<<t.first<<endl;
    }
}


signed main(){
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int hey_left=1;
    cin>>hey_left;
    while(hey_left--){
        solve();
    }
    return 0;
}

D.

难点在两种音节都满足条件的情况下,应该选哪一种音节
考虑从音节本身的特点出发,能不能唯一确定
结构为 CV 或 CVC
可以发现,从后往前看
如果最后一个字母是V,那么能唯一确定取两个字符的音节
如果最后一个字母是C,那么能唯一确定取三个字符的音节
至此,思路解决

debug的一个点:
我把得到的音节都储存在一个栈里
题目要求输出的音节之间有一个分隔符,最后一个音节后面不要分隔符
我的处理方式是先用一个变量si记录栈的容量
然后用while(si--)的方式来特判最后一个音节
错误:if(si!=1)cout<<'.';
正确:if(si!=0)cout<<'.';
语法糖了属于是,while时si是1,但循环内si已经变为0

#include <bits/stdc++.h>
using namespace std;

void solve(){
    stack<string>st;
    int n;cin>>n;
    string s;cin>>s;
    int i=s.size()-1;
    while(i>=0){
        string t="";
        if(s[i]=='a'||s[i]=='e'){
            t.push_back(s[i-1]);t.push_back(s[i]);
            st.push(t);
            i-=2;
        }else {
            t.push_back(s[i-2]);t.push_back(s[i-1]);t.push_back(s[i]);
            st.push(t);
            i-=3;
        }
    }
    int si=st.size();
    while(si--){
        cout<<st.top();st.pop();
        if(si!=0)cout<<'.';
    }
    cout<<endl;
}


signed main(){
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int hey_left=1;
    cin>>hey_left;
    while(hey_left--){
        solve();
    }
    return 0;
}

E.

这道题因为之前有人说过,算是第二次做了
话说第一次做的时候没做出来,绕在了定性思维,看了下1300分的题,好好好,惭愧

判断是否存在一个子序列,奇数位的和等于偶数位的和
如果把偶数位数值取反,相当于这段和为0,消去了
族友提供了一个很新颖的办法(可能对我来说),跑一遍前缀和,用map存下每个值,如果某个值的个数大等于2,说明一定有一段和为0,才会出现相等的情况
当时还debug了一个点,map里要预先mp[0]++,因为前缀和开始的数值是0

#include <bits/stdc++.h>
using namespace std;

const int N=2e5+10;
#define int long long

void solve(){
    int n;cin>>n;
    int a[N];
    for(int i=1;i<=n;i++){
        cin>>a[i];
        if(i%2==0)a[i]=-a[i];
    }
    map<int,int>mp;
    mp[0]++;
    int sum=0;
    for(int i=1;i<=n;i++){
        sum+=a[i];
        mp[sum]++;
    }
    for(auto t:mp){
        if(t.second>=2){
            cout<<"YES"<<endl;return ;
        }
    }
    cout<<"NO"<<endl;
}


signed main(){
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int hey_left=1;
    cin>>hey_left;
    while(hey_left--){
        solve();
    }
    return 0;
}

G.

初步思路:两个人a和b,若a的起点比b的起点小,且a的终点比b的终点大,那么他们俩一定会相遇
直接用例子讲:
8 10
6 7
3 4
-2 5
-4 9

从上往下,每个数之和这个数之下的数去比较
有几个比第二维大的,答案就加几
如0+1+2+1=4

记得之前浅学了一个伸展树的模板,属于无脑毒瘤数据结构了
在线算法,插入一个数后,可以求当前数的排名(比当前数小的数的个数+1)
那么我们要求比当前数小的数,直接排名-1即可
于是乎风风火火地贴模板,过了样例,但T2

正解原来是求逆序对!
这个题应该做过至少两次了,这次还是不会做,又忘了,逆序对也忘了
直接重开

先整个树状数组的结构体封装(已测)

#include <bits/stdc++.h>
using namespace std;

#define int long long
template <typename T>
struct TreeArray{
    vector<T> tree;

    TreeArray(T n){
        tree.resize(n+1,T(0));
    }

    void update(T index,T value){
        while(index<tree.size()){
            tree[index]+=value;
            index+=index&(-index);
        }
    }

    T query(T index){
        T sum=0;
        while(index>0){
            sum+=tree[index];
            index-=index&(-index);
        }
        return sum;
    }
};

void solve(){
    int n,m;cin>>n>>m;
    TreeArray<long long> ta(n);
    for(int i=1,x;i<=n;i++){
        cin>>x;
        ta.update(i,x);
    }
    for(int i=0;i<m;i++){
        int op,x,y;cin>>op>>x>>y;
        if(op==1){
            ta.update(x,y);
        }else if(op==2){
            cout<<ta.query(y)-ta.query(x-1)<<'\n';
        }
    }
}


signed main(){
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int hey_left=1;
    //cin>>hey_left;
    while(hey_left--){
        solve();
    }
    return 0;
}

树状数组求逆序对的思想:
一列数,我们求第i个数的逆序对的个数,也就是它的前面有几个比它大的数
那么可以用i-它的前面比它小的数的个数
注意,为什么这样转换呢
因为数组下标天然有序且是正序,我们可以把数和下标对应起来,出现的数我们把数组值设为1,那么我们求第i个数的前缀和-1,不就算出了第i个数前面有几个小于它的数了吗
用i-它的前面比它小的数的个数,即求出逆序对个数
总的说,树状数组就起了个标记+求前缀和的作用,整个思想巧妙简单,要记牢,并且写法优美,值得一记

具体明天再来,下班

标签:int,个数,hey,Codeforces,while,Hey,918,solve,left
From: https://www.cnblogs.com/wwww-/p/17961409

相关文章

  • CodeForces 1237H Balanced Reversals
    洛谷传送门CF传送门容易想到把\(s,t\)分成长度为\(2\)的段考虑。容易发现\(00,11\)的个数在操作过程中不会改变,所以若两串的\(00\)或\(11\)个数不相等则无解。考虑依次对\(i=2,4,\ldots,n\)构造\(s[1:i]=t[n-i+1:n]\)。对于\(s_{j-1}s_j=y......
  • Codeforces [Hello 2024]
    CodeforcesHello2024主打一个昏了头A.WalletExchange#include<bits/stdc++.h>#defineendl'\n'//#defineintlonglongusingnamespacestd;constintN=2e5+10;inta,b;voidsolve(){ cin>>a>>b; if((a+b)&1)cout<<......
  • CodeForces 1379E Inverse Genealogy
    洛谷传送门CF传送门\(n\)为偶数显然无解。否则我们可以构造一棵\(n\)个点的完全二叉树,当\(n+1\)是\(2\)的幂时满足\(m=1\),否则\(m=0\)。当\(n\ge5\)时可以递归至\((n-2,m-1)\),再挂一个叶子即可。但是可能会出现\(n+1\)不是\(2\)的幂,但\(n-......
  • codeforces比赛(3):codeforces good_bye_2023
    A、2023跳转原题点击此:A题地址1、题目大意  在一个乘积可能等于2023的数组a中去掉了k个数,得到新的长度为n的b数列。请你输出k个数,使得这k个数与b数列相乘为2023.如果不存在则输出No。2、题目解析  因为这道题的n和k都是不超过5,所以我们只需要算出b数组的乘积是否是2023的......
  • cf 918(D-G) div4
    cf918(D-G)div4D.UnnaturalLanguageProcessing算法分析:string模拟+贪心贪心策略:把元音字母看作0,辅音字母作为1,因为是等价的,构造字符串,寻找a.find("101"),a.find("10");判断合理性,贪心选择101还是10,最后把原数组打印,erase删除前面的"101"/"10"串,直到串删为空不要偷懒......
  • Codeforces Round 918 (Div. 4) (前缀和,权值树状数组,二维偏序, python + golang)
    Dashboard-CodeforcesRound918(Div.4)-Codeforces  fromcollectionsimport*defsolve():a,b,c=list(map(int,input().split()))hs=defaultdict(int)hs[a]+=1hs[b]+=1hs[c]+=1foriinhs:ifhs[i]=......
  • [Codeforces] CF1545A AquaMoon and Strange Sort
    CF1545AAquaMoonandStrangeSort题目传送门题意有\(n\)个人从左到右站成一排,从左数第\(i\)个人的衣服上印着\(a_i\)。每个人的朝向可以是朝左、朝右。一开始所有人的方向都是朝右。您可以对这些人做一些“操作”,每次操作允许您找两个相邻的人让他们交换顺序,但是在操作......
  • [Codeforces] CF1547E Air Conditioners
    CF1547EAirConditioners题目传送门这道题我的思路严重劣于题解思路,所以请慎用但是自认为我的贪心比dp好理解点题意有\(q\)组数据,每组第一排表示有\(n\)个方格和\(k\)个空调,第二排是每个空调的位置\(a_i\),第三排是每个空调的温度\(t_i\)。每个空调对周围的影响......
  • codeforces刷题(1100):1862C_div3
    C、FlowerCityFence跳转原题点击此:该题地址1、题目大意  给你n块长度依次不递增的紧密连接在一起的垂直木板,将它们水平横过来,问其组成的全新n块木板的长度是否与原来的木板长度一致。  注意:这里的长度是指:木板的高度。水平摆放后的木板是左对齐,所以其长度就是各个木板水......
  • codeforces刷题(1100):1863B_div1+div2
    B、SplitSort跳转原题点击此:该题地址1、题目大意  给定一个长度为n的排列(该排列的数字是包含\(1\simn\),每个数必须出现一次)。你可以执行以下操作:  选中一个数x,比x小的数按照原来的顺序放在x的左边,大于等于x的数按照原来的顺序放在x的右边。问你将原始排列组成\(a_i==......