传送门

太菜了连\(D\)都做不出来没有小裙子\(QAQ\)

\(A\)

暴力把所有的数对都算出来,然后\(sort\)一下就行了

const int N=505;
int a[N],st[N*N],top,n,k;ll res;
int main(){
scanf("%d%d",&n,&k);
fp(i,1,n)scanf("%d",&a[i]);
fp(i,1,n)fp(j,i+1,n)st[++top]=a[i]+a[j];
sort(st+1,st+1+top);
fd(i,top,top-k+1)res+=st[i];
printf("%lld\n",res);
return 0;
}

\(B\)

我们从左到右一列一列考虑,如果该列上下都没有,放一个黑的就够了(具体放在上下无所谓,反正都是一个),如果这一列有,那么和上一个有黑的列进行比较,如果它们上同有或下同有就不用管了,否则必须多放一个。具体可以画个图

//minamoto
#include<bits/stdc++.h>
#define R register
#define ll long long
#define inline __inline__ __attribute__((always_inline))
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
const int N=1e5+5;
int mp[5][N];int n,res;
inline int calc(R int i){return mp[1][i]|(mp[2][i]<<1);}
int main(){
scanf("%d",&n);
fp(i,1,n)scanf("%d",&mp[1][i]);
fp(i,1,n)scanf("%d",&mp[2][i]);
int bg=n,ed=1;
fp(i,1,n)if(mp[1][i]||mp[2][i]){bg=i;break;}
fd(i,n,1)if(mp[1][i]||mp[2][i]){ed=i;break;}
if(bg==ed)return puts("0"),0;
int las=calc(bg);
fp(i,bg+1,ed)if(!mp[1][i]&&!mp[2][i])++res;
else{
if((calc(i)&las)==0)++res,mp[1][i]=mp[2][i]=1;
las=calc(i);
}
printf("%d\n",res);
return 0;
}

\(C\)

设子序列中元素个数为\(s\),那么这个子序列中每个元素会被计算\(2^{s-1}\)次,那么就是要求\(m|sum\times 2^{s-1}\)(\(sum\)表示子序列元素和)

如果没有\(2^{s-1}\),那么可以直接跑个暴力背包计算方案数。如果有\(2^{s-1}\),我们发现有贡献的\(s\)最多只有\(O(\log m)\)个,那么我们开\(O(\log m)\)个背包就好了,每加一个数就令\(m/=2\)

//minamoto
#include<bits/stdc++.h>
#define R register
#define ll long long
#define inline __inline__ __attribute__((always_inline))
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
const int N=5005,P=1e9+7;
inline void upd(R int &x,R int y){(x+=y)>=P?x-=P:0;}
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int f[21][N],g[21][N],st[21],a[N],top,n,m,res;
int main(){
scanf("%d%d",&n,&m);
fp(i,1,n)scanf("%d",&a[i]);
st[++top]=m;for(R int k=m;k&1^1;st[++top]=k>>1,k>>=1);
fp(i,1,n){
fp(k,1,top)fp(s,0,st[k]-1)g[k][s]=f[k][s];
upd(g[1][a[i]%m],1);
fp(k,1,top-1)fp(s,0,st[k]-1)upd(g[k+1][(s+a[i])%st[k+1]],f[k][s]);
fp(s,0,st[top]-1)upd(g[top][(s+a[i])%st[top]],f[top][s]);
fp(k,1,top)fp(s,0,st[k]-1)f[k][s]=g[k][s];
}
fp(k,1,top)upd(res,f[k][0]);
printf("%d\n",res);
return 0;
}

\(D\)

我错了我以后再也不看到\(lxl\)就想到分块了……

首先如果它是个单点修改可以直接线段树维护线性基,然而它是个区间修改我就不会做了……比赛结束之后看了看\(rqy\)的代码发现把原数组给差分一下,区间修改就可以变成两个单点修改了。根据线性代数芝士原来的线性基和差分之后的线性基是等价的。注意一下边界条件就行了

