首页 > 其他分享 >abc367

abc367

时间:2024-08-24 19:16:02浏览次数:8  
标签:const int namespace long 1e6 main abc367

A.

模拟


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

const int N = 1e6 + 7;
int main() {
    int a, b, c;
    cin >> a >> b >> c;
    if(b < c) {
        if(a > c || a < b) cout << "Yes" << endl;
        else cout << "No" << endl;
    }
    else {
        if(a < c || a > b) {cout << "No" << endl;}
        else cout << "Yes" << endl;
    }
    return 0;
}

B.

模拟


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

const int N = 1e6 + 7;
int main() {
    string s;
    cin >> s;
    int flag = 1, p;
    for(int i = s.size() - 1; i >= 0; i --) {
        if(s[i] != '0' && flag) {
            flag = 0;
            p = i;
        }
    }
    if(s[p] == '.') p --;
    for(int i = 0; i <= p; i ++) cout << s[i];
    return 0;
}

C.

D.

很典的题,先破环成链,然后可以处理前缀和然后使用 map,可以只使用 \([n + 1, 2n]\) 注意去一下重。


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

const int N = 1e6 + 7;
int a[N];
map<int, int> mp;
int ans;
signed main() {
    int n, m;
    cin >> n >> m;
    int nw = 0;
    for(int i = 1; i <= n; i ++) cin >> a[i];
    for(int i = n + 1; i <= n * 2; i ++) a[i] = a[i - n];
    for(int i = 1; i <= n; i ++) {
        nw = nw + a[i];
        nw %= m;
        mp[nw] ++;
    }
    int p = nw;
    int o = 0;
    for(int i = n + 1; i <= n * 2; i ++) {
        nw += a[i];
        o = (o + a[i]) % m;
        nw %= m;
        mp[nw] ++;
        mp[o % m] --;
        ans += mp[nw] - 1;
    }   
    cout << ans << endl;
}

E.

考虑跳 \(i\) 次会跳到哪里,可以使用倍增维护。再进行二进制拆分,若 \(k\) 的第 \(i\) 位为1,则要跳 \(2^i\) 次。

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

const int N = 1e6 + 7;
int x[N], a[N];
int f[N][64];
int ans[N];
signed main() {
    int n, k;
    cin >> n >> k;
    for(int i = 1; i <= n; i ++) cin >> a[i];
    for(int i = 1; i <= n; i ++) cin >> x[i];
    for(int i = 1; i <= n; i ++) f[i][0] = a[i], ans[i] = i;
    for(int j = 1; j <= 63; j ++) {
        for(int i = 1; i <= n; i ++) {
            f[i][j] = f[f[i][j - 1]][j - 1];
        }
    }
    int p = 0;
    while(k) {
        if(k & 1) {
            for(int i = 1; i <= n; i ++) ans[i] = f[ans[i]][p];
        }
        k >>= 1;
        p ++;
    }
    for(int i = 1; i <= n; i ++) cout << x[ans[i]] << " ";
    return 0;
}

F.

。。

给 \(1\) 到 \(n\) 每个数随即映射到一个整数 \(v_i\),判断 \(\sum v_{a_i}\) 是否等于 \(\sum v_{b_i}\) 即可。


#include<bits/stdc++.h>
#define ull unsigned long long
using namespace std;

const int N = 1e6 + 7;
int a[N], b[N];
ull h[N], a1[N], b1[N];

mt19937 rng(random_device{}());

int main() {
    int n, q;
    cin >> n >> q;
    for(int i = 1; i <= n; i ++) cin >> a[i];
    for(int i = 1; i <= n; i ++) cin >> b[i];   
    for(int i = 1; i <= n; i ++) h[i] = rng();
    for(int i = 1; i <= n; i ++) a1[i] = a1[i - 1] + h[a[i]], b1[i] = b1[i - 1] + h[b[i]];
    for(int i = 1; i <= q; i ++) {
        int l, r, L, R;
        cin >> l >> r >> L >> R;
        if(a1[r] - a1[l - 1] == b1[R] - b1[L - 1]) {
            cout << "Yes" << endl;
        }
        else cout << "No" << endl;
    }
    return 0;
}

标签:const,int,namespace,long,1e6,main,abc367
From: https://www.cnblogs.com/wyyqwq/p/18378108

相关文章

  • ABC367
    Alink先判断一下时间是否跨天,如果跨天了,把后一个加上\(24\),使后一个大于前一个,再判断国王喊的时间或喊的时间加\(24\)是否在范围内。神奇的代码#include<bits/stdc++.h>usingnamespacestd;signedmain(){ inta,b,c; cin>>a>>b>>c; if(b>c)c+=24; ......
  • [ABC367D] Pedometer-xzy巨佬简洁做法
    [ABC367D]Pedometer-xzy巨佬简洁做法https://www.luogu.com/article/n64n78cs对照巨佬的代码进一步理解//徐知鱼#include<bits/stdc++.h>usingnamespacestd;inlineintread(){ intx=0,f=1; charch=getchar(); while(!isdigit(ch)){ if(ch=='-')f=......
  • 题解:AT_abc367_c [ABC367C] Enumerate Sequences
    大致题意让你按照字典序输出一些长\(n\)的序列,序列中的数字有范围,且序列和需要为\(k\)。分析直接深搜。搜索的时候对从第一个元素开始,每个元素从小到大枚举所有可能的值,这样就保证答案按照字典序升序排列。用一个vector存储序列,到达边界之后计算一遍和,判断是否满足条件,然......
  • 题解:AT_abc367_d [ABC367D] Pedometer
    首先肯定要单层循环枚举元素,然后想方法求出一个元素的所有答案。一开始我写了一个二分找\(m\)倍数的方法,发现\(m\)小的时候还不如暴力。于是联想到之前做过的一道题,可以借助于取模的前缀和数组。对于当前元素\(i\),如果一个元素之前的前缀和与\(i\)之前的前缀和对\(m\)......
  • Atcoder [ABC367F] Rearrange Query 题解
    简要题意给定两个长度为\(N\)的序列\(A\)和\(B\)。有\(Q\)个查询,每个查询给定\(l,r,L,R\),其中\(l\leqr,L\leqR\),要求判断\(A\)的第\(l\)项到第\(r\)项构成的集合与\(B\)的第\(L\)项到第\(R\)项构成的集合是否相等。题解显然两个相等的集合所有元素......
  • Atcoder [ABC367C] Enumerate Sequences 题解
    简要题意给定\(n,k\)和\(R_i\),你需要输出所有满足下列条件的整数序列:长度为\(n\)。第\(i\)个元素的范围为\([1,R_i]\)。一个序列的所有元素的总和为\(k\)的倍数。输出请按照按照从左至右按位从小到大的顺序输出。题解注意到数据范围很小,我们可以直接爆搜,这里用......
  • 题解:AT_abc367_e [ABC367E] Permute K times
    题意给你一个长度为\(N\)的序列\(X\),其中每个元素都介于\(1\)和\(N\)之间(含),以及一个长度为\(N\)的序列\(A\)。打印在\(A\)上执行以下操作\(K\)次的结果。将\(A_i\)替换为\(A_{X_i}\)。每个操作同时进行。思路元素\(i\)经过\(k\)次变化后的值就是元素......