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不会,思维题不会,还会啥