第一次做模拟赛,自我感觉良好(大概是这套题比较简单)

T1 名称为“数据结构”,这也太坑了点……233

要维护一个数列(初始为零),支持区间加与查询。

查询的是一个区间中有多少数满足min<=(a[i]*i%mod)<=max,其中min、max、mod是一开始给出来的,a[i]表示这个数的值,i表示这个数的编号

n<=80000,一开始修改与查询个数<=1e6,后面会跟不超过1e7个查询

我看到这道题,想到了线段树,主要觉得这样好查询一个区间内有多少满足条件的

可是,由于条件比较诡异,所以菜鸡的我只能单点修改……最后查询呢,每一次logn

这样得了50分

正解:差分!

首先看到题目后面会接一堆查询吗,那可以用前缀和维护啊!(用线段树每次都logn,前缀和只需提前处理一下然后O(1)就好了,我是何苦啊……)

前面的,就是差分了。每次区间加时a[l]+=x,a[r+1]-=x就可以了,查询时每个点这时的值就是a[1]+...+a[i]

这有些类似树状数组中的区间加诶,但前面的查询是一个点一个点查,所以不用树状数组,直接数组就行了

代码:

(特别注意:有的地方要转long long啊,幸亏样例良心,否则我要go die 了)

 #include<cstdio>
#include<iostream>
using namespace std; typedef long long ll;
const int MAXN = ;
ll a[MAXN];
int b[MAXN];
int n,opt,mod,Min,Max,Q; int main()
{
int i,y,l,r,ans;
ll sum,x;
char ch;
scanf("%d%d",&n,&opt);
scanf("%d%d%d",&mod,&Min,&Max); while(opt--){
cin>>ch;
if(ch=='A'){
scanf("%d%d%lld",&l,&r,&x);
a[l]+=x;a[r+]-=x;
}
else{
scanf("%d%d",&l,&r);
sum=;ans=;
for(i=;i<=r;i++){
sum+=a[i];
if(i>=l)
{
y=(sum*i)%mod;
if(y>=Min && y<=Max) ans++;
}
}
printf("%d\n",ans);
}
} sum=;
for(i=;i<=n;i++){
sum+=a[i];
y=sum*i%mod;
if(y>=Min && y<=Max) b[i]=b[i-]+;
else b[i]=b[i-];
}
scanf("%d",&Q);
while(Q--){
scanf("%d%d",&l,&r);
printf("%d\n",b[r]-b[l-]);
} return ;
}

T2 “答案错误”

非常有趣的一道数学题~

凭借多年积累的找规律技巧,构造出了答案 (YEAH)

具体题目及证明 略……

但是提交上去竟只有90分!!有一个点被卡常了(悲伤)

回来看看,发现是找规律没太彻底,多了两个if语句,下次要注意了……

代码:

 #include<cstdio>
#include<iostream>
using namespace std; typedef long long ll;
int n,Q;
ll k; int main()
{
int ans,r;
ll x;
scanf("%d%d",&n,&Q); while(Q--){
scanf("%lld",&k);
x=k-;
ans=;
while(x){
if(x%==) ans++;
x>>=;
}
if(ans%==) printf("X\n");
else printf("Z\n");
} return ;
}

T3 “部落冲突”

n个部落,n-1条双向边形成一棵树,相邻部落有时会打仗,有时会停战

打仗时两个部落间的道路不能通行

在某个时间,查询某两个部落是否可以互相到达

看完题,想到这就是一道树链剖分吗,兴高采烈地写了一遍。结果90分,被卡常了一个点(悲伤)

正解:树上差分!

每一次两个点间的路径拆成两个点分别到lca的路径

维护一下每个点到根节点的链中有几条路打仗

判断是就看S(u)+S(v)-2*S(lca(u,v))是否为零就好啦

怎么维护呢?

按dfs序来,对于每一条打仗的边,从进这个点的时间戳开始+1,出这个点的时间戳开始-1,维护前缀和

边边点点的要想清楚!!!

前缀和用树状数组维护,每次查询logn

代码:

 #include<cstdio>
