2018HBCPC
A
题意
几何
分析
旋转一个三角形,观察即可得出
B
概率题,胆量==
C
题意
给一棵树,问这棵树的所有子图
分析
定义:num[i]:以i为根的子树数量(i选择在内),dfs递归count即可
G 模拟题
直观的是
1、并不是一直尽可能多的买卡片好
2、X<=Y 的时候并不一定不买,因为卡片一旦买了,产生的效益可以叠加
故我们可以在每次预处理出下次购买时候的情况,并且我们可以O(1)算出下一个卡片购买的时间和不购买了的通关时间
时间复杂度:购买了√n个卡片后,最多再需要√n天就可以通关,所以时间复杂度O(√n)
题意
给了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不会,思维题不会,还会啥