1、最大值

可以用FWT水过去,李巨写了FWT结果中途爆int了炸了几十分好像。

我乱搞了一下把除了大数据有or的搞出来然后90,还是蛮划算的。我yy的做法:

1、xor 字典树上贪心, 一开始我打了线性基,被自己蠢哭了。

&和|

用sum[i]表示i中二进制位为1的位置都是1的且不是i的数是否存在。我乱搞从大到小地把一个一个去掉处理的,FWT也可以处理这个,复杂度是一样的。

2、&

  答案一定是a中的某个数,枚举a中的每个数a[i]看sum[a[i]]是否存在即可。

3、|

  枚举a中每个数,从高位到低位贪心看它能|出来的最大数。用一个类似前缀和思想的限制,具体说,到某一位如果a[i]是0,看目前的限制|这一位的1的sum存不存在,存在就把目前的限制|这一位的1。

 //Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#define Formylove return 0
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
const int N=1e5+;
typedef long long LL;
typedef double db;
using namespace std;
int T,n,c,a[N],mxx,b[],sum[],cnt[]; template<typename T>void read(T &x) {
char ch=getchar(); x=; T f=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} int rt,ch[N*][],tot;
void insert(int v) {
int x=rt;
For(i,,) {
int c=((v&(<<i))!=);
if(!ch[x][c]) {
ch[x][c]=++tot;
ch[tot][]=ch[tot][]=;
}
x=ch[x][c];
}
} int qry(int v) {
int x=rt,rs=;
For(i,,) {
if(v&(<<i)) {
if(ch[x][]) rs+=(<<i),x=ch[x][];
else x=ch[x][];
}
else {
if(ch[x][]) rs+=(<<i),x=ch[x][];
else x=ch[x][];
}
}
return rs;
} #define ANS
int main() {
#ifdef ANS
freopen("maximum.in","r",stdin);
freopen("maximum.out","w",stdout);
#endif
read(T);
while(T--) {
read(n); read(c);
For(i,,n) { read(a[i]); if(a[i]>mxx) mxx=a[i]; }
if(n<=) {
int ans=;
For(i,,n) For(j,i+,n) {
if(c==) ans=max(ans,(a[i]&a[j]));
else if(c==) ans=max(ans,(a[i]^a[j]));
else ans=max(ans,(a[i]|a[j]));
}
printf("%d\n",ans);
}
else if(mxx<=) {
int ans=;
For(i,,) cnt[i]=;
For(i,,n) cnt[a[i]]++;
For(i,,) if(cnt[i]) {
if(cnt[i]>=) {
if(c==) ans=max(ans,(i&i));
else if(c==) ans=max(ans,(i^i));
else ans=max(ans,(i|i));
}
For(j,i+,) if(cnt[j]) {
if(c==) ans=max(ans,(i&j));
else if(c==) ans=max(ans,(i^j));
else ans=max(ans,(i|j));
}
}
printf("%d\n",ans);
}
else {
if(c!=) {
memset(cnt,,sizeof(cnt));
memset(sum,,sizeof(sum));
int up=mxx;
For(i,,n) {
cnt[a[i]]++;
For(j,,) if(a[i]&(<<j))
sum[a[i]^(<<j)]=;
}
Rep(i,up,) if(sum[i]) {
For(j,,) if(i&(<<j))
sum[i^(<<j)]=;
}
}
if(c==) { //&
int ans=;
For(i,,n) if(cnt[a[i]]>=||sum[a[i]]) {
if(a[i]>ans) ans=a[i];
}
printf("%d\n",ans);
}
else if(c==) { //^
int rs=;
ch[rt][]=ch[rt][]=;
For(i,,n) insert(a[i]);
For(i,,n) rs=max(rs,qry(a[i]));
printf("%d\n",rs);
}
else { // |
int ans=;
For(i,,n) {
int pr=;
Rep(j,,) if(!(i&(<<j))) {
if(sum[pr|(<<j)]||cnt[pr|(<<j)]) pr|=(<<j);
}
ans=max(ans,(a[i]|pr));
}
printf("%d\n",ans);
}
}
}
Formylove;
}

2、独木桥

之前考过的题啊。二分套二分。

