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的更多相关文章

  1. NOIP模拟赛 17.10.10

    初次见面(firstmeet)[题目背景]雾之湖边,静得可怕.露米娅出神凝望.黑白连衣裙,像极了绽放的墨黑和洁白的莲.身边的雾之湖,倒映着血色天空.酒红的双眸,映照一切.低声浅笑,双臂伸直,她悄无声息 ...

  2. 10.17 NOIP模拟赛

    目录 2018.10.17 NOIP模拟赛 A 咒语curse B 神光light(二分 DP) C 迷宫maze(次短路) 考试代码 B 2018.10.17 NOIP模拟赛 时间:1h15min( ...

  3. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  4. NOI.AC NOIP模拟赛 第五场 游记

    NOI.AC NOIP模拟赛 第五场 游记 count 题目大意: 长度为\(n+1(n\le10^5)\)的序列\(A\),其中的每个数都是不大于\(n\)的正整数,且\(n\)以内每个正整数至少出 ...

  5. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  6. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  7. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  8. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  9. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

随机推荐

  1. 20162328蔡文琛 Bag类

    在刚刚开始着手这个作业时,想的是使用for循环来自己写出add等方法来,但是在看过API后知道了Arraylist这个java已有的列表类,于是就只用ArrayList的方法很快的就做了出来.在进行B ...

  2. win10自带中文输入法的用户体验

    用户界面: 貌似没有什么界面,不过我感觉这就是最大的优点,没有过度渲染的界面,没有烦人的推送.弹窗,没有定期不定期的更新提示,简洁也是我使用这款输入法的最主要的原因 记住用户的选择: 这点我认为win ...

  3. mysql+linux 忘记密码

    方法一: # /etc/init.d/mysql stop # mysqld_safe --user=mysql --skip-grant-tables --skip-networking & ...

  4. 运维工程师如果将web服务http专变为https

    1:生成私钥   2:生成证书签署请求   3:在提供CA签署的web网站上,提交生成的证书签署请求   4:下载已经签署的CA证书   5:将证书的信息保留在web服务器中,且应用到提供web服务的 ...

  5. 查看sqlserver数据库的编码格式

    查询语句:SELECT  COLLATIONPROPERTY('Chinese_PRC_Stroke_CI_AI_KS_WS', 'CodePage'): 查询结果: 936 简体中文GBK 950 ...

  6. B-2阶段组员分数分配

    组名: 新蜂 组长: 武志远 组员: 宫成荣 谢孝淼 杨柳 李峤 项目名称: java俄罗斯方块 武 武 武 武 杨 宫 宫 杨 宫 谢 李 杨 李 谢 李 谢 李 谢 杨 宫 扬 谢 宫 李 武 评 ...

  7. py27使用redis

    1.安装redis pip install redis 转载请注明博客出处:http://www.cnblogs.com/cjh-notes/

  8. 第113天:Ajax跨域请求解决方法

    一.原生JS实现ajax 第一步获得XMLHttpRequest对象 第二步:设置状态监听函数 第三步:open一个连接,true是异步请求 第四部:send一个请求,可以发送一个对象和字符串,不需要 ...

  9. BZOJ 1923 外星千足虫(bitset优化线性基)

    题意:给出m次n个千足虫的足数信息,确定在第几次测试后可以确定每个千足虫的来历. 我们可以观察到每个测试结果具有异或后依然成立的性质,于是实际上我们只需要从头到尾确定有n个线性相关的向量是在哪一个测试 ...

  10. 【刷题】洛谷 P3676 小清新数据结构题

    题目背景 本题时限2s,内存限制256M 题目描述 在很久很久以前,有一棵n个点的树,每个点有一个点权. 现在有q次操作,每次操作是修改一个点的点权或指定一个点,询问以这个点为根时每棵子树点权和的平方 ...