NOIP模拟赛17
5分。。。。
T1 LOJ 计算几何瞎暴力
维护以下操作:
1、序列末尾加一个数
2、序列全体从小到大排序
3、查询区间和
4、序列全体异或一个数k
序列全体异或一个数,很明显是trie树
那么序列全体从大到小排序就是把一个个数插入trie树的过程
那么就需要一个数组,存储还没有插入trie树的数
全体异或:
这里需要两个标记:
xortag表示当前序列是异或了什么,
trie树里1个tag 表示trie树是在异或了tag之后有序
为什么需要标记?
假设当前是二进制第i位,如果i&标记的第i位为真,那么查询的时候1相当于0,0相当于1
为什么要两个标记?
因为有可能对全体执行异或操作,这样原来有序的trie树直接异或就无序了。
所以tag用来表示trie树在当前tag下是有序的序列
查询子树和时,用xortag
在判断向左还是向右走时,要用trie树里的tag
因为trie树里的顺序不变
有了标记,查询区间和时,需要维护的就是二进制的每一位1的出现次数
如果&标记的第i为为真,就用0的个数
否则用1的个数
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long LL;
#define N 200001
void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
}
int xortag,bit[];
struct TRIE
{
int len,tag,root;
int ch[N*][],sum[N*][],siz[N*];
TRIE()
{
len=;
tag=;
root=;
}
void insert(int x)
{
int rt=root,id;
for(int i=;i>=;--i)
{
id=(x&bit[i])>;
if(!ch[rt][id]) ch[rt][id]=++len;
rt=ch[rt][id];
siz[rt]++;
for(int j=;j<;++j)
if(x&bit[j]) sum[rt][j]++;
}
}
LL getsum(int x)
{
LL ans=;
for(int i=;i<;++i)
if(xortag&bit[i]) ans+=1ll*(siz[x]-sum[x][i])*bit[i];
else ans+=1ll*sum[x][i]*bit[i];
return ans;
}
LL query(int x)
{
if(!x) return ;
int rt=root,l,r;
LL ans=;
for(int i=;i>=;--i)
{
l=,r=;
if(tag&bit[i]) swap(l,r);
if(x<=siz[ch[rt][l]]) rt=ch[rt][l];
else
{
ans+=getsum(ch[rt][l]);
x-=siz[ch[rt][l]];
rt=ch[rt][r];
}
}
ans+=getsum(rt)/siz[rt]*x;
return ans;
}
int getsiz()
{
return siz[ch[root][]]+siz[ch[root][]];
}
}Trie;
struct ARRAY
{
int len;
ARRAY()
{
len=;
}
int sum[N][],a[N];
void insert(int x)
{
x^=xortag;
a[++len]=x;
for(int i=;i>=;i--)
if(x&bit[i]) sum[len][i]=sum[len-][i]+;
else sum[len][i]=sum[len-][i];
}
void transfer()
{
Trie.tag=xortag;
for(int i=;i<=len;i++) Trie.insert(a[i]);
len=;
}
LL query(int x)
{
LL ans=;
for(int i=;i<;++i)
if(xortag&bit[i]) ans+=1ll*(x-sum[x][i])*bit[i];
else ans+=1ll*sum[x][i]*bit[i];
return ans;
}
}Array;
LL query(int x)
{
int siz=Trie.getsiz();
if(x<=siz) return Trie.query(x);
else return Trie.query(siz)+Array.query(x-siz);
}
int main()
{
freopen("seko.in","r",stdin);
freopen("seko.out","w",stdout);
bit[]=;
for(int i=;i<=;i++) bit[i]=bit[i-]<<;
int n,m,x;
read(n);
for(int i=;i<=n;++i) read(x),Array.insert(x);
read(m);
int ty,u,v;
while(m--)
{
read(ty);
if(ty==)
{
read(v);
Array.insert(v);
}
else if(ty==) Array.transfer();
else if(ty==)
{
read(u);read(v);
printf("%I64d\n",query(v)-query(u-));
}
else
{
read(v);
xortag^=v;
}
}
return ;
}
T2 [ZJOI2008]骑士
基环树DP,断环为链合并
为什么做最大点权独立集不对?
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 1000001
using namespace std;
typedef long long LL;
int n,num;
int to[N<<],nxt[N<<],front[N],val[N];
int dfn[N],low[N],st[N],top,tot=,ai[N];
bool cir[N],vis[N];
LL dp[N][],bi[N][],ans2,ans;
void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
}
void add(int u,int v)
{
to[++tot]=v; nxt[tot]=front[u]; front[u]=tot;
to[++tot]=u; nxt[tot]=front[v]; front[v]=tot;
}
void init()
{
read(n);
int y;
for(int i=;i<=n;i++)
{
read(val[i]),read(y);
add(i,y);
}
}
void tarjan(int u,int pre)
{
low[u]=dfn[u]=++tot;
st[++top]=u;
vis[u]=true;
for(int i=front[u];i;i=nxt[i])
{
if(i==(pre^)) continue; if(!dfn[to[i]]) { tarjan(to[i],i); low[u]=min(low[u],low[to[i]]); }
else low[u]=min(low[u],dfn[to[i]]),vis[to[i]]=true;
}
if(low[u]==dfn[u])
{
if(st[top]==u) top--;
else
{
while(st[top]!=u)
{
cir[st[top]]=true;
ai[++num]=st[top--];
}
top--,ai[++num]=u;
cir[u]=true;
}
}
}
void dfs(int x,int fa)
{
dp[x][]=val[x];
int t;
for(int i=front[x];i;i=nxt[i])
{
t=to[i];
if(cir[t] || t==fa) continue;
dfs(t,x);
dp[x][]+=max(dp[t][],dp[t][]);
dp[x][]+=dp[t][];
}
}
void unionn()
{
int tot,t; LL tmp;
for(int i=;i<=n;i++)
{
if(vis[i]) continue;
ans=;num=;top=;
tarjan(i,);
for(int i=;i<=num;i++) dfs(ai[i],);
bi[][]=dp[ai[]][],bi[][]=;
for(int i=;i<=num;i++)
{
bi[i][]=dp[ai[i]][];
bi[i][]=dp[ai[i]][];
bi[i][]+=max(bi[i-][],bi[i-][]);
bi[i][]+=bi[i-][];
}
ans=max(bi[num][],bi[num][]);
bi[][]=,bi[][]=dp[ai[]][];
for(int i=;i<=num;i++)
{
bi[i][]=dp[ai[i]][];
bi[i][]=dp[ai[i]][];
bi[i][]+=max(bi[i-][],bi[i-][]);
bi[i][]+=bi[i-][];
}
ans=max(ans,bi[num][]);
ans2+=ans;
}
printf("%lld",ans2);
}
int main()
{
//freopen("hoyin.in","r",stdin);
// freopen("hoyin.out","w",stdout);
init();
unionn();
}
T3 [Ynoi2017]由乃的玉米田
http://www.lydsy.com/JudgeOnline/problem.php?id=4810
莫队+bitset
维护两个bitset
第i位表示是否存在值为i的数
一个正着的A,一个反着的B
1、xi-xj=d ==> xi=d+xj,所以如果 A&A(<<d)有一位为真,就存在 (右移也行)
2、xi+xj=d ==> xi=-xj+d,有负数不好处理,所以 ==> xi=N-xj+d-N=(N-xj)-(N-d)
所以若A&(B>>(N-d))有一位为真,就存在
3、xi*xj=d,根号d枚举d的约数,判断是否存在
#include<cstdio>
#include<bitset>
#include<iostream>
#include<algorithm>
#include<cmath>
#define N 100001
using namespace std;
bitset <N> A,B;
int n,m,siz;
int a[N],bl[N];
int sum[N];
bool ans[N];
struct node
{
int ty,l,r,d;
int id;
}e[N];
void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
}
bool cmp(node p,node q)
{
if(bl[p.l]!=bl[q.l]) return bl[p.l]<bl[q.l];
return p.r<q.r;
}
void update(int pos,bool w)
{
if(w)
{
A[a[pos]]=;
B[N-a[pos]]=;
sum[a[pos]]++;
}
else
{
sum[a[pos]]--;
if(!sum[a[pos]]) A[a[pos]]=,B[N-a[pos]]=;
}
}
bool solve(int i)
{
if(e[i].ty==) return (A&(A<<e[i].d)).any();
if(e[i].ty==) return (A&(B>>(N-e[i].d))).any();
int d=e[i].d;
if(!d) return sum[];
for(int j=;j*j<=d;j++)
if(!(d%j) && sum[j] && sum[d/j]) return true;
return false;
}
int main()
{
freopen("baka.in","r",stdin);
freopen("baka.out","w",stdout);
read(n); read(m);
siz=sqrt(n);
for(int i=;i<=n;i++) bl[i]=(i-)/siz+;
for(int i=;i<=n;i++) read(a[i]);
for(int i=;i<=m;i++)
{
read(e[i].ty);read(e[i].l);read(e[i].r);read(e[i].d);
e[i].id=i;
}
sort(e+,e+m+,cmp);
int L=,R=,l,r;
for(int i=;i<=m;i++)
{
l=e[i].l; r=e[i].r;
while(R<r) update(++R,);
while(R>r) update(R--,);
while(L<l) update(L++,);
while(L>l) update(--L,);
ans[e[i].id]=solve(i);
}
for(int i=;i<=m;i++) puts(ans[i] ? "seko" : "baka");
}
NOIP模拟赛17的更多相关文章
- NOIP模拟赛 17.10.10
初次见面(firstmeet)[题目背景]雾之湖边,静得可怕.露米娅出神凝望.黑白连衣裙,像极了绽放的墨黑和洁白的莲.身边的雾之湖,倒映着血色天空.酒红的双眸,映照一切.低声浅笑,双臂伸直,她悄无声息 ...
- 10.17 NOIP模拟赛
目录 2018.10.17 NOIP模拟赛 A 咒语curse B 神光light(二分 DP) C 迷宫maze(次短路) 考试代码 B 2018.10.17 NOIP模拟赛 时间:1h15min( ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- NOI.AC NOIP模拟赛 第五场 游记
NOI.AC NOIP模拟赛 第五场 游记 count 题目大意: 长度为\(n+1(n\le10^5)\)的序列\(A\),其中的每个数都是不大于\(n\)的正整数,且\(n\)以内每个正整数至少出 ...
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...
- 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...
随机推荐
- 软工1816 · BETA 版冲刺前准备
任务博客 组长博客 总的来讲Alpha阶段我们计划中的工作是如期完成的.不过由于这样那样的原因,前后端各个任务完成度不算非常高,距离完成一个真正好用.完美的软件还有所差距. 过去存在的问题 测试工作未 ...
- EXT4+Struts2 JSON的问题
ERROR : Class org.apache.struts2.json.JSONWriter can not access a member of class org.springframewor ...
- Java try catch
/* 异常处理的捕捉形式: 这是可以对异常进行针对性处理的方式. 具体格式是: try { //需要被检测异常的代码. } catch(异常类 变量)//该变量用于接收发生的异常对象 { // ...
- 写在SVM之前——凸优化与对偶问题
SVM之问题形式化 SVM之对偶问题 SVM之核函数 SVM之解决线性不可分 >>>写在SVM之前——凸优化与对偶问题 本篇是写在SVM之前的关于优化问题的一点知识,在SVM中会用到 ...
- Qt使用QNetworkAccessManager实现Ftp操作
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt使用QNetworkAccessManager实现Ftp操作 本文地址:http: ...
- 【第一周】PSP
日期 C类别 C内容 S开始时间 E结束时间 I间隔(单位:分钟) T净时间(单位:分钟) 9月2日 编程 词频统计 7:35 9:35 10 110 9月3日 读书 构建之法 8:00 9:00 5 ...
- 【BioCode】将多个蛋白质序列分成单个的txt文档
代码说明: fasta格式的蛋白质序列,一个txt里面有很多蛋白质序列,计算ss.pssm或disorder score时候都需要单条计算,需要分开. 分割前: 分割后: show you the c ...
- jQuery表单验证组件BootstrapValidator
github:https://github.com/nghuuphuoc/bootstrapvalidator 参考博客:JS组件系列——Form表单验证神器: BootstrapValidator ...
- 整合SSM框架应用
普通方式 新建spring模块时引入如下内容: 启用devtools插件(热部署插件) idea需要做如下配置 settings-build-compiler->勾选build project ...
- scrollTop()案例
设置 <div> 元素中滚动条的垂直偏移: 定义和用法 scrollTop() 方法返回或设置匹配元素的滚动条的垂直位置. scroll top offset 指的是滚动条相对于其顶部的偏 ...