#include<iostream>
using namespace std; const int MAXN = ;
struct node{
int v;
node *next;
}pool[*MAXN],*h[MAXN];
int cnt;
void addedge(int u,int v){
node *p=&pool[++cnt],*q=&pool[++cnt];
p->v=v;p->next=h[u];h[u]=p;
q->v=u;q->next=h[v];h[v]=q;
} int vis[MAXN],fa[MAXN],dep[MAXN],size[MAXN],son[MAXN];
int top[MAXN],rk[MAXN],w[MAXN],tot;
void dfs1(int u){
int v,sonnum=,Mson=;
size[u]=;
vis[u]=;
for(node *p=h[u];p;p=p->next){
v=p->v;
if(!vis[v]){
fa[v]=u;
dep[v]=dep[u]+;
dfs1(v);
size[u]+=size[v];
if(size[v]>sonnum) sonnum=size[v],Mson=v;
}
}
son[u]=Mson;
}
void dfs2(int u){
int v;
v=son[u];
if(v){
top[v]=top[u];
rk[v]=++tot;
dfs2(v);
}
for(node *p=h[u];p;p=p->next){
v=p->v;
if(fa[v]==u && v!=son[u]){
top[v]=v;
rk[v]=++tot;
dfs2(v);
}
}
w[u]=++tot;
}
int lca(int x,int y){
int f1=top[x],f2=top[y];
while(f1!=f2){
if(dep[f1]<dep[f2]) swap(f1,f2),swap(x,y);
x=fa[f1];f1=top[x];
}
if(dep[x]>dep[y]) swap(x,y);
return x;
} struct Bit{
int c[MAXN*];
int lowbit(int x){
return x&(-x);
}
int sum(int x){
int ret=;
while(x>){
ret+=c[x];
x-=lowbit(x);
}
return ret;
}
void add(int x,int y){
while(x<=MAXN*){
c[x]+=y;
x+=lowbit(x);
}
}
}d; int hisnum,his[MAXN]; int main()
{
int n,m,x,y,i,l,f;
char ch;
scanf("%d%d",&n,&m);
for(i=;i<n;i++) scanf("%d%d",&x,&y),addedge(x,y); dep[]=;dfs1();
top[]=;rk[]=;tot=;dfs2(); for(i=;i<=m;i++){
cin>>ch;
if(ch=='C'){
scanf("%d%d",&x,&y);
if(y==fa[x]) swap(x,y);
his[++hisnum]=y;
d.add(rk[y],);
d.add(w[y],-);
}
else if(ch=='U'){
scanf("%d",&x);
y=his[x];
d.add(rk[y],-);
d.add(w[y],);
}
else{
scanf("%d%d",&x,&y);
l=lca(x,y);
f=d.sum(rk[x])+d.sum(rk[y])-*d.sum(rk[l]);
if(f==) printf("Yes\n");
else printf("No\n");
}
} // system("pause");
return ;
}

总结:

1.不要把思路老局限在一个东西上,比如第一题

2.灵活变通,不要学死

比如,树上差分也可以完成许多树链剖分可完成的东西啊!

3.前缀和是一个好东西,要学会用它

4.差分也是个好东西,要学会用它

5.写完代码后,记得修改一下耗时多的地方,再将代码完美一下。不要像第二题一样……(好心痛)

6.学会分析复杂度

第一题后面那些查询用前缀和我竟没想到……66

7.注意开long long

