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 ...
随机推荐
- 互评Alpha版本——二次元梦之队——“I Do”
基于NABCD评论作品,及改进建议 1.根据(不限于)NABCD评论作品的选题 (1)N(Need,需求) 随着智能科技的发展和普及,编程教育的重要性已经逐渐凸显出来.美国前总统奥巴马曾说“编程应当与 ...
- 2017软工 — 每周PSP
1. PSP表格 2. PSP饼图 3. 本周进度条 4. 累计折线图
- windows环境下nginx服务器的安装与配置
转载至:http://www.cnblogs.com/hxxy2003/archive/2012/09/20/2695254.html nginx服务器是一个高性能的HTTP和反向代理服务器,它以稳定 ...
- .net学习-扩展
uwp uwpapp-斗鱼,微信等 云和移动优先 远程桌面连接设置 teamviewer V8内核 Node.js javascript 事件循环 express框架 bootstrap NoSQL ...
- Alpha 冲刺7
队名:日不落战队 安琪(队长) 今天完成的任务 完善回收站. 学习okhttp. 明天的计划 继续研究okhttp. 尝试登录的数据对接. 还剩下的任务 个人信息对接. 遇到的困难 今天白天焊接,晚上 ...
- 蜗牛慢慢爬 LeetCode 2. Add Two Numbers [Difficulty: Medium]
题目 You are given two non-empty linked lists representing two non-negative integers. The digits are s ...
- 补发9.26“天天向上”团队Scrum站立会议
组长:王森 组员:张金生 张政 栾骄阳 时间:2016.09.26 地点:612寝 组员 已完成 未完成 王森 可行性分析 找出设计亮点 张金生 寻找UI素材 设计用户操作 张政 搭建环境 基础逻辑框 ...
- maven 添加tomcat依赖
https://my.oschina.net/angel243/blog/178554
- (十二)Jmeter之Bean Shell的使用(一)
一.什么是Bean Shell BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法; BeanShell是一种松散类型的脚本语言(这点和JS类似); BeanS ...
- 【Nginx】优化配置
nginx优化 突破十万并发 一.一般来说nginx 配置文件中对优化比较有作用的为以下几项: 1. worker_processes 8; nginx 进程数,建议按照cpu 数目来指定,一般为它 ...