2018HBCPC

Link


A

题意

几何

分析

旋转一个三角形,观察即可得出


B

概率题,胆量==


C

题意

给一棵树,问这棵树的所有子图

分析

定义:num[i]:以i为根的子树数量(i选择在内),dfs递归count即可


G   模拟题

直观的是

1、并不是一直尽可能多的买卡片好

2、X<=Y 的时候并不一定不买,因为卡片一旦买了,产生的效益可以叠加

故我们可以在每次预处理出下次购买时候的情况,并且我们可以O(1)算出下一个卡片购买的时间和不购买了的通关时间

时间复杂度:购买了√n个卡片后,最多再需要√n天就可以通关,所以时间复杂度O(√n)


I. Five Day Couple

题意

给了n个数,a1到an。q组询问,每次给一个数x,区间[l,r],求区间 l 到 r中与x异或值的最大值( n<=1e5,a_i<=1e9,q<=1e5,l,r<=n,x<=1e9 )

分析

可持久化字典树,内存开小了找了半天bug、

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

int a[100005];
int rt[33*100003][2],cnt[33*100003],root[100003];
int n,q,tot;

int newnode()
{
    ++tot;
    memset(rt[tot],0,sizeof(rt[tot]));
    cnt[tot]=0;
    return tot;
}

void build(int fa,int la,ll val)
{
    for(int i=31;i>=0;i--)
    {
        int id=(val>>i)&1;
        int nxt1=rt[fa][id]=newnode();
        rt[fa][!id]=rt[la][!id];
        int nxt2=rt[la][id];
        cnt[nxt1]=cnt[nxt2]+1;
        fa=nxt1;
        la=nxt2;
    }
}

ll query(int fa,int la,ll val)
{
    ll ans=0;
    for(int i=31;i>=0;i--)
    {
        int id=(val>>i)&1;
        int k1=rt[fa][!id],k2=rt[la][!id];
        if((cnt[k1]-cnt[k2]) > 0 )
        {
            ans|=(1LL<<i);
            id=!id;
        }
        fa=rt[fa][id];
        la=rt[la][id];
    }
    return ans;
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        root[i]=newnode();
        build(root[i],root[i-1],a[i]);
    }
    scanf("%d",&q);
    int l,r;
    ll x;
    while(q--)
    {
        scanf("%lld%d%d",&x,&l,&r);
        printf("%lld\n",query(root[r],root[l-1],x));
    }
    return 0;
}

Summary

Ym:惨惨啊,Java不会,思维题不会,还会啥

posted @ 2018-05-08 13:52  Deadlined  阅读(721)  评论(2编辑  收藏  举报