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=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模拟赛相关推荐
- 2017.6.11 校内模拟赛
题面及数据及std(有本人的也有原来的) :2017.6.11 校内模拟赛 T1 自己在纸上模拟一下后就会发现 可以用栈来搞一搞事情 受了上次zsq 讲的双栈排序的启发.. 具体就是将原盘子大小cop ...
- 9.11 myl模拟赛
9.11 myl 模拟赛 100 + 100 + 0 第一题耗费了太多的时间,导致最后一题没有时间想,直接去写了暴力,而且出题人没有给暴力分.... Problem 1. superman [题目描述 ...
- 【11/11】模拟赛
官方的链接:http://www.byvoid.com/blog/byvoid-wow-stage-3/ 本博客不再给出题目. 第一题 彩色穿孔卡片 用的O(N^2)的算法.类似USACO的浮水法. ...
- 2017/11/3模拟赛
块(block) [问题描述] 拼图达人小 C 手里有 n 个 1*1 的正方形方块, 他希望把这些方 块拼在一起, 使得拼出的图形周长最小, 要求方块不能重叠. 擅长拼 图的小 C 一下就求出了这个 ...
- [2020.11.27NOIP模拟赛]中位数之中位数【二分,树状数组】
正题 题目链接:https://www.luogu.com.cn/problem/U142585?contestId=37855 题目大意 nnn个数,求所有区间中位数的中位数. 解题思路 二分一个答 ...
- [2020.11.26NOIP模拟赛]勇者的后缀【SA,RMQ,主席树,二分】
正题 题目链接:https://www.luogu.com.cn/problem/U142356?contestId=37784 题目大意 一个字符串,询问给出(x,l,r)(x,l,r)(x,l,r ...
- [2020.11.25NOIP模拟赛]出租车【dp】
正题 题面链接:https://www.luogu.com.cn/problem/U142298?contestId=37766 题目大意 nnn个人有起点和终点,按顺序上车,但下车可以任意顺序,车最 ...
- NOIP2022.11.23模拟赛
T1 IP地址 输入文件:ip.in 输出文件:ip.out 题目描述 I P IP IP 地址是由四个不含前导零的自然数 ( ≤ 255 \leq255 ≤255),和三个作为分割符的 " ...
- 11.16模拟赛总结
打的平平无奇了属于是 又没休息好,不过今天注意力还算集中 时间安排 8.30-8.50 看一遍题 感觉T1是个签到 8.50-10.00 考虑了一下T1的实现 发现set不可后再线段树动态开点和vec ...
最新文章
- CentOS 6.2 yum安装配置lnmp服务器(Nginx+PHP+MySQL)
- 设计一个成绩分类 输入成绩 输出优秀_BenQ 明基 PD2720U 27寸 Thunderbolt3.0 专业设计显示器开箱评测...
- 水平导航菜单(DIV+CSS)
- JavaFX:创建Sprite动画
- android中虚拟程序停止,为什么我的在虚拟机运行后出现应用程序停止运行
- 非关系型数据库--MongoDB
- QT创建相应文件夹在指定目录下
- 前端ajax数据提交到服务器_详解前端如何让服务器主动向浏览器推送数据
- sql两个in并列_SQL窗口函数
- 攻防世界 MISC 新手练习区 答题(1-12题解)
- 多变量频率统计——r
- 计算机原理视频罗克露优酷,5IO系统-2中断-罗克露计算机组成原理课件(绝对与网上视频教程同步)...
- macpro如何清理磁盘空间_在MacBook上,释放磁盘空间的7种方法
- 周期信号的傅里叶变换
- 创业关于抖音的技术分析与同类产品如何弯道超车的几个问题
- RemoveWGA升级了
- android手机和包支付,中国移动和包支付客户端下载-和包支付appv9.7.16 安卓版-手机腾牛网...
- 未来的计算机 展望未来作文,展望未来作文(通用10篇)
- python读取excel表格数据
- 什么是陀螺仪的dr算法_一种基于DR/GPS/MM的组合定位系统数据融合算法
热门文章
- android应用卸载后,出现的本地数据库内容未删除现象
- 中国金属切削液市场深度研究及未来前景分析报告2022-2028年
- 【入行必修】 揭开 AI人工智能工程师 三大岗位 工作内容的 神秘面纱!
- 探寻虹膜识别背后的身份密码 | 硬创公开课
- 用node.js和express.js和jade搭建轻型cms系统
- Devops(二):CentOS7(在线)安装Docker
- 打印机出现“你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问。
- Gitlab Custom_hooks集代码规则注释校验脚本(pre-receive)
- OpenStack创建,分发并初始化rings
- 【创建Vue手脚架项目】