Codeforces Round #470 (Div 2) B 数学 C 二分+树状数组 D 字典树

Codeforces Round #470

B. Primal Sport

数学题,对 x2 和 x1 分解质因子即可。

#include<bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define rep(i,a,b) for (int i=a; i<=b; ++i)
#define per(i,b,a) for (int i=b; i>=a; --i)
#define mes(a,b)  memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define MP make_pair
#define PB push_back
#define fi  first
#define se  second
typedef long long ll;
const int N = 200005;

int p1[N], cnt1;
void get(int x, int* p, int &num)
{
    num = 0;
    for(int i=2; i<=sqrt(x); ++i)
        if(x%i==0)
    {
        p[++num] = i;
        while(x%i==0) x/=i;
    }
    if(x > 1) p[++num] = x;
}
int p2[N], cnt2;
int x2;
int main()
{
    scanf("%d", &x2);
    get(x2, p1, cnt1);
    int ans = INF;
    rep(i,1,cnt1)
    {
        rep(x1, x2-p1[i]+1, x2)
        {
            get(x1, p2, cnt2);
            rep(l,1,cnt2)
            {
                if(x1-p2[l]+1 >= 3)
                    ans = min(ans, x1-p2[l]+1);
            }
        }
    }
    printf("%d\n", ans);

    return 0;
}

C. Producing Snow

二分+树状数组,对于 v[i] 看它最后在哪天消耗完。 然后树状数组 区间更新,单点查询。

#include<bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define rep(i,a,b) for (int i=a; i<=b; ++i)
#define per(i,b,a) for (int i=b; i>=a; --i)
#define mes(a,b)  memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define MP make_pair
#define PB push_back
#define fi  first
#define se  second
typedef long long ll;
const int N = 200005;

int n;
ll  v[N], t[N], bit[N], sum[N], ans[N];
void Add(int x, ll y) {
    for( ; x<N; x+=x&-x) bit[x] += y;
}
ll  Sum(int x) {
    ll  ret=0;  for( ; x; x-=x&-x) ret += bit[x];  return ret;
}
int main()
{
    scanf("%d", &n);
    rep(i,1,n) scanf("%lld", &v[i]);
    rep(i,1,n) scanf("%lld", &t[i]), sum[i]=sum[i-1]+t[i];
    sum[n+1] = 1e18;
    rep(i,1,n)
    {
        int pos = upper_bound(sum+1, sum+n+2, sum[i-1]+v[i]) - sum;
        ans[pos] += v[i] - (sum[pos-1]-sum[i-1]);
        Add(i, 1),  Add(pos, -1);
        ans[i] += Sum(i)*t[i];
    }
    rep(i,1,n) printf("%lld%c", ans[i], " \n"[i==n]);

    return 0;
}

D. Perfect Security

字典树

拆分成二进制,先把第二个数组插入到 trie树里,再在 trie树里跑第一个数组中的数。有相同的位就取相同,没有就取相反的。

#include<bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define rep(i,a,b) for (int i=a; i<=b; ++i)
#define per(i,b,a) for (int i=b; i>=a; --i)
#define mes(a,b)  memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define MP make_pair
#define PB push_back
#define fi  first
#define se  second
typedef long long ll;
const int N = 300005, M = 5e6;

void get(int* num, int x) {
    rep(i,0,32) num[i] = 0;
    for(int len=1; x; x>>=1, ++len) {
        if(x&1) num[len] = 1;
    }
}
int n, A[N], Pi;
int num[35], tr[M][2], val[M], tot;
void Insert(int x)
{
    get(num, x);
    for(int u=0, i=32; i>0; --i)
    {
        if(tr[u][num[i]] == 0) tr[u][num[i]] = ++tot;
        ++val[tr[u][num[i]]];
        u = tr[u][num[i]];
    }
}
int query(int x)
{
    int ret = 0;
    get(num, x);
    for(int u=0, i=32; i>0; --i)
    {
        int tmp = num[i]^1;
        if(val[tr[u][num[i]]] > 0) {
            --val[tr[u][num[i]]];
            u = tr[u][num[i]];
            ret <<= 1,  ret += num[i];
        }
        else {
            --val[tr[u][tmp]];
            u = tr[u][tmp];
            ret <<= 1,  ret += tmp;
        }
    }
    return ret;
}
int main()
{
    scanf("%d", &n);
    rep(i,1,n) scanf("%d", &A[i]);
    rep(i,1,n) scanf("%d", &Pi), Insert(Pi);
    rep(i,1,n) printf("%d%c", query(A[i])^A[i], " \n"[i==n]);

    return 0;
}

