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

/*
序列分为移动的序列和未移动的序列两部分
询问离散化后
对于移动的序列,抽出来树状数组统计逆序对
对于未移动的序列,想办法能直接统计答案
首先维护哪些数未被移动过,然后对于未被移动过的数求前缀和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 longusing 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=1;i<=n;i++) a[i]=0;}ll query(int pos){ll ans=0;for(int i=pos;i>0;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=0,f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}void discrete()
{for(int i=1;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+1,a+n*2+1);num=unique(a+1,a+n*2+1)-a-1;for(int i=1;i<=num;i++) sum[i]=sum[i-1]+a[i]-a[i-1]-1;for(int i=1;i<=n;i++){ask[i].L=lower_bound(a+1,a+num+1,ask[i].L)-a;ask[i].R=lower_bound(a+1,a+num+1,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<<1; bit.clear();for(int i=num;i>=1;i--){ans+=bit.query(pos[i]);ans+=abs(sum[pos[i]]-sum[i]);bit.update(pos[i],1);}cout<<ans<<endl;return 0;
}

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>#define N 200007using namespace std;
int n,m,ans,cnt;
int head[N],pos[N],vis[N];
struct edge{int u,v,nxt;
}e[N<<1];
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=0,f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}void bfs_change(int cur,int change)
{while(!q.empty()) q.pop();memset(vis,0,sizeof vis);node u;u.col=pos[1];u.x=1;vis[1]=1;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]=1;node tmp;tmp.x=v;tmp.col=pos[v];q.push(tmp);}}
}void bfs_calc()
{ans=1;while(!q.empty()) q.pop();memset(vis,0,sizeof vis);node u;u.col=pos[1];u.x=1;u.cur=pos[1];vis[1]=1;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]=1;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=1;i<=n;i++) pos[i]=read();for(int i=1;i<n;i++){x=read();y=read();add(x,y);add(y,x);}for(int i=1;i<=m;i++){x=read();y=read();bfs_change(x,y);bfs_calc();printf("%d\n",ans);}return 0;
}

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 = 0, f = 1;char c = getchar();for(; !isdigit(c); c = getchar()) if(c == '-') f = -1;for(; isdigit(c); c = getchar()) nm = nm * 10 + c - '0';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] != 0 && cor[now] != cor[fa]) ans++;for(int i = 0; i < to[now].size(); i++){int vj = to[now][i];if(vj == fa) continue;dfs(vj, now);}
}void del(int x)
{for(int i = 0; i < to[x].size(); i++){int vj = to[x][i];if(cor[vj] != cor[x]) ans--;}
}
void insert(int x)
{for(int i = 0; i < to[x].size(); i++){int vj = to[x][i];if(cor[vj] != cor[x]) ans++;}
}
int tot = 0, tot2 = 0;
int main()
{freopen("simulator.in", "r", stdin);freopen("simulator.out", "w", stdout);n = read(), q = read();for(int i = 1; i <= n; i++) cor[i] = read(), sz[cor[i]]++, to1[cor[i]].push_back(i), id[i] = i, note[i] = i;for(int i = 1; i < n; i++){int vi = read(), vj = read();to[vi].push_back(vj), to[vj].push_back(vi);}to[1].push_back(0), cor[0] = 0x3e3e3e3e;dfs(1, 0);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 = 0; i < to1[xn].size(); i++){int op = to1[xn][i];del(op);to1[yn].push_back(op);}for(int i = 0; i < to1[xn].size(); i++){int op = to1[xn][i];cor[op] = yn;}for(int i = 0; i < to1[xn].size(); i++){int op = to1[xn][i];insert(op);}to1[xn].clear();sz[yn] += sz[xn];sz[xn] = 0;id[x] = 0;}else{tot+=sz[yn], tot2 += to1[yn].size();for(int i = 0; i < to1[yn].size(); i++){int op = to1[yn][i];del(op);to1[xn].push_back(op);}for(int i = 0; i < to1[yn].size(); i++){int op = to1[yn][i];cor[op] = xn;}for(int i = 0; i < to1[yn].size(); i++){int op = to1[yn][i];insert(op);}to1[yn].clear();sz[xn] += sz[yn];sz[yn] = 0;id[y] = xn;id[x] = 0;}cout << ans << "\n";}return 0;
}

转载于:https://www.cnblogs.com/L-Memory/p/9898342.html

11.2NOIP模拟赛相关推荐

  1. 2017.6.11 校内模拟赛

    题面及数据及std(有本人的也有原来的) :2017.6.11 校内模拟赛 T1 自己在纸上模拟一下后就会发现 可以用栈来搞一搞事情 受了上次zsq 讲的双栈排序的启发.. 具体就是将原盘子大小cop ...

  2. 9.11 myl模拟赛

    9.11 myl 模拟赛 100 + 100 + 0 第一题耗费了太多的时间,导致最后一题没有时间想,直接去写了暴力,而且出题人没有给暴力分.... Problem 1. superman [题目描述 ...

  3. 【11/11】模拟赛

    官方的链接:http://www.byvoid.com/blog/byvoid-wow-stage-3/ 本博客不再给出题目. 第一题 彩色穿孔卡片 用的O(N^2)的算法.类似USACO的浮水法. ...

  4. 2017/11/3模拟赛

    块(block) [问题描述] 拼图达人小 C 手里有 n 个 1*1 的正方形方块, 他希望把这些方 块拼在一起, 使得拼出的图形周长最小, 要求方块不能重叠. 擅长拼 图的小 C 一下就求出了这个 ...

  5. [2020.11.27NOIP模拟赛]中位数之中位数【二分,树状数组】

    正题 题目链接:https://www.luogu.com.cn/problem/U142585?contestId=37855 题目大意 nnn个数,求所有区间中位数的中位数. 解题思路 二分一个答 ...

  6. [2020.11.26NOIP模拟赛]勇者的后缀【SA,RMQ,主席树,二分】

    正题 题目链接:https://www.luogu.com.cn/problem/U142356?contestId=37784 题目大意 一个字符串,询问给出(x,l,r)(x,l,r)(x,l,r ...

  7. [2020.11.25NOIP模拟赛]出租车【dp】

    正题 题面链接:https://www.luogu.com.cn/problem/U142298?contestId=37766 题目大意 nnn个人有起点和终点,按顺序上车,但下车可以任意顺序,车最 ...

  8. NOIP2022.11.23模拟赛

    T1 IP地址 输入文件:ip.in 输出文件:ip.out 题目描述 I P IP IP 地址是由四个不含前导零的自然数 ( ≤ 255 \leq255 ≤255),和三个作为分割符的 " ...

  9. 11.16模拟赛总结

    打的平平无奇了属于是 又没休息好,不过今天注意力还算集中 时间安排 8.30-8.50 看一遍题 感觉T1是个签到 8.50-10.00 考虑了一下T1的实现 发现set不可后再线段树动态开点和vec ...

最新文章

  1. CentOS 6.2 yum安装配置lnmp服务器(Nginx+PHP+MySQL)
  2. 设计一个成绩分类 输入成绩 输出优秀_BenQ 明基 PD2720U 27寸 Thunderbolt3.0 专业设计显示器开箱评测...
  3. 水平导航菜单(DIV+CSS)
  4. JavaFX:创建Sprite动画
  5. android中虚拟程序停止,为什么我的在虚拟机运行后出现应用程序停止运行
  6. 非关系型数据库--MongoDB
  7. QT创建相应文件夹在指定目录下
  8. 前端ajax数据提交到服务器_详解前端如何让服务器主动向浏览器推送数据
  9. sql两个in并列_SQL窗口函数
  10. 攻防世界 MISC 新手练习区 答题(1-12题解)
  11. 多变量频率统计——r
  12. 计算机原理视频罗克露优酷,5IO系统-2中断-罗克露计算机组成原理课件(绝对与网上视频教程同步)...
  13. macpro如何清理磁盘空间_在MacBook上,释放磁盘空间的7种方法
  14. 周期信号的傅里叶变换
  15. 创业关于抖音的技术分析与同类产品如何弯道超车的几个问题
  16. RemoveWGA升级了
  17. android手机和包支付,中国移动和包支付客户端下载-和包支付appv9.7.16 安卓版-手机腾牛网...
  18. 未来的计算机 展望未来作文,展望未来作文(通用10篇)
  19. python读取excel表格数据
  20. 什么是陀螺仪的dr算法_一种基于DR/GPS/MM的组合定位系统数据融合算法

热门文章

  1. android应用卸载后,出现的本地数据库内容未删除现象
  2. 中国金属切削液市场深度研究及未来前景分析报告2022-2028年
  3. 【入行必修】 揭开 AI人工智能工程师 三大岗位 工作内容的 神秘面纱!
  4. 探寻虹膜识别背后的身份密码 | 硬创公开课
  5. 用node.js和express.js和jade搭建轻型cms系统
  6. Devops(二):CentOS7(在线)安装Docker
  7. 打印机出现“你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问。
  8. Gitlab Custom_hooks集代码规则注释校验脚本(pre-receive)
  9. OpenStack创建,分发并初始化rings
  10. 【创建Vue手脚架项目】