老张给的大数据有毒,大数据给错了,害我调了1个小时。。。

 //Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#define Formylove return 0
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
const int N=2e5+;
typedef long long LL;
typedef double db;
using namespace std;
int n,m,d;
int px[N],rak[N],p[N],lp[N],rp[N],mi,mx; template<typename T>void read(T &x) {
char ch=getchar(); x=; T f=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} int find(int ti,int pos) {
int rs=;
int l=,r=lp[],tp=-;
while(l<=r) {
int mid=((l+r)>>);
if(lp[mid]-ti<=pos) tp=mid,l=mid+;
else r=mid-;
}
if(tp!=-) rs+=tp;
l=,r=rp[],tp=-;
while(l<=r) {
int mid=((l+r)>>);
if(rp[mid]+ti<=pos) tp=mid,l=mid+;
else r=mid-;
}
if(tp!=-) rs+=tp;
return rs;
} #define ANS
int main() {
#ifdef ANS
freopen("bridge.in","r",stdin);
freopen("bridge.out","w",stdout);
#endif
read(n);
For(i,,n) read(p[i]),px[i]=p[i];
sort(px+,px+n+);
For(i,,n) rak[i]=lower_bound(px+,px+n+,p[i])-px;
For(i,,n) {
read(d);
if(d) rp[++rp[]]=p[i];
else lp[++lp[]]=p[i];
mi=min(mi,p[i]); mx=max(mx,p[i]);
}
sort(rp+,rp+rp[]+);
sort(lp+,lp+lp[]+);
read(m);
For(i,,m) {
int ti,k;
read(k); k++; read(ti);
k=rak[k];
int l=mi-ti,r=mx+ti,rs=-;
while(l<=r) {
int mid=(((LL)l+r)/);
if(find(ti,mid)>=k) rs=mid,r=mid-;
else l=mid+;
}
printf("%d\n",rs);
}
Formylove;
}
/*
5
8 7 8 1 4
0 1 1 0 1
5
5 11
*/

3、分组

把s从小到大排序,一个个考虑放进组中,这样可以保证新建组的时候放入的一定是组内最小数,结束一个组的时候放入的一定是组内最大数。

f[i][j][c]表示前i个数都分进了组,现在还有j个组没有结束,目前的代价是c的方案数。这样就可以过$\sum s_i < 1000$的点了。

算代价的时候是分别在最小的地方-s[i]和在最大的地方+s[i],显然代价单调不减,也就是虽然某个地方可能代价-s[i]但是后面一定会把这个代价加到非负。所以c一维最大只会到k。

虽然最大只会到k,但是最小可以小到非常小,所以这种算代价的方式不太优秀。利用差分的思想,$s_i-s_j=\sum_{k=j}^{k<i}s_{k+1}-s_k$,这样就可以使代价始终为正,把第三维压到k了。

 //Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#define Formylove return 0
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
const int p=1e9+;
typedef long long LL;
typedef double db;
using namespace std;
int n,k,s[];
LL f[][][],cf[]; template<typename T>void read(T &x) {
char ch=getchar(); x=; T f=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} #define ANS
int main() {
#ifdef ANS
freopen("group.in","r",stdin);
freopen("group.out","w",stdout);
#endif
read(n); read(k);
For(i,,n) read(s[i]);
sort(s+,s+n+);
For(i,,n) cf[i]=s[i+]-s[i];
int o=;
f[o][][]=;
For(i,,n-) {
o^=;
memset(f[o],,sizeof(f[o]));
For(j,,i) For(c,,k) if(f[o^][j][c]) {
if(c+cf[i]*j<=k) {
(f[o][j][c+cf[i]*j]+=f[o^][j][c]*(j+)%p)%=p;
if(j) (f[o][j-][c+cf[i]*j]+=(f[o^][j][c]*j%p))%=p;
(f[o][j+][c+cf[i]*j]+=f[o^][j][c])%=p;
}
}
}
LL ans=;
For(i,,k)
(ans+=f[o][][i])%=p;
printf("%lld\n",ans);
Formylove;
}

