Day3上午解题报告
预计分数: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
一个比较方便的写法:重载运算符
Day3上午解题报告的更多相关文章
- Day1上午解题报告
预计分数:100+60+0=160 实际分数:100+30+20=150 T1立方数(cubic) 题目描述 LYK定义了一个数叫“立方数”,若一个数可以被写作是一个正整数的3次方,则这个数就是立方数 ...
- Day2上午解题报告
预计分数:100+0+60=160 实际分数:100+0+60=160 mmpT1数据错了... T1遭遇 题目描述 你是能看到第一题的 friends呢. —— hja ?座楼房,立于城中 . 第? ...
- Day3下午解题报告
预计分数:20+40+30=90 实际分数:40+90+60=190 再次人品爆发&&手感爆发&&智商爆发 谁能告诉我为什么T1数据这么水.. 谁能告诉我为什么T2数据 ...
- Day5上午解题报告
预计分数:100+40+30=170 实际假分数:0+0+0=0 CE*3 实际真分数:60+50+0=110 老师没把我的程序放的文件夹里面,于是..... T1 https://www.luogu ...
- Day4上午解题报告
预计分数:50 +0+0=50 实际分数:50+0+10=60 毒瘤出题人,T3不给暴力分 (*  ̄︿ ̄) T1 https://www.luogu.org/problem/show?pid=T155 ...
- 夏令营提高班上午上机测试 Day 4 解题报告
我要是没记错的话,今天的题难度算挺适中的. *标程来自高天宇哥哥 T1:小G的字符串 题目描述 有一天,小 L 给小 G 出了这样一道题:生成一个长度为 n 的.全由小写英文字母构成的字符串,只能使用 ...
- Codeforces Round #382 (Div. 2) 解题报告
CF一如既往在深夜举行,我也一如既往在周三上午的C++课上进行了virtual participation.这次div2的题目除了E题都水的一塌糊涂,参赛时的E题最后也没有几个参赛者AC,排名又成为了 ...
- 【LeetCode】306. Additive Number 解题报告(Python)
[LeetCode]306. Additive Number 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http: ...
- CH Round #56 - 国庆节欢乐赛解题报告
最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...
随机推荐
- ArcGIS api for javascript——加入动态地图
描述 这个示例展示了增加一个按用户缩放或平移服务器每次绘制的地图.这样的地图没有切片的cache并被调用一个动态地图服务图层.ArcGISDynamicMapServiceLayer表示ArcGIS ...
- 网页加速之Chromium 预载入 Prerendering
前一篇博文已经介绍通过prefetch预先载入网页的资源来提升网页载入速度,以下我们一起来看一下网页加速之chromium prerendering.在介绍prerendering之前,先介绍两个概念 ...
- Java 反射经常用法演示样例
<pre name="code" class="java">import java.lang.reflect.Constructor; import ...
- 是时候抛弃web.xml了?
你是否再为配置文件web.xml容易出错而烦恼?是否为web.xml文件存放位置而不知所措?是否为web.xml为什么要这样配?怎么才能更好的配置web.xml而烦恼?那么一种新的方式出现了: spr ...
- Android自定义控件简单实现ratingbar效果
先上图: 一开始让我自定义控件我是拒绝的,因为android很早以前就有一个控件ratingbar,但是设置样式的时候我发现把图片设置小一点就显示不全,一直找不到解办法!(可以设置系统的自带的小样式) ...
- SqlCommand的四大方法
SqlCommand类的方法 ---->>>1.ExecuteNonQuery(); 它的返回值类型为int型.多用于执行增加,删除,修改数据,返回受影响的行数.当select操作时 ...
- sqlserver自定义函数(标量值函数,表值函数)
用户自定义的函数有两类:表值函数.标量值函数. 表值函数:返回值是数据表的函数 调用方式 select b.* from tableA a accross apply Fun_BiaoZhiFun ...
- Coderfroces 862 C. Mahmoud and Ehab and the xor
C. Mahmoud and Ehab and the xor Mahmoud and Ehab are on the third stage of their adventures now. As ...
- Smart Pointer Guidelines
For Developers > Smart Pointer Guidelines What are smart pointers? Smart pointers are a specif ...
- 如何在VMware中创建虚拟机
今天给大家分享如何在VMware中创建虚拟机,具体的教程如下.在这里小编提前下载了Ubuntu14.04桌面系统,为后面在虚拟机中安装Ubuntu14.04桌面系统做准备. 1.从官网上或者直接百度上 ...