关于为啥边界条件这样处理是对的可以感性理解一下……

//minamoto
#include<bits/stdc++.h>
#define R register
#define inline __inline__ __attribute__((always_inline))
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
char sr[1<<21],z[20];int K=-1,Z=0;
inline void Ot(){fwrite(sr,1,K+1,stdout),K=-1;}
void print(R int x){
if(K>1<<20)Ot();if(x<0)sr[++K]='-',x=-x;
while(z[++Z]=x%10+48,x/=10);
while(sr[++K]=z[Z],--Z);sr[++K]='\n';
}
const int N=50005,L=31;
struct node;typedef node* ptr;
struct node{
ptr lc,rc;int v[L];
inline void init(R int x){
int k=0;
fp(i,0,L-1){
v[i]=0;
if(x>>i&1)k=i;
}
v[k]=x;
}
void merge(ptr s,ptr t){
if(s!=this)memcpy(v,s->v,124);
int k=0;
fp(i,0,L-1)if(k=t->v[i]){
fd(j,i,0)if(k>>j&1){
if(!v[j]){v[j]=k;break;}
k^=v[j];
}
}
}
inline int calc(R int x){
fd(i,L-1,0)if(x>>i&1^1)x^=v[i];
return x;
}
inline void upd(){merge(lc,rc);}
}pool[N<<2],*rt,*now,*pp=pool;
int A[N],c[N],n,m,l,r,op,x;
inline void upd(R int x,R int y){for(;x<=n;x+=x&-x)c[x]^=y;}
inline int ask(R int x){R int res=0;for(;x;x-=x&-x)res^=c[x];return res;}
void build(ptr &p,int l,int r){
p=pp++;
if(l==r)return p->init(A[l]),void();
int mid=(l+r)>>1;
build(p->lc,l,mid),build(p->rc,mid+1,r);
p->upd();
}
void update(ptr p,int l,int r,int x){
if(l==r)return p->init(A[x]),void();
int mid=(l+r)>>1;
x<=mid?update(p->lc,l,mid,x):update(p->rc,mid+1,r,x);
p->upd();
}
void query(ptr p,int l,int r,int ql,int qr){
if(ql<=l&&qr>=r)return now->merge(now,p),void();
int mid=(l+r)>>1;
if(ql<=mid)query(p->lc,l,mid,ql,qr);
if(qr>mid)query(p->rc,mid+1,r,ql,qr);
}
int main(){
// freopen("testdata.in","r",stdin);
n=read(),m=read(),now=pp++;
fp(i,1,n)A[i]=read();
fd(i,n,1)A[i]^=A[i-1];
fp(i,1,n){
c[i]^=A[i];
if(i+(i&-i)<=n)c[i+(i&-i)]^=c[i];
}
build(rt,1,n);
while(m--){
op=read(),l=read(),r=read(),x=read();
if(op==1){
upd(l,x),upd(++r,x);
A[l]^=x,update(rt,1,n,l);
if(r<=n)A[r]^=x,update(rt,1,n,r);
}else{
now->init(ask(l));
if(l<r)query(rt,1,n,l+1,r);
print(now->calc(x));
}
}
return Ot(),0;
}

剩下两题先咕了……

