省选模拟题

周子凯

题目概况

中文题目名

简易比特币

计算

路径

英文题目名

bit

calculation

Path

输入文件名

bit.in

calculation.in

path.in

输出文件名

bit.out

calculation.out

path.out

每个测试点时限

1s

2s

1s

内存限制

128M

128M

128M

测试点数目

10

10

10

每个测试点分值

10

10

10

结果比较方式

全文比较(过滤行末空格及文末回车)

题目类型

传统

1. 简易比特币

题目描述

相信大家都听说过比特币。它是一种虚拟货币,但与普通虚拟货币不同的是,它不由某个机构统一发行,而需要利用计算机找出具有特定性质的数据来“发现”货币,俗称“挖矿”。然而,由于具有这种特定性质的数据分布稀疏而无规律,因此挖矿的过程需要投入大量的计算资源来搜寻这些数据。

仿照比特币是设计思想,我们可以设计一种简易的比特币:给定一个由n个非负整数构成的序列{ai},和一个阈值K,如果某个非空子序列(一个连续的区间)中的所有数的异或和小于K,则这个子序列就对应了一个比特币,否则它毫无价值。

现在,给出这个序列和阈值,请你计算从中能获得多少个比特币。

严谨起见,简要解释一下什么是异或:

异或是一种位运算,Pascal中写作xor,C/C++中写作^。将两个数写成二进制形式,然后对每位作“相同得0、不同得1”的运算。例如,12 xor 6 = 10的运算方法如下:

12 = (1100)2

6   = (0110)2

ans= (1010)2 = 10

输入格式

第一行包含两个整数n和K,意义如题所述;

第二行包含n个非负整数ai,表示序列中的每一个数。

输出格式

一行包含一个整数,表示能从序列中获得的比特币数。

样例输入

3 2

1 3 2

样例输出

3

样例解释

1 = 1

1 xor 3 = 2

1 xor 3 xor 2 = 0

3 = 3

3 xor 2 = 1

2 = 2

一共3个区间的异或和小于2。

数据范围

对于20%的数据,n≤100;

对于40%的数据,n≤1000;

另有20%的数据,ai≤50;

对于100%的数据,1≤n≤105,0≤K≤109,0≤ai≤109

2.计算

问题描述

我曾经的竞赛教练有一句名言:“人紧张起来的时候会变得和白痴一样的。”他总爱在比赛前重复这句话。其实论算法,他并没有教给我们多少,但是回想起以前的经历发现,至少这句话他说的真是太tm对了。用现在的话讲就是:不要怂,就是干。

oi题很多时候都是这样,乍一看很难,越看越觉得不可做,于是安慰自己说,肯定又是我没学过的某算法,做不出很正常。但抱有这种心理的,出了考场往往会被身边的神犇打脸:“这题其实先oo一下再xx一下就好了,我太弱了搞了一小时才搞出来……”

现在就有一道看上去似乎很不好搞的计算题,请你不怂地算一下怎么搞。

给出一个长为N的正整数序列,有三种操作:

A l r k b:在区间[l,r]上加上一个首项为b、公差为k的等差数列。即,序列al, al+1, al+2, al+3……变成al+b, al+1+b+k, al+2+b+2k, al+3+b+3k……

B l r:求区间[l,r]内所有数的和mod 1000000007的值

C l r:求区间[l,r]内所有数的平方的和mod 1000000007的值

输入格式

第一行包含两个数n、q,表示序列长度和操作的数量;

第二行包含n个数{ai},表示原序列;

接下来q行,每行包含一个操作,格式和意义如题面所述。

输出格式

输出若干行,每个B操作和C操作输出一行,表示询问的答案。

样例输入

3 3

1 1 1

A 1 3 2 2

B 1 2

C 2 3

样例输出

8

74

数据规模

测试点1~2:n, q ≤ 1000;

测试点3~4:k=0,没有C操作;

测试点5~6:k=0;

测试点7~8:没有C操作;

对于100%的数据,n, q ≤ 100000,0 ≤ ai, k, b ≤ 109,1 ≤ l ≤ r ≤ n

