11.2NOIP模拟赛



/*
根右左遍历后最长上升子序列
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm> using namespace std; typedef long long LL; inline LL read()
{
char c=getchar();LL num=,f=;
for(;!isdigit(c);c=getchar())
f=c=='-'?-:f;
for(;isdigit(c);c=getchar())
num=num*+c-'';
return num*f;
} const int N=1e5+; int n;
LL w[N];
int son[N][]; LL dfn[N],tim;
void dfs(int u)
{
dfn[++tim]=w[u];
if(son[u][]!=)
dfs(son[u][]);
if(son[u][]!=)
dfs(son[u][]);
} LL lis[N],len;
int main()
{
freopen("point.in","r",stdin);
freopen("point.out","w",stdout);
int size = << ; // 256MB
char *p = (char*)malloc(size) + size;
__asm__("movl %0, %%esp\n" :: "r"(p)); n=read();
for(int i=;i<=n;++i)
w[i]=read();
for(int i=;i<=n;++i)
son[i][]=read(),son[i][]=read();
dfs();
lis[len=]=dfn[];
for(int i=;i<=tim;++i)
{
if(dfn[i]>lis[len]) lis[++len]=dfn[i];
else lis[lower_bound(lis+,lis+len+,dfn[i])-lis]=dfn[i];
}
cout<<len;
fclose(stdin);fclose(stdout);
return ;
}


/*
序列分为移动的序列和未移动的序列两部分
询问离散化后
对于移动的序列,抽出来树状数组统计逆序对
对于未移动的序列,想办法能直接统计答案
首先维护哪些数未被移动过,然后对于未被移动过的数求前缀和sum[i]
这样就得到了1~i中未被移动过的数的个数,进而能O(1)得出每段区间未被移动的数的个数。
考虑一个移动了的元素,从i向前移动到了j,那么他对答案的贡献,就是sum[j,i]
因为向前移动后[j,i]这段区间所有数都比他小。
同理一个元素从i向后移动到了j,那么他对答案的贡献为sum[i,j]
所以未被移动的元素对答案的贡献和就是Σabs(sum[原来位置]-sum[移动后的位置])
*/
#include<bits/stdc++.h> #define N 200007
#define ll long long using namespace std;
int n,m,cnt,num;
ll ans;
ll pos[N],a[N],sum[N];
struct node{
int L,R;
}ask[N]; struct BIT_{ int n;ll a[N]; static int lowbit(int x){ return x & -x;
} void clear(){ for(int i=;i<=n;i++) a[i]=;
} ll query(int pos){ ll ans=;
for(int i=pos;i>;i-=lowbit(i)) ans+=a[i];
return ans;
} void update(int pos,int val){ for(int i=pos;i<=n;i+=lowbit(i)) a[i]+=val;
}
}bit; inline int read()
{
int x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} void discrete()
{
for(int i=;i<=n;i++)
{
ask[i].L=read();ask[i].R=read();
a[i]=ask[i].L;a[i+n]=ask[i].R;
pos[i]=i;pos[i+n]=i+n;
}
sort(a+,a+n*+);
num=unique(a+,a+n*+)-a-;
for(int i=;i<=num;i++) sum[i]=sum[i-]+a[i]-a[i-]-;
for(int i=;i<=n;i++)
{
ask[i].L=lower_bound(a+,a+num+,ask[i].L)-a;
ask[i].R=lower_bound(a+,a+num+,ask[i].R)-a;
swap(pos[ask[i].L],pos[ask[i].R]);
}
} int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
n=read();discrete();
bit.n=n<<; bit.clear();
for(int i=num;i>=;i--)
{
ans+=bit.query(pos[i]);
ans+=abs(sum[pos[i]]-sum[i]);
bit.update(pos[i],);
}
cout<<ans<<endl;
return ;
}


