预计分数:100+40+50=190

实际分数:100+40+50=190

T1

https://www.luogu.org/problem/show?pid=T15365

表示从来没做过博弈论的题,

不过在推了40多分钟之后发现有几个结论是肯定对的。。。。

n,m都是奇数,后手胜

否则先手胜

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int MAXN=1e6;
const int INF=0x7ffff;
inline int read()
{
char c=getchar();int flag=,x=;
while(c<''||c>'') {if(c=='-') flag=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-,c=getchar();return x*flag;
}
int main()
{
// freopen("star.in","r",stdin);
// freopen("star.out","w",stdout);
int n,m;
while(scanf("%d%d",&n,&m))
{
if(n==&&m==) break;
int nowx=n,nowy=;
if(n%==)//A不利
{
printf("Yuri\n");
}
else
{
if(m%==) printf("Yuri\n");
else printf("Chito\n");
}
}
return ;
}

T2

不会做,打40分暴力走人

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
#include<ctime>
using namespace std;
const int MAXN=1e6;
const int INF=0x7ffff;
inline int read()
{
char c=getchar();int flag=,x=;
while(c<''||c>'') {if(c=='-') flag=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-,c=getchar();return x*flag;
}
const int mod=1e9+;
int a[MAXN];
int ans[MAXN];
int anstot=;
int comp(const int &a,const int &b)
{
return a>b;
}
int main()
{
//freopen("war.in","r",stdin);
//freopen("war.out","w",stdout);
int n=read(),k=read();
if(n<=)
{
for(int i=;i<=n;i++) a[i]=read();
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
if(i!=j)
ans[++anstot]=a[i]^a[j];
sort(ans+,ans+anstot+,comp);
int out=;
for(int i=;i<=k;i++)
out=(out+ans[i])%mod;
printf("%d",out);
}
else if(k==)
{
for(int i=;i<=n;i++) a[i]=read();
int t=clock();
sort(a+,a+n+,comp);
int ans=;
for(int i=;i<=n;i++)
{
for(int j=i+;j<=n;j++)
{
ans=max(ans,(a[i]^a[j])%mod)%mod;
if(clock()-t>=)
{
printf("%d",ans);
exit();
}
}
}
printf("%d",ans);
}
else
{
int t=clock();
for(int i=;i<=n;i++) a[i]=read();
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
if(i!=j)
{
ans[++anstot]=a[i]^a[j];
if(clock()-t>=)
{
sort(ans+,ans+anstot+,comp);
int out=;
for(int i=;i<=k;i++)
out=(out+ans[i])%mod;
printf("%d",out);
}
}
sort(ans+,ans+anstot+,comp);
int out=;
for(int i=;i<=k;i++)
out=(out+ans[i])%mod;
printf("%d",out);
}
return ;
}

40暴力

正解:

20分k==1

最高位异或==1

假设最大的数只有4位

把所有数遍历一边,看一下第四位是0还是1

考虑分治,对于已经确定的高位,在能选择的区间中观察低一位的能否成为1

最长区间为n

复杂度$O(31*n)$

20分不超过1023

记录0-1023的每个数有多少个

每次暴力枚举

$cnt[a^b]+=cnt[a]*cnt[b]$

正解:

01 trie树

先算第k大是啥,再把比他大的加起来

考虑如何求k->二分

如何求比k大的数:

枚举一个i,那么问题就转化为求有多少个j使得a[i]^a[j]>v(二分的值)

用trie树,从最高位开始枚举

看tire树的右儿子(1)有多少个节点

 #define PROC "shana"
#include <cstdio>
#include <cctype>
#include <memory.h>
#include <algorithm>
#include<cctype> using namespace std; typedef long long qw; #define _l (qw)
const int BUF_SIZE = ;
char buf[BUF_SIZE], *buf_s = buf, *buf_t = buf + ; #define PTR_NEXT() \
{ \
buf_s ++; \
if (buf_s == buf_t) \
{ \
buf_s = buf; \
buf_t = buf + fread(buf, , BUF_SIZE, stdin); \
} \
} #define readInt(_n_) \
{ \
while (*buf_s != '-' && !isdigit(*buf_s)) \
PTR_NEXT(); \
bool register _nega_ = false; \
if (*buf_s == '-') \
{ \
_nega_ = true; \
PTR_NEXT(); \
} \
int register _x_ = ; \
while (isdigit(*buf_s)) \
{ \
_x_ = _x_ * + *buf_s - ''; \
PTR_NEXT(); \
} \
if (_nega_) \
_x_ = -_x_; \
(_n_) = (_x_); \
} const int maxn = ;
const int maxl = ;
const int maxnd = maxn * maxl;
const int mod = 1e9 + ;
const int inv = ; int v0, n, rt, tn, a[maxn];
int tr[maxnd][], rb[maxnd][maxl], c[maxnd];
qw k; void trieIns(int v) {
int p = rt;
for (int i = maxl - ; i >= ; -- i) {
int v0 = (v >> i) & ;
if (!tr[p][v0])
tr[p][v0] = ++ tn;
p = tr[p][v0];
++ c[p];
for (int j = maxl - ; j >= ; -- j)
if ((v >> j) & )
++ rb[p][j];
}
} int cntUpper(int v, int vu) {
int p = rt, s = ;
for (int i = maxl - ; i >= ; -- i) {
int v0 = (v >> i) & ;
if ((vu >> i) & ) {
p = tr[p][v0 ^ ];
}
else {
s += c[tr[p][v0 ^ ]];
p = tr[p][v0];
}
}
return s;
} qw check(int v) {
qw s = ;
for (int i = ; i < n; ++ i)
s += cntUpper(a[i], v);
return s >> ;
} int sumUpper(int v, int vu) {
int s = , p = rt;
for (int i = maxl - ; i >= ; -- i) {
int v0 = (v >> i) & ;
if ((vu >> i) & )
p = tr[p][v0 ^ ];
else {
for (int j = ; j < maxl; ++ j)
if ((v >> j) & )
s = (_l s + (1LL << j) * (_l c[tr[p][v0 ^ ]] - _l rb[tr[p][v0 ^ ]][j])) % mod;
else
s = (_l s + (1LL << j) * _l rb[tr[p][v0 ^ ]][j]) % mod;
p = tr[p][v0];
}
}
return s;
} int main() {
freopen("war.in", "r", stdin);
freopen("war.out", "w", stdout); readInt(n);
readInt(k);
rt = ;
tn = ;
for (int i = ; i < n; ++ i) {
readInt(a[i]);
trieIns(a[i]);
}
{
int l = , r = ;
while (l < r) {
int mid = (_l l + r + ) >> ;
if (check(mid - ) < k)
r = mid - ;
else
l = mid;
}
v0 = l;
}
if (v0) {
//printf("%d %lld\n", v0, check(v0));
int ans = ;
for (int i = ; i < n; ++ i)
ans = (_l ans + sumUpper(a[i], v0 - )) % mod;
ans = (_l ans * inv % mod + ((k - check(v0 - )) % mod + mod) * _l v0) % mod;
printf("%d\n", ans);
}
else {
int ans = ;
for (int i = ; i < n; ++ i)
ans = (_l ans + sumUpper(a[i], )) % mod;
ans = _l ans * inv % mod;
printf("%d\n", ans);
}
}

T3

https://www.luogu.org/record/lists?uid=36984&pid=T15368

给了40分的暴力分,另外20分是线段树

但是线段树莫名其妙T掉一个点。。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#define ls k<<1
#define rs k<<1|1
using namespace std;
const int MAXN=4e6;
const int INF=0x7ffff;
inline int read()
{
char c=getchar();int flag=,x=;
while(c<''||c>'') {if(c=='-') flag=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-,c=getchar();return x*flag;
}
int a[MAXN];
struct Q
{
int opt,l,r,x,f;
}qs[MAXN];
int flagxd=;
struct node
{
int l,r,w,f;
}tree[MAXN];
int buildnow=;
inline void update(int k)
{
tree[k].w=max(tree[ls].w,tree[rs].w);
}
int down(int k)
{
tree[ls].w+=tree[k].f;
tree[rs].w+=tree[k].f;
tree[ls].f+=tree[k].f;
tree[rs].f+=tree[k].f;
tree[k].f=;
}
inline void Build_Tree(int ll,int rr,int k)
{
tree[k].l=ll;tree[k].r=rr;
if(ll==rr)
{
tree[k].w=a[++buildnow];
return ;
}
int mid=tree[k].l+tree[k].r>>;
Build_Tree(ll,mid,ls);
Build_Tree(mid+,rr,rs);
update(k);
}
int ans=;
inline void Interval_Max(int ll,int rr,int k)
{
if(ll<=tree[k].l&&tree[k].r<=rr)
{
ans=max(ans,tree[k].w);
return ;
}
if(tree[k].f) down(k);
int mid=tree[k].l+tree[k].r>>;
if(ll<=mid) Interval_Max(ll,rr,ls);
if(rr>mid) Interval_Max(ll,rr,rs);
update(k);
}
inline void Interval_Add(int ll,int rr,int val,int k)
{
if(ll<=tree[k].l&&tree[k].r<=rr)
{
tree[k].w+=val;
tree[k].f+=val;
return ;
}
if(tree[k].f) down(k);
int mid=tree[k].l+tree[k].r>>;
if(ll<=mid) Interval_Add(ll,rr,val,ls);
if(rr>mid) Interval_Add(ll,rr,val,rs);
update(k);
}
int main()
{
//freopen("noname.in","r",stdin);
// freopen("noname.out","w",stdout);
int n=read(),m=read();
for(int i=;i<=n;i++) a[i]=read();
for(int i=;i<=m;i++)
{
qs[i].opt=read(),qs[i].l=read(),qs[i].r=read(),qs[i].x=read();
if(qs[i].opt==&&qs[i].x>) flagxd=;
}
if(flagxd)
{
Build_Tree(,n,);
for(int i=;i<=m;i++)
{
if(qs[i].opt==)
{
ans=;
Interval_Max(qs[i].l,qs[i].r,);
printf("%d\n",ans);
}
else
Interval_Add(qs[i].l,qs[i].r,qs[i].x,);
}
}
else
{
for(int i=;i<=m;i++)
{
int l=qs[i].l,r=qs[i].r,x=qs[i].x;
if(qs[i].opt==)
{
priority_queue<int>q;
for(int i=l;i<=r;i++) q.push(a[i]);
if(x>(r-l+)||x==)
{
printf("-1\n");
}
else
{
int now=;
while(now!=x)
q.pop(),now++;
printf("%d\n",q.top());
} }
else
{
for(int i=l;i<=r;i++)
a[i]+=x;
}
}
}
return ;
}

50分暴力

正解:

30分:暴力

另外20分:线段树

再另外20分:主席树||莫队+堆

100分:

线段树

$k<=10$

维护区间前10大的数

每一个区间的前十大是ls的前十大+rs的前10大

类似于归并排序,双指针法

修改:前十大都加val

一个比较方便的写法:重载运算符

总结

这一场考的还算不错 ,起码该拿的分都拿到了。

希望自己调整好心态,稳稳当当的走下去,直到11.12

---恢复内容结束---

T1

n,m都是奇数,后手胜

否则先手胜

T2

20分k==1

最高位异或==1

假设最大的数只有4位

把所有数遍历一边,看一下第四位是0还是1

考虑分治,对于已经确定的高位,在能选择的区间中观察低一位的能否成为1

最长区间为n

复杂度$O(31*n)$

20分不超过1023

记录0-1023的每个数有多少个

每次暴力枚举

$cnt[a^b]+=cnt[a]*cnt[b]$

正解:

01 trie树

先算第k大是啥,再把比他大的加起来

考虑如何求k->二分

如何求比k大的数:

枚举一个i,那么问题就转化为求有多少个j使得a[i]^a[j]>v(二分的值)

用trie树,从最高位开始枚举

看tire树的右儿子(1)有多少个节点

T3

30分:暴力

另外20分:线段树

再另外20分:主席树||莫队+堆

100分:

线段树

$k<=10$

维护区间前10大的数

每一个区间的前十大是ls的前十大+rs的前10大

类似于归并排序,双指针法

修改:前十大都加val

一个比较方便的写法:重载运算符

最新文章

  1. 再次推荐一款逼真的HTML5下雪效果
  2. AngularJS常用指令
  3. 接口 Post
  4. spring hibernate摘记
  5. Struts2的模板和主题theme及自定义theme的使用
  6. Java基础集锦——利用Collections.sort方法对list排序
  7. Scrum项目1.0
  8. 【原创】有关Silverlight中“DataGrid中级联动态绑定父/子ComboBox ”的示例。
  9. Deep Learning Tutorial
  10. iOS-NSDate 相差 8 小时
  11. html5的a标签使用
  12. 取PE文件的引入表和导出表
  13. 工具类_java 操作cookie
  14. iOS拨打电话(三种方法)
  15. System.getProperty()方法获取系统变量
  16. Android 面试100问- 0序0
  17. ORA-00984: 列在此处不允许 SQL parse error location
  18. 【xsy2304】哈 最短路
  19. 【Mock】【接口测试】【面试】mock-server 环境搭建—加分项!
  20. Unity Shader 入门精要学习 (冯乐乐 著)

热门文章

  1. Android Studio获取开发版SHA1值和发布版SHA1值,详细过程
  2. linux设备驱动归纳总结(三):4.ioctl的实现
  3. vue24-webpack+vue-loader
  4. Redis封装值ZSet
  5. 27.C语言宽字符操作
  6. 父子间通信四 ($dispatch 和 $broadcast用法)
  7. OpenSUSE42.3 leap 开启ssh登陆
  8. Flex 最全的换行,制表符,回车,空格......特殊符号
  9. file---探测给定文件的类型
  10. SpringBoot @PathVariable 和 @requestParam区别