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. 1245. Tree Diameter

    解题思路:本题是一道图的题目,但是无向图,给定的输入是图的各个边,题目中给出一个关键信息(Each node has labels in the set {0, 1, ..., edges.lengt ...

  2. 最长上升子序列(LIS)问题

    最长上升子序列(LIS)问题 此处我们只讨论严格单调递增的子序列求法. 前面O(n2)的算法我们省略掉,直接进入O(nlgn)算法. 方法一:dp + 树状数组 定义dp[i]:末尾数字是i时最长上升 ...

  3. phpstorm使用说明

    1.phpstorm软件可以直接断点调试php代码.具体配置方法参考 http://blog.csdn.net/qq4551091/article/details/55258664 就可以了,不过只要 ...

  4. php开发面试题---Mysql常用命令行大全

    php开发面试题---Mysql常用命令行大全 一.总结 一句话总结: 常见关键词:create,use,drop,insert,update,select,where ,from.inner joi ...

  5. CSS:CSS 伪元素

    ylbtech-CSS:CSS 伪元素 1.返回顶部 1. CSS 伪元素 CSS伪元素是用来添加一些选择器的特殊效果. 语法 伪元素的语法: selector:pseudo-element {pro ...

  6. 简单谈谈Python中的几种常见的数据类型

    简单谈谈Python中的几种常见的数据类型 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等 ...

  7. HDU 4109 Instrction Arrangement

    题目链接:https://vjudge.net/problem/HDU-4109 题目大意 有 N 个指令,标号从 0 ~ N - 1,和 M 个指令间的先后关系,每个关系都有一个权值 w,表示后一个 ...

  8. Jackson第一个程序

    再进入学习jackson库的细节之前,让我们来看看应用程序操作功能.在这个例子中,我们创建一个Student类.将创建一个JSON字符串学生的详细信息,并将其反序列化到学生的对象,然后将其序列化到JS ...

  9. Lucene字段

    字段是最低单元或索引过程的起点.它代表其中一个键被用于识别要被索引的值的键值对关系.用于表示一个文件的内容的字段中将具有键为“内容”和值,可以包含文本或文档的数字内容的部分或全部. Lucene可以索 ...

  10. MacOS安装npm全局包的权限问题

    MacOS,安装npm全局包提示没有写入权限: npm WARN checkPermissions Missing write access to /usr/local/lib/node_module ...