#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue> #define N 200007 using namespace std;
int n,m,ans,cnt;
int head[N],pos[N],vis[N];
struct edge{
int u,v,nxt;
}e[N<<];
struct node{
int col,x,cur;
};queue<node>q;
inline void add(int u,int v)
{
e[++cnt].v=v;e[cnt].nxt=head[u];head[u]=cnt;
} inline int read()
{
int x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} void bfs_change(int cur,int change)
{
while(!q.empty()) q.pop();
memset(vis,,sizeof vis);
node u;u.col=pos[];u.x=;vis[]=;
q.push(u);
while(!q.empty())
{
u=q.front();q.pop();
if(u.col==cur) pos[u.x]=change;
for(int i=head[u.x];i;i=e[i].nxt)
{
int v=e[i].v;
if(vis[v]) continue;
vis[v]=;
node tmp;tmp.x=v;tmp.col=pos[v];q.push(tmp);
}
}
} void bfs_calc()
{
ans=;
while(!q.empty()) q.pop();
memset(vis,,sizeof vis);
node u;u.col=pos[];u.x=;u.cur=pos[];
vis[]=;q.push(u);
while(!q.empty())
{
u=q.front();q.pop();
if(u.col!=u.cur) ans++;
for(int i=head[u.x];i;i=e[i].nxt)
{
int v=e[i].v;
if(vis[v]) continue;
vis[v]=;node tmp;
tmp.x=v;tmp.col=pos[v];tmp.cur=pos[u.x];q.push(tmp);
}
}
} int main()
{
freopen("simulator.in","r",stdin);
freopen("simulator.out","w",stdout);
int x,y;
n=read();m=read();
for(int i=;i<=n;i++) pos[i]=read();
for(int i=;i<n;i++)
{
x=read();y=read();
add(x,y);add(y,x);
}
for(int i=;i<=m;i++)
{
x=read();y=read();
bfs_change(x,y);
bfs_calc();
printf("%d\n",ans);
}
return ;
}
30暴力
/*
bzoj1483 放到树上
见https://www.cnblogs.com/L-Memory/p/9898249.html
同理 vector+启发式合并。
*/
#include<bits/stdc++.h> #define ll long long
#define M 200010
using namespace std;
int read()
{
int nm = , f = ;
char c = getchar();
for(; !isdigit(c); c = getchar()) if(c == '-') f = -;
for(; isdigit(c); c = getchar()) nm = nm * + c - '';
return nm * f;
} int note[M], sz[M], cor[M], id[M];
vector<int>to[M], to1[M];
int n, q, ans;
void dfs(int now, int fa)
{
if(cor[now] != && cor[now] != cor[fa]) ans++;
for(int i = ; i < to[now].size(); i++)
{
int vj = to[now][i];
if(vj == fa) continue;
dfs(vj, now);
}
} void del(int x)
{
for(int i = ; i < to[x].size(); i++)
{
int vj = to[x][i];
if(cor[vj] != cor[x]) ans--;
}
}
void insert(int x)
{
for(int i = ; i < to[x].size(); i++)
{
int vj = to[x][i];
if(cor[vj] != cor[x]) ans++;
}
}
int tot = , tot2 = ;
int main()
{
freopen("simulator.in", "r", stdin);
freopen("simulator.out", "w", stdout);
n = read(), q = read();
for(int i = ; i <= n; i++) cor[i] = read(), sz[cor[i]]++, to1[cor[i]].push_back(i), id[i] = i, note[i] = i;
for(int i = ; i < n; i++)
{
int vi = read(), vj = read();
to[vi].push_back(vj), to[vj].push_back(vi);
}
to[].push_back(), cor[] = 0x3e3e3e3e;
dfs(, );
while(q--)
{
int x = read(), y = read();
int xn = id[x], yn = id[y];
if(sz[xn] < sz[yn])
{
tot += sz[xn], tot2 += to1[xn].size();
for(int i = ; i < to1[xn].size(); i++)
{
int op = to1[xn][i];
del(op);
to1[yn].push_back(op);
}
for(int i = ; i < to1[xn].size(); i++)
{
int op = to1[xn][i];
cor[op] = yn;
}
for(int i = ; i < to1[xn].size(); i++)
{
int op = to1[xn][i];
insert(op);
}
to1[xn].clear();
sz[yn] += sz[xn];
sz[xn] = ;
id[x] = ;
}
else
{
tot+=sz[yn], tot2 += to1[yn].size();
for(int i = ; i < to1[yn].size(); i++)
{
int op = to1[yn][i];
del(op);
to1[xn].push_back(op);
}
for(int i = ; i < to1[yn].size(); i++)
{
int op = to1[yn][i];
cor[op] = xn;
}
for(int i = ; i < to1[yn].size(); i++)
{
int op = to1[yn][i];
insert(op);
}
to1[yn].clear();
sz[xn] += sz[yn];
sz[yn] = ;
id[y] = xn;
id[x] = ;
}
cout << ans << "\n";
}
return ;
}
11.2NOIP模拟赛的更多相关文章
- 9.11 myl模拟赛
9.11 myl 模拟赛 100 + 100 + 0 第一题耗费了太多的时间,导致最后一题没有时间想,直接去写了暴力,而且出题人没有给暴力分.... Problem 1. superman [题目描述 ...
- 【11.2noip冲刺赛】 循环整数 (分段打表)
[问题描述]moreD在学习完循环小数之后发现循环是个很美好的性质.自己只需要记住短短的循环节以及循环次数(次数大于1,且是整数)就可以记住整个数字了.因为背诵数字变得方便了,moreD决定背诵[L, ...
- 2017.6.11 NOIP模拟赛
题目链接: http://files.cnblogs.com/files/TheRoadToTheGold/2017-6.11NOIP%E6%A8%A1%E6%8B%9F%E8%B5%9B.zip 期 ...
- 11.17 模拟赛&&day-2
/* 后天就要复赛了啊啊啊啊啊. 可能是因为我是一个比较念旧的人吧. 讲真 还真是有点不舍. 转眼间一年的时间就过去了. 2015.12-2016.11. OI的一年. NOIP gryz RP++. ...
- 2014.11.12模拟赛【美妙的数字】| vijos1904学姐的幸运数字
美妙的数字(number.c/.cpp/.pas) 题目描述 黄巨大认为非负整数是美妙的,并且它的数值越小就越美妙.当然0是最美妙的啦. 现在他得到一串非负整数,对于每个数都可以选择先对它做二进制非运 ...
- 2014.11.12模拟赛【最小公倍数】| vijos1047最小公倍数
最小公倍数(lcm.c/.cpp/.pas) 题目描述 给定两个正整数,求他们的最小公倍数. 样例输入 28 12 样例输出 84 数据范围 对于40%数据:1<=a,b<=10^9 对于 ...
- 11.7NOIP模拟赛解题报告
心路历程 预计得分:\(50 + 100 + 100\) 实际得分:\(50 + 100 +100\) T2 T3两道数据结构题美滋滋,然而写完就过去\(3h\)美滋滋 T1数学题学弟们都会做Orzz ...
- 11.6NOIP模拟赛解题报告
心路历程 预计得分:\(100 + 100 + 100 = 300\) 实际得分:\(100 +100 +100 = 300\) 学OI两年终于AK了一次qwq(虽然题目炒鸡水..) 纪念一下这令人激 ...
- 11.5NOIP模拟赛解题报告
心路历程 预计得分:\(100 + 40 + 30 = 170\) 实际得分:\(100 +100 + 50 = 250\) 辣鸡数据毁我青春 T1一眼不会做感觉要凉 T2好像一波折半搜索就做完了 T ...
随机推荐
- 如何判断一个app是原生app还是 webapp,或者是混合app
1.(快速)滚动起来是否比较卡2.图片加载失败的图标 断网检查不是绝对的,web app并不一定是在远程服务器上的, 也能pack在程序里,load本地的资源也能算是web app. web ...
- pycharm查看代码注释的方法,代码编写日志及作者信息等
竟然在边栏有个右键的快捷键.annotate可以查看代码书写日期及作者 鼠标悬停可以看到更加详细的时间等信息 原理应该是利用git blame
- 点滴记录——Ubuntu 14.04中Solr与Tomcat整合安装
转载请说明出处:http://blog.csdn.net/cywosp/article/details/38965981 1. 安装jdk,tomcat sudo apt-get instal ...
- 使用7zip压解各种文件的经常使用命令
7zip简单介绍 格式支持 压缩解压缩 仅支持解压缩 安装 Debian Ubuntu ArchLinux 使用 打包 解压 列出文件的信息列表 检查包的完整性 更新压缩包 删除包里的文件 7zip简 ...
- IPython与Jupyter notebook 安装与配置,插件扩展,主题,PDF输出
基于 python2.7.13 32-bit版本安装 1.安装pyreadline https://pypi.python.org/pypi/pyreadline 下载对应的32位版本 安装Micro ...
- Spark调研笔记第3篇 - Spark集群相应用的调度策略简单介绍
Spark集群的调度分应用间调度和应用内调度两种情况,下文分别进行说明. 1. 应用间调度 1) 调度策略1: 资源静态分区 资源静态分区是指整个集群的资源被预先划分为多个partitions,资源分 ...
- 【日常学习】codevs1287 矩阵乘法题解
转载请注明出处 [ametake版权全部]http://blog.csdn.net/ametake欢迎来看. 先上题目 题目描写叙述 Description 小明近期在为线性代数而头疼,线性代数确实非 ...
- html2canvas 导出包含滚动条的内容
import html2canvas from 'html2canvas'; exportPDF() { // 导出为 pdf let dom = document.querySelector('yo ...
- Python安装Mysql驱动出错解决(最新出炉)
Python中最连接Mysql常用的驱动是 mysql-python :mysql的C语言的驱动 mysql-connector:msql官方的驱动 pymysql:python语言的驱动 我这里安装 ...
- 设置清除html5页面缓存
设置清除html5页面缓存 html5端设置 meta 标签: <meta http-equiv="Pragma" content="no-cache" ...