3. 路径

问题描述

实在不知道怎么编题面了,就写得直白一点吧。反正没几个人写得完三题,估计都看不到这里。

给出一个仙人掌图,求图中最长路的长度。

Emmm……还是稍微具体一点吧。

仙人掌图是指一个有N个点与M条边的无向图,点从1到N标号,每条边有各自的长度,图中可能存在若干个简单环,但是,每个点最多只会属于1个简单环路。简单环是指一个经过至少两个点、且不经过重复点的环。(这里仙人掌图的定义也许和你在别处见过的不太一样,请仔细审题)

例如,图1所示的是一个仙人掌图,但图2则不是,因为3号点同属于两个简单环。

给出一个仙人掌图,你需要求出图中的最长路的长度。最长路不能经过重复的点。例如,假设图中所有边长度都为1的话,图1中的仙人掌图的一条最长路为1-2-3-4-5-6,长度为5。

输入格式

       第一行包含1个整数Q,表示数据组数;

每组数据的第一行2个整数N,M,表示仙人掌图的点数和边数;

每组数据的接下来M行,每行3个正整数x,y,z,描述一条连接点x与点y,长度为z的边。

输出格式

对于每组数据输出一行,每行包含一个整数,表示最长路径的长度。

样例输入

2

6 7

1 2 1

2 3 1

3 1 1

3 4 1

4 5 1

5 6 1

6 4 1

4 4

1 2 1

2 3 2

3 4 3

4 1 4

样例输出

5

9

数据规模

对于10%的数据,Q ≤ 5,n ≤ 10;

另有20%的数据,满足n=m+1;

另有20%的数据,满足n=m;

另有20%的数据,满足每个环上的点数≤ 20;

对于100%的数据,Q ≤ 1000, 所有测试点的n之和 ≤ 100,000,z≤ 1000。

(T3图片可能被河蟹,没有就算了hhh)

今天T1就是Trie树上异或乱搞,T2玄学线段树标记应用(区间加等差数列,区间查询元素和和元素平方和)。

T3还没讲,,,(我明明写的50分暴力分啊,,,怎么多骗了20分hhh)

先粘一下我的代码

T1:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#define ll long long
#define maxn 100005
using namespace std;
int n,k,ch[maxn*][],siz[maxn*];
int tot=,val,now,ci[],root=;
ll ans=; inline int read(){
int x=;char c=getchar();
for(;!isdigit(c);c=getchar());
for(;isdigit(c);c=getchar()) x=x*+c-'';
return x;
} inline void ins(){
int pos=root,r;
siz[]++; for(int i=;i>=;i--){
r=(ci[i]&now)?:;
if(!ch[pos][r]) ch[pos][r]=++tot;
pos=ch[pos][r],siz[pos]++;
}
} inline int query(){
int pos=root,an=,r;
for(int i=;i>=;i--) if(k&ci[i]){
r=(now&ci[i])?:;
if(ch[pos][r]) an+=siz[ch[pos][r]];
pos=ch[pos][r^];
if(!pos) break;
}else{
pos=ch[pos][(now&ci[i])?:];
if(!pos) break;
} return an;
} int main(){
freopen("bit.in","r",stdin);
freopen("bit.out","w",stdout); ci[]=;
for(int i=;i<=;i++) ci[i]=ci[i-]<<;
n=read(),k=read();
now=,ins();
for(int i=;i<=n;i++){
val=read();
now^=val;
ans+=(ll)query();
ins();
} cout<<ans<<endl;
return ;
}

