Comet OJ Contest #3
A:签到。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 1000000010
#define N 510
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n,k,a[N],f[N*N],t;
signed main()
{
n=read(),k=read();
for (int i=1;i<=n;i++) a[i]=read();
for (int i=1;i<=n;i++)
for (int j=i+1;j<=n;j++)
f[++t]=a[i]+a[j];
sort(f+1,f+t+1);reverse(f+1,f+t+1);
ll ans=0;
for (int i=1;i<=k;i++) ans+=f[i];
cout<<ans;
return 0;
//NOTICE LONG LONG!!!!!
}
B:找到第一个和最后一个有1的列,状压dp一下即可,即设f[i][0/1][0/1]为第i列为0/1,0/1时的最优方案要加多少个1。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 1000000010
#define N 100010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n,a[N][2],f[N][2][2],first,last,ans;
signed main()
{
n=read();
for (int i=1;i<=n;i++) a[i][0]=read();
for (int i=1;i<=n;i++) a[i][1]=read();
for (int i=1;i<=n;i++) if (a[i][0]||a[i][1]) {first=i;break;}
for (int i=n;i>=1;i--) if (a[i][0]||a[i][1]) {last=i;break;}
memset(f,42,sizeof(f));f[first-1][1][1]=0;
for (int i=first;i<=last;i++)
{
for (int x0=0;x0<2;x0++)
for (int x1=0;x1<2;x1++)
for (int y0=0;y0<2;y0++)
for (int y1=0;y1<2;y1++)
{
int tot=0;
if (a[i][0]==0&&x0==1) tot++;
if (a[i][1]==0&&x1==1) tot++;
if (x0==1&&y0==1||x1==1&&y1==1) f[i][x0][x1]=min(f[i][x0][x1],f[i-1][y0][y1]+tot);
}
}
ans=1000000000;
for (int i=0;i<2;i++)
for (int j=0;j<2;j++)
ans=min(ans,f[last][i][j]);
cout<<ans;
return 0;
//NOTICE LONG LONG!!!!!
}
C:容易发现子序列中一个数的贡献是2l,而只需要考虑其是否是m的倍数,于是l超过logm后就没什么意义了。于是设f[i][j][k]为前i个数选了模m为j的k个数的方案数,转移显然。复杂度O(nmlogm),直接就可以暴力过去。事实上应该是可以做到O(nm)的,因为只需要考虑模m/2k的值。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 1000000010
#define N 5010
#define P 1000000007
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n,m,a[N],f[15][N],g[N],t;
inline void inc(int &x,int y){x+=y;if (x>=P) x-=P;}
inline int dec(int x,int y){x-=y;if (x<0) x+=m;return x;}
signed main()
{
n=read(),m=read();int tmp=m;while (tmp%2==0) t++,tmp>>=1;t++;
for (int i=1;i<=n;i++) a[i]=read();
f[0][0]=1;
for (int i=1;i<=n;i++)
{
for (int j=0;j<m;j++) g[j]=f[t][j];
for (int j=0;j<m;j++) inc(f[t][j],g[dec(j,a[i])]);
for (int k=t;k;k--)
{
for (int j=0;j<m;j++)
{
inc(f[k][j],f[k-1][dec(j,a[i])]);
}
}
}
int ans=0;
for (int i=0;i<m;i++)
for (int j=1;j<=t;j++)
{
int x=i;for (int _=1;_<j;_++) x=(x<<1)%m;
if (x==0) inc(ans,f[j][i]);
}
cout<<ans;
return 0;
//NOTICE LONG LONG!!!!!
}
D:差分序列,则区间修改变成单点修改,然后只要维护区间线性基即可,注意要强制令第一个数是否选,这样才能考虑完选偶数个数和奇数个数的情况。开始莫名其妙想成了前缀和,然后发现了一个选奇数个数的最大异或和的做法,即将每个数比最高位更高的一位设为1。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 1000000010
#define N 50010
#define P 1000000007
#define uint int
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n,m,L[N<<2],R[N<<2],tree_o[N];
int a[N],mx;
void modify_o(int x,int y){while (x<=n) tree_o[x]^=y,x+=x&-x;}
int query_o(int x){int s=0;while (x) s^=tree_o[x],x-=x&-x;return s;}
struct base
{
int b[32];
void ins(int v)
{
for (int i=30;~i;i--)
if (v&(1<<i))
{
if (b[i]==0) {b[i]=v;return;}
else v^=b[i];
}
}
int work(int v)
{
for (int i=30;~i;i--) v=max(v,v^b[i]);
return v;
}
void clear(){memset(b,0,sizeof(b));}
}tree[N<<2],e;
base merge(base x,base y)
{
for (int i=30;~i;i--)
if (x.b[i]) y.ins(x.b[i]);
return y;
}
void build(int k,int l,int r)
{
L[k]=l,R[k]=r;
if (l==r) {tree[k].ins(a[l]);return;}
int mid=l+r>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
tree[k]=merge(tree[k<<1],tree[k<<1|1]);
}
void modify(int k,int x,int p)
{
if (L[k]==R[k]) {tree[k].clear();a[x]^=p;modify_o(x,p);tree[k].ins(a[x]);return;}
int mid=L[k]+R[k]>>1;
if (x<=mid) modify(k<<1,x,p);
else modify(k<<1|1,x,p);
tree[k]=merge(tree[k<<1],tree[k<<1|1]);
}//给x xor 上p
base query(int k,int l,int r)
{
if (l>r) return e;
if (L[k]==l&&R[k]==r) return tree[k];
int mid=L[k]+R[k]>>1;
if (r<=mid) return query(k<<1,l,r);
else if (l>mid) return query(k<<1|1,l,r);
else return merge(query(k<<1,l,mid),query(k<<1|1,mid+1,r));
}//区间线性基
signed main()
{
n=read(),m=read();
for (int i=1;i<=n;i++) a[i]=read();
for (int i=n;i;i--) a[i]^=a[i-1],modify_o(i,a[i]);
build(1,0,n);
while (m--)
{
int op=read(),l=read(),r=read();
int v=read();
if (op==1)
{
modify(1,l,v);
if (r<n) modify(1,r+1,v);
}
else
{
int ans=max(query(1,l+1,r).work(v),query(1,l+1,r).work(v^query_o(l)));
printf("%d\n",ans);
}
}
return 0;
//NOTICE LONG LONG!!!!!
}
小裙子!
Comet OJ Contest #3的更多相关文章
- Comet OJ - Contest #2 简要题解
Comet OJ - Contest #2 简要题解 cometoj A 模拟,复杂度是对数级的. code B 易知\(p\in[l,r]\),且最终的利润关于\(p\)的表达式为\(\frac{( ...
- Comet OJ - Contest #2简要题解
Comet OJ - Contest #2简要题解 前言: 我没有小裙子,我太菜了. A 因自过去而至的残响起舞 https://www.cometoj.com/contest/37/problem/ ...
- Comet OJ - Contest #4--前缀和
原题:Comet OJ - Contest #4-B https://www.cometoj.com/contest/39/problem/B?problem_id=1577传送门 一开始就想着暴力打 ...
- Comet OJ - Contest #11 题解&赛后总结
Solution of Comet OJ - Contest #11 A.eon -Problem designed by Starria- 在模 10 意义下,答案变为最大数的最低位(即原数数位的最 ...
- Comet OJ - Contest #8
Comet OJ - Contest #8 传送门 A.杀手皇后 签到. Code #include <bits/stdc++.h> using namespace std; typede ...
- Comet OJ - Contest #13-C2
Comet OJ - Contest #13-C2 C2-佛御石之钵 -不碎的意志-」(困难版) 又是一道并查集.最近做过的并查集的题貌似蛮多的. 思路 首先考虑,每次处理矩形只考虑从0变成1的点.这 ...
- Comet OJ - Contest #13 「火鼠的皮衣 -不焦躁的内心-」
来源:Comet OJ - Contest #13 芝士相关: 复平面在信息学奥赛中的应用[雾 其实是道 sb 题??? 发现原式貌似十分可二项式定理,然后发现确实如此 我们把 \(a^i\) 替换成 ...
- Comet OJ - Contest #13 「佛御石之钵 -不碎的意志-」(hard)
来源:Comet OJ - Contest #13 一眼并查集,然后发现这题 tmd 要卡常数的说卧槽... 发现这里又要用并查集跳过访问点,又要用并查集维护联通块,于是开俩并查集分别维护就好了 一开 ...
- Comet OJ - Contest #5
Comet OJ - Contest #5 总有一天,我会拿掉给\(dyj\)的小裙子的. A 显然 \(ans = min(cnt_1/3,cnt_4/2,cnt5)\) B 我们可以感性理解一下, ...
- Comet OJ Contest #13 D
Comet OJ Contest #13 D \(\displaystyle \sum_{i=0}^{\left\lfloor\frac{n}{2}\right\rfloor} a^{i} b^{n- ...
随机推荐
- 《Glibc内存管理》笔记DAY5
目录 分箱式内存管理 Unsorted bin Fast bins 核心结构体分析 malloc_state 内容来源 分箱式内存管理 Unsorted bin Unsorted bin 可以看作 ...
- Alpha冲刺(4/4)
队名:福大帮 组长博客链接:https://www.cnblogs.com/mhq-mhq/p/11913386.html 作业博客 :https://edu.cnblogs.com/campus/f ...
- Random Projection
Random Projection在k-means的应用 1. 随机投影 (Random Projection) 首先,这是一种降维方法.之前已经介绍过相对普遍的PCA的降维方法,这里介绍另一种降 ...
- Docker,就放弃了把日志写入文件
日志配置 既然用 Docker,就放弃了把日志写入文件,直接写到标准输出. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ...
- winform软件版本检测自动升级开发流程(转)
注:按此博文试验OK 基于C/S的开发有开发效率高,对于业务逻辑复杂,且不需要外网使用具有较大优势,但是弊端也不可忽视,就是升级麻烦,不可能每写一个版本就要拿着安装包给每个人去替换,这样不仅搞得自己很 ...
- 【用户体验度量】用户费力度评分(CES)
http://www.woshipm.com/operate/2819882.html CES这个评分方式有点意思. 相关文章: http://www.woshipm.com/pd/856291.ht ...
- 【Leetcode_easy】720. Longest Word in Dictionary
problem 720. Longest Word in Dictionary 题意: solution1: BFS; class Solution { public: string longestW ...
- 【Leetcode_easy】633. Sum of Square Numbers
problem 633. Sum of Square Numbers 题意: solution1: 可以从c的平方根,注意即使c不是平方数,也会返回一个整型数.然后我们判断如果 i*i 等于c,说明c ...
- Docker 持久存储介绍(十三)
目录 一.Docker 数据存储 二.Bind mount 1.详细介绍 2.如何使用 -v or --volume 语法 --mount 语法 两者区别 3.使用场景 4.使用案例 存在目录 bin ...
- java面试考点-面试准备
面试前准备 了解应试公司相关信息及岗位信息 系统复习基础知识 对原公司负责项目进行梳理 阅读常规框架源码 学习典型架构案例 针对招聘文案准备加分项 相关技能 基础知识:进程/线程,TCP协议,HTTP ...