原文地址:https://www.cnblogs.com/sbfhy/p/8549011.html

时间: 2024-10-12 15:27:52

Codeforces Round #470 (Div 2) B 数学 C 二分+树状数组 D 字典树的相关文章

Codeforces Round #482 (Div. 2)D. Kuro and GCD and XOR and SUM+字典树

题目链接:D. Kuro and GCD and XOR and SUM 题意:两种操作:第一种给数组添加一个数,第二种输入x,k,s,要求从数组中找到一个数v,要求k能整除gcd(k,v);并且v<=s-x,然后异或v与k的异或值最大. 题解:对与k大于1的情况我们暴力枚举过去,k为1的特殊处理建一颗字典树,如果可以的满足条件的话,每次取值时往相反方向取. 1 #include<bits/stdc++.h> 2 #include <iostream> 3 #include

Codeforces Round #224 (Div. 2) B 数学推理

挺有意思的一道题目,一开始发现了循环节,做了一下,发现许多小地方要补,比较繁琐,做了几个小时的无用功吧,但是循环节肯定可以只是我写搓了,后来又推了公式,发现可以的 首先当b<x的时候,c--,a--那么对于 a,c来说他们之间的差并没有减小,所以真正起到作用的是b>=x的时候,这个时候只有c--,但是答案要求的 是多少次,在b<x的时候 是要经过一定次数的  w-(x - b)来重新使得b>=x,所以第二部分对答案有影响,但是 设方程的话 就不需要多设一个未知数,因为 第一部分肯定

Codeforces Round #262 (Div. 2) 460C. Present(二分)

题目链接:http://codeforces.com/problemset/problem/460/C C. Present time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Little beaver is a beginner programmer, so informatics is his favorite subjec

Codeforces Round #360 (Div. 2) D 数学推导 E dp

Codeforces Round #360 (Div. 2) A  == B  水,但记一下: 第 n 个长度为偶数的回文数是  n+reverse(n). C    dfs 01染色,水 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i

A. Little C Loves 3 I Codeforces Round #511 (Div. 2) 【数学】

题目: Little C loves number ?3? very much. He loves all things about it. Now he has a positive integer nn. He wants to split nn into 3 positive integers a,b,ca,b,c, such that a+b+c=na+b+c=n and none of the 3 integers is a multiple of 3. Help him to fin

Codeforces Round #549 (Div. 2) D 数学

https://codeforces.com/contest/1143/problem/D 题意 有nk个城市,第1,k+1,2k+1,...,(n-1)k+1城市有餐厅,你每次能走l距离,a为起始位置离最近餐厅的距离,b为走了一次后离最近餐厅的距离,给出n,k,a,b,求你回到起点最少和最多停留次数 题解 \(yl=xnk,有y=xnk/l,即y=lcm(xnk,l)/l\) 枚举a(两种情况),b(两种情况),维护最大,最小值 代码 #include<bits/stdc++.h> #def

C. Enlarge GCD Codeforces Round #511 (Div. 2)【数学】

题目: Mr. F has nn positive integers, a1,a2,-,an. He thinks the greatest common divisor of these integers is too small. So he wants to enlarge it by removing some of the integers. But this problem is too simple for him, so he does not want to do it by

Codeforces Round #353 (Div. 2) D. Tree Construction (二分,stl_set)

题目链接:http://codeforces.com/problemset/problem/675/D 给你一个如题的二叉树,让你求出每个节点的父节点是多少. 用set来存储每个数,遍历到a[i]的时候查找比a[i]大的数的位置,然后插入,而父亲就是刚好比a[i]小的数或刚好大的数. 然后讨论是哪一个数. 比如给你3 1 2 ,如图 1的父亲是3 ,2的父亲是1. 那我其实只要找左边或右边出现最晚的数就行了,用pair的first表示a[i],second表示出现的顺序i. 1 #include

Codeforces Round #211 (Div. 2) D题(二分,贪心)解题报告

---恢复内容开始--- 题目地址 简要题意: n个小伙子一起去买自行车,他们有每个人都带了一些钱,并且有公有的一笔梦想启动资金,可以分配给任何小伙子任何数值,当然分配权在我们的手中.现在给出m辆自行车的价格,需要你求出最多可以让多少个小伙子有属于自己的自行车(即自行车不可以两个人共有,只能一个人有),和在满足之前这个条件的情况下,通过最省私人钱的分配,最少需消耗多少私人的资金. 思路分析: 首先考虑,如何分配才是使其中x个小伙子能有自己车的最好分配方法.不难想到,将n个小伙子按个人资金从大到小