NOIp2018集训test-9-1(am)的更多相关文章

  1. NOIp2018集训test-10-24(am&pm)

    李巨连续AK三场了,我跟南瓜打赌李巨连续AK七场,南瓜赌李巨连续AK五场. DAY1 T1 qu 按题意拿stack,queue和priority_que模拟即可.特判没有元素却要取出的情况. T2 ...

  2. NOIP2018 集训(三)

    A题 Tree 问题描述 给定一颗 \(n\) 个点的树,树边带权,试求一个排列 \(P\) ,使下式的值最大 \[\sum_{i=1}^{n-1} maxflow(P_i, P_{i+1}) \] ...

  3. NOIP2018 集训(二)

    A题 神炎皇 问题描述 神炎皇乌利亚很喜欢数对,他想找到神奇的数对. 对于一个整数对 \((a,b)\) ,若满足 \(a+b\leq n\) 且 \(a+b\) 是 \(ab\) 的因子,则称 为神 ...

  4. NOIP2018 集训(一)

    A题 Simple 时间限制:1000ms | 空间限制:256MB 问题描述 对于给定正整数\(n,m\),我们称正整数\(c\)为好的,当且仅当存在非负整数\(x,y\)使得\(n×x+m×y=c ...

  5. NOIp2018集训test-10-18 (bike day4)

    这是一套简单题,这几天的考试让bike老爷感觉很绝望,说实话我也确实不知道还能怎么更简单了. 这几天的题换做llj.sxy应该都能轻松AK吧,至少随便考个250+应该不是问题吧,我越来越觉得觉得我跟他 ...

  6. NOIp2018集训test-10-17 (bike day3)

    发现自己gradully get moodier and moodier了 负面情绪爆发地越来越频繁,根本out of control,莫名其妙地就像着了魔一样 为什么用英语大概是因为今天早上早自习因 ...

  7. NOIp2018集训test-10-16 (bike day2)

    “毕姥爷:今天的题好简单啊,你们怎么考得这么烂啊,如果是noip你们就凉透了啊“ 今天的题难度应该是3.2.1递减的,但是我不知道哪根筋没搭对,平时我最多1h多就弃题了,今天硬生生写了2h20min的 ...

  8. [雅礼NOIP2018集训] day6

    打满暴力好像是一种挑战,已经连续几天考试最后一个小时自闭了,因为自以为打完了暴力,然而,结果往往差强人意 大概是考试的策略有些问题 T1: 我们设$g[x]$为在x时取小于等于m个物品的最大价值,下面 ...

  9. [雅礼NOIP2018集训 day4]

    感觉状态极差啊,今天居然爆零了 主要是以下原因: 1.又是T1看错题肝了两个小时,发现题意理解错误瞬间心态爆炸 2.T2交错了文件名 3.T3暴力子任务和正解(假的)混在一起,输出了两个答案 都想为自 ...

  10. [雅礼NOIP2018集训 day1]

    现在才来填坑,之后还要陆续补其他几天的,可能前几天真的太颓了 T1: 题目大意:给定一个长度为n的序列,m次询问每次询问给出l,r,询问区间l到r的元素在模k意义下的最大值 数据范围当然是你暴力写不过 ...

随机推荐

  1. vue-cli下的vuex的极简Demo(实现加1减1操作)

    1.vue-cli搭建好项目之后,使用npm安装vuex npm install vuex --save 2.在项目目录中构建vuex目录(这里我新建了store的文件夹,里面新建了store.js文 ...

  2. Spring Cloud Alibaba 从孵化到 "挂牌" 之旅

    背景 2014 年,Spring Boot 1.0 发布.Spring Boot 的发布绝对是 Pivotal 历史上具有里程碑意义的事件,它让我们能够非常简便地开发 Spring 应用,屏蔽了各种配 ...

  3. PHP ftp_chdir() 函数

    定义和用法 ftp_chdir() 函数改变 FTP 服务器上的当前目录为指定目录. 如果成功,该函数返回 TRUE.如果失败,则返回 FALSE 和一个警告. 语法 ftp_chdir(ftp_co ...

  4. Android中的gen文件为空或者不存在的处理方法

    Android中的gen文件时链接程序和XML中资源定义的桥梁,所以如果gen文件夹为空可能有以下的几个原因: 1.XML文件错误,这时可以检查res文件夹中的文件是否有错误 2.导入新的Androi ...

  5. js (ECMAScript) 对数据处理的 方法、属性总结

    注意:原生类型的数据本身是没有属性.方法的.但是 有的原始类型(如 string),当他 调用属性或方法时,JS引擎会先对原始类型数据进行包装(即隐式的转换为相应的对象)  https://www.c ...

  6. 微信支付完成 vue 页面不跳转问题

    遇到的问题是 vue 调用微信支付 回调成功以后,页面路由不跳转. 解决的办法是用window.location.href /** * @method 支付费用方法 * @param data:后台返 ...

  7. 【前端技术】一篇文章搞掂:JS

    待补充 //以下等价 if(val) if(val!=null&&val!=undefined&&val!="") //以下等价 if(!val) ...

  8. (转)微信,QQ这类IM app怎么做——谈谈Websocket

    转:http://www.cocoachina.com/ios/20160527/16482.html 前言 关于我和WebSocket的缘:我从大二在计算机网络课上听老师讲过之后,第一次使用就到了毕 ...

  9. Codeforces Round#498(Div.3)D. Two Strings Swaps

    题目 题意是给了两个字符串a和b,然后可以对这两个字符串有三种操作来使这两个字符串相等,一是交换a[i]和b[i],二是交换a[i]和a[n-i+1],三是交换b[i]和b[n-i+1],这三个操作都 ...

  10. 一道腾讯面试题:如何快速判断某 URL 是否在 20 亿的网址 URL 集合中?布隆过滤器

    何为布隆过滤器 还是以上面的例子为例: 判断逻辑: 多次哈希: Guava的BloomFilter 创建BloomFilter 最终还是调用: 使用: 算法特点 使用场景 假设遇到这样一个问题:一个网 ...