2017-10-28 noip模拟赛by WISCO 信息组的更多相关文章

  1. 2017 10.25 NOIP模拟赛

    期望得分:100+40+100=240 实际得分:50+40+20=110 T1 start取了min没有用,w(゚Д゚)w    O(≧口≦)O T3 代码3个bug :数组开小了,一个细节没注意, ...

  2. 2017.10.28 QB模拟赛 —— 下午

    题目链接 T1 按x值排序 遇到第二种牌插入 遇到第一种牌 查询<=y 的最小值 删除他 splay multiset cys大佬说 multiset就是不去重的set, #include &l ...

  3. 2017.10.28 QB模拟赛 —— 上午

    题目链接 T1 1e18 内的立方数有 1e6个 直接枚举可过 二分最优 考场用set  死慢.. #include <cstdio> int t; long long p; int ma ...

  4. 10.17 NOIP模拟赛

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

  5. 10.16 NOIP模拟赛

    目录 2018.10.16 NOIP模拟赛 A 购物shop B 期望exp(DP 期望 按位计算) C 魔法迷宫maze(状压 暴力) 考试代码 C 2018.10.16 NOIP模拟赛 时间:2h ...

  6. 2018.10.16 NOIP模拟赛解题报告

    心路历程 预计得分:\(100 + 100 + 20 = 220\) 实际得分:\(100 + 100 + 30 = 230\) 辣鸡模拟赛.. T1T2都是一眼题,T3考验卡常数还只有一档暴力分. ...

  7. 2016.10.30 NOIP模拟赛 day2 PM 整理

    满分:300分 直接全部爆零,真的是很坑啊! 10.30的题目+数据:链接:http://pan.baidu.com/s/1jHXLace 密码:i784 T1: 题目中的难点就是每次折叠的点可能应经 ...

  8. 2016.10.30 NOIP模拟赛 day2 AM 整理

    题目+数据:链接:http://pan.baidu.com/s/1gfBg4h1 密码:ho7o 总共得了:130分, 1:100分  2:30分(只会这30分的暴力) 3:0(毫无思路) 虽然不高, ...

  9. 2017.5.27 NOIP模拟赛(hzwer2014-5-16 NOIP模拟赛)

    期望得分:100+100+60+30=290 实际得分:100+20+60+0=180 当务之急:提高一次正确率 Problem 1 双色球(ball.cpp/c/pas) [题目描述] 机房来了新一 ...

随机推荐

  1. dotnet 判断程序当前使用管理员运行降低权使用普通权限运行

    有一些程序是不想通过管理员权限运行的,因为在很多文件的读写,如果用了管理员权限程序写入的程序,其他普通权限的程序是无法直接访问的.本文告诉大家如何判断当前的程序是通过管理员权限运行,然后通过资源管理器 ...

  2. 【12.78%】【codeforces 677D】Vanya and Treasure

    time limit per test1.5 seconds memory limit per test256 megabytes inputstandard input outputstandard ...

  3. git 上传当前分支

    因为我现在的分支是的名很长,每次需要上次当前分支需要写很多代码,是不是有很简单方法上传当前分支. 如果要上传一个分支到仓库 origin 那么就需要使用下面的命令 git push origin 分支 ...

  4. 由Request Method:OPTIONS初窥CORS

    刚接触前端的时候,以为HTTP的Request Method只有GET与POST两种,后来才了解到,原来还有HEAD.PUT.DELETE.OPTIONS…… 目前的工作中,HEAD.PUT.DELE ...

  5. 根据经纬度查询附近几公里的门店(<5)代表5公里

    select * from 表名 where status=1 and isopen =0 and jingyingtype=1 and waimai=1 and bstatus = 1 and (a ...

  6. UE4 中的 C++ 与 蓝图交互

    1.Unreal 引擎提供了两种创建新 Gameplay 元素的方法:C++ 和 蓝图视觉脚本. 通过 C++,程序员构建基础游戏系统:设计师可以基于此系统为场景 / 游戏创建自定义的游戏玩法. 这种 ...

  7. Liquibase 使用(全)

    聊一个数据库脚本的版本工具 Liquibase,官网在这里 ,初次看到,挺神奇的,数据库脚本也可以有版本管理,同类型的工具还有 flyway . 开发过程经常会有表结构和变更,让运维来维护的话,通常会 ...

  8. lintcode入门37-算法实现

    lintcode入门级算法题37 一.题目 反转一个3位整数 反转一个只有3位数的整数. 样例          样例 1: 输入: number = 123 输出: 321         样例 2 ...

  9. Python用PIL将PNG图像合成gif时如果背景为透明时图像出现重影的解决办法

    最近在用PIL合成PNG图像为GIF时,因为需要透明背景,所以就用putpixel的方法替换背景为透明,但是在合成GIF时,图像出现了重影,在网上查找了GIF的相关资料:GIF相关资料 其中有对GIF ...

  10. 从两个角度理解为什么 JS 中没有函数重载

    函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表(参数个数.类型.顺序)的函数,这组函数被称为重载函数.重载函数通常用来声明一组功能相似的函数,这样做减少了函数名的数量,避免了名字空 ...