T2:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#define ll long long
#define maxn 400005
#define ha 1000000007
using namespace std;
ll hd[maxn],tag[maxn];
ll sum[maxn],sum_t[maxn];
ll sum_c[maxn],n,m,a[maxn>>];
int le,ri,opt;
ll k,b,pos,ans;
char ch;
bool ww; inline void pushup(int o,int lc,int rc,ll len){
sum[o]=sum[lc]+sum[rc];
if(sum[o]>=ha) sum[o]-=ha;
sum_t[o]=sum_t[lc]+sum_t[rc];
if(sum_t[o]>=ha) sum_t[o]-=ha;
sum_c[o]=(sum_c[lc]+sum_c[rc]+sum[rc]*len)%ha;
} void build(int o,int l,int r){
if(l==r){
sum[o]=a[l],sum_t[o]=a[l]*a[l]%ha;
return;
} int mid=(l+r)>>,lc=o<<,rc=(o<<)|;
build(lc,l,mid),build(rc,mid+,r);
pushup(o,lc,rc,mid+-l);
} inline ll ci1(ll x){
if(!x) return ;
return x*(x+)/%ha;
} inline ll ci2(ll x){
if(!x) return ;
ll an=x*(x+)>>1ll;
if(!(an%)) return an/%ha*(x*+)%ha;
else return (*x+)/*(an%ha)%ha;
} inline void change(int o,ll len,ll sx,ll gc){
hd[o]=(hd[o]+sx)%ha,tag[o]=(tag[o]+gc)%ha;
sum_t[o]=(sum_t[o]+len*sx%ha*sx%ha+gc*gc%ha*ci2(len-)%ha+2ll*sx%ha*sum[o]%ha)%ha;
sum_t[o]=(sum_t[o]+2ll*sx%ha*gc%ha*ci1(len-)%ha+2ll*gc%ha*sum_c[o]%ha)%ha;
sum[o]=(sum[o]+sx*len%ha+ci1(len-)*gc)%ha;
sum_c[o]=(sum_c[o]+ci1(len-)*sx%ha+gc*ci2(len-))%ha;
} inline void pushdown(int o,int l,int r){
if(hd[o]||tag[o]){
int mid=(l+r)>>,lc=o<<,rc=(o<<)|;
change(lc,mid-l+,hd[o],tag[o]);
change(rc,r-mid,(hd[o]+tag[o]*(mid+-l))%ha,tag[o]);
hd[o]=tag[o]=;
}
} void update(int o,int l,int r){
if(l>=le&&r<=ri){
change(o,r-l+,(b+(ll)(l-le)*k)%ha,k);
return;
} pushdown(o,l,r);
int mid=(l+r)>>,lc=o<<,rc=(o<<)|;
if(le<=mid) update(lc,l,mid);
if(ri>mid) update(rc,mid+,r);
pushup(o,lc,rc,mid+-l);
} ll query1(int o,int l,int r){
if(l>=le&&r<=ri) return sum[o];
pushdown(o,l,r);
ll an=,mid=(l+r)>>,lc=o<<,rc=(o<<)|;
if(le<=mid) an+=query1(lc,l,mid);
if(ri>mid) an+=query1(rc,mid+,r);
if(an>=ha) an-=ha;
return an;
} ll query2(int o,int l,int r){
if(l>=le&&r<=ri) return sum_t[o];
pushdown(o,l,r);
ll an=,mid=(l+r)>>,lc=o<<,rc=(o<<)|;
if(le<=mid) an+=query2(lc,l,mid);
if(ri>mid) an+=query2(rc,mid+,r);
if(an>=ha) an-=ha;
return an;
} int main(){
freopen("calculation.in","r",stdin);
freopen("calculation.out","w",stdout); scanf("%lld%lld",&n,&m);
for(int i=;i<=n;i++) scanf("%lld",a+i);
build(,,n);
while(m--){
ch=getchar();
while(ch>'C'||ch<'A') ch=getchar();
if(ch=='A'){
scanf("%d%d%lld%lld",&le,&ri,&k,&b);
update(,,n);
}else if(ch=='B'){
scanf("%d%d",&le,&ri);
printf("%lld\n",query1(,,n));
}else{
scanf("%d%d",&le,&ri);
printf("%lld\n",query2(,,n));
}
}
return ;
}

T3:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#define ll long long
#define maxn 100005
using namespace std;
int n,m,T,st[maxn],tp,tot_len;
int tot,cirpot[maxn],mx1,mx2;
int to[maxn*],val[maxn*],ne[maxn*];
int hd[maxn],dis[maxn],num,ans;
bool v[maxn],is_cc[maxn],hhh; inline void init(){
num=ans=tp=tot=tot_len=;
hhh=;
mx1=mx2=;
memset(hd,,sizeof(hd));
memset(dis,,sizeof(dis));
memset(is_cc,,sizeof(is_cc));
memset(v,,sizeof(v));
} inline void add(int uu,int vv,int ww){
to[++num]=vv,ne[num]=hd[uu],hd[uu]=num,val[num]=ww;
to[++num]=uu,ne[num]=hd[vv],hd[vv]=num,val[num]=ww;
} void dfs(int x,int len){
ans=max(ans,len);
v[x]=;
for(int i=hd[x];i;i=ne[i]) if(!v[to[i]]) dfs(to[i],len+val[i]);
v[x]=;
} void tree_dp(int x,int fa){
for(int i=hd[x];i;i=ne[i]) if(to[i]!=fa&&!is_cc[to[i]]){
tree_dp(to[i],x);
ans=max(ans,dis[x]+dis[to[i]]+val[i]);
dis[x]=max(dis[x],dis[to[i]]+val[i]);
}
} void find_circle(int x,int fa){
st[++tp]=x,v[x]=;
for(int i=hd[x];i;i=ne[i]) if(to[i]!=fa&&!hhh){
if(v[to[i]]){
hhh=;
int h;
for(h=tp;h;h--) if(st[h]==to[i]) break;
for(;h<=tp;h++) is_cc[st[h]]=,cirpot[++tot]=st[h]; }
else find_circle(to[i],x);
}
tp--;
} int hh(int x){
if(x==tot+) return ;
for(int i=hd[cirpot[x]];i;i=ne[i]) if(to[i]==cirpot[x%tot+]) return val[i]+hh(x+);
return ;
} void get(int x,int dd){
tree_dp(cirpot[x],);
ans=max(ans,max(dis[cirpot[x]]+mx1+dd,dis[cirpot[x]]+mx2-dd));
mx1=max(mx1,dis[cirpot[x]]-dd);
mx2=max(mx2,tot_len+dis[cirpot[x]]+dd);
if(x==tot) return;
for(int i=hd[cirpot[x]];i;i=ne[i]) if(to[i]==cirpot[x+]) get(x+,dd+val[i]);
} int main(){
freopen("path.in","r",stdin);
freopen("path.out","w",stdout); scanf("%d",&T);
for(int l=;l<=T;l++){
init();
scanf("%d%d",&n,&m);
int uu,vv,ww;
for(int i=;i<=m;i++){
scanf("%d%d%d",&uu,&vv,&ww);
add(uu,vv,ww);
} if(n>=m){
if(n==m+) tree_dp(,);
else{
find_circle(,);
tot_len=hh();
get(,);
}
}else{
for(int i=;i<=n;i++) dfs(i,);
} printf("%d\n",ans);
} return ;
}

T3竟然是找环之后单调队列????

代码难度->INF

(神TM仙人掌,这个坑回来一定要填)

北京DAY1下午的更多相关文章

  1. PKUSC 模拟赛 day1 下午总结

    下午到了机房之后又困又饿,还要被强行摁着看英文题,简直差评 第一题是NOIP模拟赛的原题,随便模拟就好啦 本人模拟功力太渣不小心打错了个变量,居然调了40多分钟QAQ #include<cstd ...

  2. 云栖大会day1 下午

    下午参与的是创新创业专场 会议议程是 创新创业专场-2018阿里云创新中心年度盛典 13:30-14:10 阿里双创新征程 李中雨 阿里云创业孵化事业部总经理 14:10-14:40 人货场的渗透与重 ...

  3. 济南day1下午

    下午 预:60+100+30 实:30+30+30 T1水题(water) T1写了二分图匹配 听说有70分,写挫了.... 正解:贪心,按长度排序, 对于第一幅牌里面的,在第二个里面,找一个长度小于 ...

  4. Day1下午解题报告

    预计分数:0+30+30=60 实际分数:0+30+40=70 T1水题(water) 贪心,按长度排序, 对于第一幅牌里面的,在第二个里面,找一个长度小于,高度最接近的牌 进行覆盖. 考场上的我离正 ...

  5. Day1下午

    T1 暴力50分 排A和B X,不用考虑X    用数组80分, 权值线段树.平衡树100, 一个函数? T2 打表  dp logn+1,+ 搜索,dp? txt..... T3 30分暴力和尽量均 ...

  6. 近期概况&总结

    下午考完英语的学考就要放假啦,是衡中的假期啊QAQ 所以灰常的激动,一点也不想写题(我不会告诉你其实假期只有一个晚上.. 自从CTSC&APIO回来之后就一直在机房颓颓颓,跟着zcg学了很多新 ...

  7. PKUSC2016滚粗记

    Day0 坐飞机来北京,地铁上接到电话,以为是诈骗电话马上就挂了,然后看了一下是北京的电话,赶脚有点不对...打回去居然是报到处老师的电话..走了几个小时,到勺园和其他学校的神犇合住.TAT,感觉第二 ...

  8. atitit.日期,星期,时候的显示方法ISO 8601标准

    atitit.日期,星期,时候的显示方法ISO 8601标准 1. ISO 86011 2. DAte日期的显示1 2.1. Normal1 2.2. 顺序日期表示法(可以将一年内的天数直接表示)1 ...

  9. ZJOI2016二试+游记

    ...excited.... 一场打回原形爽哦. T1莫名爆到了10分,T2T3均没交,一个小时过后就没再拿任何分数,perfectly狗带了... 总之没有给自己充足的时间去敲暴力,ZJOI啊..拿 ...

随机推荐

  1. SDOI 2009 学校食堂 状压dp

    这个题的关键处1 紧跟着他的bi个人 —— 由此得出任意一个状态都可以表示为 有第一个人没吃到饭做分隔的前面所有人已吃饭,并用1<<8表示之后的(包括他)的八个人的状态2 信息仍然是上一个 ...

  2. There is an overlap in the region chain修复

    ERROR: (region day_hotstatic,860010-2355010000_20140417_12_entry_00000000321,1400060700465.fda3b0aca ...

  3. React 获取 url 参数 —— this.props.match

    在 react 组件的  componentDidMount 方法中打印一下 this.props,在浏览器控制台中查看输出如下: 其中页面的 url 信息全都包含在 match 字段中,以地址 lo ...

  4. 01-导航实例-QQ空间Demo示例程序源代码

    01-导航实例-QQ空间.zip62.4 KB // MJLoginViewController.h Map // //  MJLoginViewController.h //  01-导航实例-QQ ...

  5. bzoj 1150 贪心

    首先选取的线段一定是相邻两个端点线段,那么我们贪心的考虑这个问题,我们先在这n-1条线段中选出最短的一条,然后将这条线段的值改为左面的线段的值+右面的线段的值-自己的值,用这条线段取代原来这三条线段, ...

  6. Codeforces Round #475 Div. 2 A B C D

    A - Splits 题意 将一个正整数拆分成若干个正整数的和,从大到小排下来,与第一个数字相同的数字的个数为这个拆分的权重. 问\(n\)的所有拆分的不同权重可能个数. 思路 全拆成1,然后每次将2 ...

  7. 爆破phpmyadmin小脚本

    #!usr/bin/env python #encoding: utf-8 #by i3ekr import requests headers = {'Content-Type':'applicati ...

  8. python常用模块补充hashlib configparser logging,subprocess模块

    一.hashlib模板 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定 ...

  9. windows使用celery遇到的错误

    https://www.jianshu.com/p/e5539d96641c 按照这个教程一步步执行到最后报错了. 运行task_dispatcher.py的时候 ValueError: not en ...

  10. [ 手记 ] LNMP安装过程及优化

    环境:CentOS release 6.4 x64 1.配置防火墙: 上一篇博客已经写过:http://www.cnblogs.com/hukey/p/5300832.html 2.修改sysctl. ...