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 ...
随机推荐
- Educational Codeforces Round 50 (Rated for Div. 2) E. Covered Points
注释上都有解析了,就不写了吧,去重的问题就用set解决,并且呢第i个线段最多和其他线段产生i-1个交点,n^2logn. #include <cmath> #include <cst ...
- 搭建网络svn实战
工作中的问题(7) 转自:http://blog.csdn.net/xiaoting451292510/article/details/8562570 经常性我们和朋友写一些程序,大家在不同的城市确有 ...
- java 返回json数据
Student st1 = new Student(1, "dg", 18, new Date()); Student st2 = new Student(2 ...
- [转]thrift系列 - 快速入门
原文: http://blog.csdn.net/hrn1216/article/details/51274934 thrift 介绍,入门例子. thrift 是一个RPC框架,实现跨语言 ---- ...
- ElasticSearch(5.5.2)在java中的使用
ElasticSearch(5.5.2)在java中的使用 https://blog.csdn.net/didiaodeabing/article/details/79310710 pom.xml: ...
- Fp关联规则算法计算置信度及MapReduce实现思路
说明:參考Mahout FP算法相关相关源代码. 算法project能够在FP关联规则计算置信度下载:(仅仅是单机版的实现,并没有MapReduce的代码) 使用FP关联规则算法计算置信度基于以下的思 ...
- Microduino-W5500
2014-06-13, Microduino 公布了全新的以太网模块Microduino-W5500 ,模块基于WIZnet以太网芯片,拥有独特的全硬件TCP/IP协议栈. attachment_id ...
- Javascript将字符串日期格式化为yyyy-mm-dd的方法 js number 类型 没有length 属性 string类型才有
日期格式化相信对于大家来说再熟悉不过,最近工作中自己利用Javascript就写了一个,现在将实现的代码分享给大家,希望对有需要的朋友们能有所帮助,感兴趣的朋友们下面来一起看看吧. 这篇文章主要介绍的 ...
- HTML5开发实战——Sencha Touch篇(1)
学习了很多主要的Sencha Touch内容,已经了解了Sencha Touch的开发模式.接下来一段时间我们将利用Sencha Touch来进行自己的web应用构建. 先要解决的是前端的问题.从最简 ...
- iPhone开发关于UDID和UUID的一些理解【转】
原文地址:http://blog.csdn.net/xunyn/article/details/13629071 一.UDID(Unique Device Identifier) UDID是Uniqu ...