Comet OJ - Contest #3 题解的更多相关文章

  1. Comet OJ - Contest #11 题解&赛后总结

    Solution of Comet OJ - Contest #11 A.eon -Problem designed by Starria- 在模 10 意义下,答案变为最大数的最低位(即原数数位的最 ...

  2. Comet OJ - Contest #0题解

    传送门 菜爆了--总共只有一道题会做的--而且也没有短裙好难过 为啥必须得有手机才能注册账号啊喂--歧视么-- \(A\) 解方程 推一下柿子大概就是 \[x-\sqrt{n}=y+z+2\sqrt{ ...

  3. Comet OJ - Contest #2题解

    传送门 既然没参加过就没有什么小裙子不小裙子的了-- 顺便全是概率期望真是劲啊-- 因自过去而至的残响起舞 \(k\)增长非常快,大力模拟一下就行了 int main(){ scanf("% ...

  4. Comet OJ - Contest #15 题解

    传送门 \(A\) 咕咕 const int N=1005; int a[N],n,T; int main(){ for(scanf("%d",&T);T;--T){ sc ...

  5. Comet OJ - Contest #11题解

    传送门 \(A\) 咕咕咕 const int N=1e6+5; char s[N],t[N];int n,res; inline bool cmp(const int &x,const in ...

  6. Comet OJ - Contest #8题解

    传送门 \(A\) 咕咕咕 const int N=1005; char s[N][N];int len[N],n,id; inline bool cmp(R int j,R int k){ R in ...

  7. Comet OJ - Contest #14题解

    Contest14的本质:区间覆盖+Tarjan( A 把距离公式两边平方即可 注意要long long code #include <algorithm> #include <io ...

  8. Comet OJ - Contest #2 简要题解

    Comet OJ - Contest #2 简要题解 cometoj A 模拟,复杂度是对数级的. code B 易知\(p\in[l,r]\),且最终的利润关于\(p\)的表达式为\(\frac{( ...

  9. Comet OJ - Contest #2简要题解

    Comet OJ - Contest #2简要题解 前言: 我没有小裙子,我太菜了. A 因自过去而至的残响起舞 https://www.cometoj.com/contest/37/problem/ ...

随机推荐

  1. (七)python3 切片

    切片:取一个 list 或 tuple 的部分元素是非常常见的操作 >>> L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack'] #笨办法 ...

  2. spring与quartz整合实现分布式动态创建,删除,改变执行时间定时任务(mysql数据库)

    背景:因为在项目中用到了定时任务,当时想到了spring的quartz,写完发现费了很大功夫,光是整合就花了一上午,其中最大的问题就是版本问题,项目中用的是spring3.2.8的版本,查阅发现,3. ...

  3. java8新特性 日期

    1. LocalDateTime 2. Instant package com.atguigu.java8; import java.time.DayOfWeek; import java.time. ...

  4. 洛谷P1028数的计算

    https://www.luogu.org/problemnew/show/P1028 只用递归会超时,需要用递归型动规,用一个数组保存已经算过的值,避免重复计算. 求数字为n的方案数的最优子结构为: ...

  5. 教你 Shiro 整合 SpringBoot,避开各种坑

    教你 Shiro 整合 SpringBoot,避开各种坑-----https://www.cnblogs.com/HowieYuan/p/9259638.html

  6. noip模拟赛 蒜头君救人

    分析:之前的一道模拟赛题是dp+dfs,这道题是dp+bfs. 我们设f[stu][i][j]为当前状态为stu,走到(i,j)的答案,考虑怎么设计stu,每个人的状态有3种:要么在原地,要么被背着, ...

  7. MySQL的Date()函数拼接

    SELECT date_format(DATE(a.date_created),'%Y-%c-%d') As dateCreate, SUM(a.sm) As sumAmount, sum(order ...

  8. 微信小程序初探(二):阅读官方demo源码

    阅读demo有助于理解逻辑,而且demo源码中应该包含了框架开发人员想要表达的意思的精华,先从app.js着手来阅读. 附带贴下说明: https://mp.weixin.qq.com/debug/w ...

  9. 使用AtomicInteger原子类代替i++线程安全操作

    Java中自增自减操作不具原子性,在多线程环境下是线程不安全的,可以使用使用AtomicInteger原子类代替i++,i--操作完成多线程线程安全操作. 下面是等于i++多线程的自增操作代码: pu ...

  10. [bzoj4033][HAOI2015]树上染色_树形dp

    树上染色 bzoj-4033 HAOI-2015 题目大意:给定一棵n个点的树,让你在其中选出k个作为黑点,其余的是白点,收益为任意两个同色点之间距离的和.求最大收益. 注释:$1\le n\le 2 ...