期望:100 + 50 + 30 = 180

实际:0 + 50 + 30 =80

期望:100   实际:0

数值有负数,边界应该设为-0x7f       此处 gg

/*
期望的分:50+
*/
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 100010
using namespace std;
int n,tot,ans;
int f[MAXN];
int num[MAXN],w[MAXN],a[MAXN];
int lchild[MAXN],rchild[MAXN];
int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
void pre(int now){
if(now==) return ;
num[++tot]=now;
if(rchild[now]) pre(rchild[now]);
if(lchild[now]) pre(lchild[now]);
}
int main(){
//freopen("lpp.in","r",stdin);
freopen("point.in","r",stdin);
freopen("point.out","w",stdout);
n=read();
for(int i=;i<=n;i++) w[i]=read();
for(int i=;i<=n;i++){
lchild[i]=read();
rchild[i]=read();
}
pre();
for(int i=;i<=n;i++) a[i]=w[num[i]];
memset(f,-0x7f,sizeof(f));
for(int i=;i<=n;i++){
if(a[i]>f[ans]) f[++ans]=a[i];
else{
int x=lower_bound(f+,f++ans,a[i])-f;
f[x]=a[i];
}
}
printf("%d\n",ans);
}
/*
10
-77 -24 21 6 -4 -69 -1 -19 76 -1
5 2
7 8
0 0
6 9
10 4
0 3
0 0
0 0
0 0
0 0
*/

100

/*
期望:50+;
*/
#include<queue>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n;
long long ans;
int a[],b[];
int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
void work(int l,int r){
if(l==r) return;
int mid=(l+r)/;
work(l,mid);
work(mid+,r);
int i=l,j=mid+;
int nb=;
while(i<=mid||j<=r){
if(i>mid) b[++nb]=a[j++];
else if(j>r) b[++nb]=a[i++];
else{
if(a[i]<a[j]) b[++nb]=a[i++];
else{
b[++nb]=a[j++];
ans+=mid-i+;
}
}
}
for(i=l;i<=r;++i) a[i]=b[i-l+];
}
int main(){
//freopen("lpp.in","r",stdin);
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
n=read();
if(n==){
int x=read();int y=read();
if(x>y) swap(x,y);
printf("%d\n",(y-x)*-);
}
else if(n==){
int x1=read();int y1=read();
int x2=read();int y2=read();
if(x1>y1) swap(x1,y1);
if(x2>y2) swap(x2,y2);
if(x1==x2&&y1==y2){ printf("0\n");return ; }
if(x1<x2&&y1>y2||x2<x1&&y2>y1){ printf("%d\n",(y1-x1)*-+(y2-x2)*-);return ;}
if(x2>y1||x1>y2){ printf("%d\n",(y1-x1)*-+(y2-x2)*-);return ;}
if(y1==x2||y2==x1){ printf("%d\n",(y1-x1)*-+(y2-x2)*--);return ;}
if(x2>x1&&x2<y1){ printf("%d\n",(y1-x1)*-+(y2-x2)*---(y1-x2));return ;}
if(x1>x2&&x1<y2){ printf("%d\n",(y1-x1)*-+(y2-x2)*---(y2-x1));return ;}
}
else{
for(int i=;i<=;i++) a[i]=i;
for(int i=;i<=n;i++){
int x=read();int y=read();
swap(a[x],a[y]);
}
work(,);
printf("%d\n",ans);
}
}

50分暴力

/*
分成三部分讨论
第一部分:讨论修改位置的数对答案的贡献
第二部分:讨论修改部分的区间对答案的贡献。
第三部分:讨论余下未修改的对答案的贡献。
可以发现,第一部分用树状数组暴力求逆序对维护。第二部分前缀和差分维护,第三部分的贡献为0.
*/
#include<queue>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m;
long long ans;
int x[],y[],pos[];
int date[],T[],sum[];
int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int lowbit(int x){
return x&(-x);
}
void add(int x){
for(int i=x;i<=n*;i+=lowbit(i)) T[i]++;
}
long long query(int x){
long long bns=;
for(int i=x;i;i-=lowbit(i)) bns+=T[i];
return bns;
}
int main(){
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
n=read();
for(int i=;i<=n;i++){
x[i]=read();
y[i]=read();
date[i]=x[i];date[i+n]=y[i];
pos[i]=i;pos[i+n]=i+n;
}
sort(date+,date++*n);
int num=unique(date+,date++*n)-date-;
for(int i=;i<=num;i++) sum[i]=sum[i-]+date[i]-date[i-]-;
for(int i=;i<=n;i++){
x[i]=lower_bound(date+,date++num,x[i])-date;
y[i]=lower_bound(date+,date++num,y[i])-date;
swap(pos[x[i]],pos[y[i]]);
}
for(int i=num;i>=;i--){
ans+=query(pos[i]);
ans+=abs(sum[pos[i]]-sum[i]);
add(pos[i]);
}
printf("%I64d",ans);
}

100

/*
期望:30
*/
#include<queue>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,q,tot;
int dad[],num[];
int to[],net[],head[];
int col[],vis[],into[];
struct nond{
int l,r,col,vi;
}v[];
int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
void add(int u,int v){
to[++tot]=v;net[tot]=head[u];head[u]=tot;
}
void bfs(int s,int a,int b){
queue<int>que;
if(col[s]==a) col[s]=b;
que.push(s);vis[s]=;
while(!que.empty()){
int now=que.front();
que.pop();
for(int i=head[now];i;i=net[i])
if(!vis[to[i]]){
if(col[to[i]]==a) col[to[i]]=b;
if(col[to[i]]==col[s]){
vis[to[i]]=;
que.push(to[i]);
}
}
}
}
int main(){
//freopen("lpp.in","r",stdin);
freopen("simulator.in","r",stdin);
freopen("simulator.out","w",stdout);
n=read();q=read();
for(int i=;i<=n;i++) col[i]=read();
for(int i=;i<n;i++){
int u=read();
int v=read();
add(u,v);add(v,u);
into[u]++;into[v]++;
}
if(n<=){
for(int i=;i<=q;i++){
int a=read();int b=read();
memset(vis,,sizeof(vis));
int num=;
for(int j=;j<=n;j++)
if(!vis[j]){
bfs(j,a,b);
num++;
}
printf("%d\n",num);
}
}
}

30分暴力

/*
我们考虑优化合并操作,我们发现把x变成y和把y变成x得到的答案是相同的,
所以我们在合并的时候以及更改颜色的时候都是把颜色少的改成颜色多的,并
且维护每种颜色实际的vector是哪个,然后就相当于启发式合并。
每个点的复杂度是他的度数乘以它被统计答案的次数,
最差情况下每个点也只会被统计logN次答案,那么复杂度就是logN *
等于2NlogN
*/
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,q,tot,ans;
int id[];
int col[],size[],dad[];
int to[],net[],head[];
vector<int>vec[];
int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
void add(int u,int v){
to[++tot]=v;net[tot]=head[u];head[u]=tot;
}
void dfs(int now){
for(int i=head[now];i;i=net[i])
if(dad[now]!=to[i]){
dad[to[i]]=now;
dfs(to[i]);
if(col[to[i]]!=col[now]) ans++;
}
}
void change1(int now){
for(int i=head[now];i;i=net[i])
if(col[to[i]]!=col[now]) ans--;
}
void change2(int now){
for(int i=head[now];i;i=net[i])
if(col[to[i]]!=col[now]) ans++;
}
int main(){
freopen("simulator.in","r",stdin);
freopen("simulator.out","w",stdout);
n=read();q=read();
for(int i=;i<=n;i++){
id[i]=i;
col[i]=read();
size[col[i]]++;
vec[col[i]].push_back(i);
}
for(int i=;i<n;i++){
int u=read();
int v=read();
add(u,v);add(v,u);
}
add(,);add(,);col[]=;
dfs();//cout<<ans;
for(int i=;i<=q;i++){
int a=read();int b=read();
int xn=id[a],yn=id[b];
if(size[xn]<=size[yn]){
for(int j=;j<vec[xn].size();j++){
change1(vec[xn][j]);
vec[yn].push_back(vec[xn][j]);
}
for(int j=;j<vec[xn].size();j++) col[vec[xn][j]]=yn;
for(int j=;j<vec[xn].size();j++) change2(vec[xn][j]);
size[yn]+=size[xn];
size[xn]=;id[b]=yn;
vec[xn].clear();
}
else{
for(int j=;j<vec[yn].size();j++){
change1(vec[yn][j]);
vec[xn].push_back(vec[yn][j]);
}
for(int j=;j<vec[yn].size();j++) col[vec[yn][j]]=xn;
for(int j=;j<vec[yn].size();j++) change2(vec[yn][j]);
size[xn]+=size[yn];
size[yn]=;
id[b]=xn;id[a]=;
vec[yn].clear();
}
printf("%d\n",ans);
}
}
/*
6 3
1 2 1 1 1 2
1 2
1 3
2 4
2 5
5 6 */

100

2018 11.2 PION模拟赛的更多相关文章

  1. 2018.11.7 PION 模拟赛

    期望:100 + 80 + 75 = 255 实际:0 + 80 + 60 = 140 唉~一天比一天犯的错误智障,感觉noip要凉啊... 吓得我赶紧吃几颗药补补脑子. 奶一下大佬: lgj AK ...

  2. 2018.11.6 PION 模拟赛

    期望:100 + 40 + 50 = 190 实际:60 + 10 + 50 = 120 考得好炸啊!!T1数组开小了炸掉40,T2用 int 读入 long long ,int存储 long lon ...

  3. 2018.11.5 PION模拟赛

    期望:30 + 40 + 50 = 120 实际:30 + 50 + 40 = 120 ‘’ 思路:最重要的是发现 是完全没有用的,然后这个题目就可以转成DP来做. /* 期望的分:30 */ #in ...

  4. 2018.11.3 PION模拟赛

    期望:100    实际:100 #include<cstdio> #include<cstring> #include<iostream> #include< ...

  5. 2018 11.1 PION 模拟赛

    期望:250  100+100+50 实际:210   80+100+30 期望:100   实际:80 最后:两个点T了.可能是求逆元的方法太慢了,也可能是闲的又加了一个快速乘的原因. #inclu ...

  6. 11.7 NOIP模拟赛

    目录 2018.11.7 NOIP模拟 A 序列sequence(two pointers) B 锁lock(思路) C 正方形square(埃氏筛) 考试代码 B C 2018.11.7 NOIP模 ...

  7. 11/1 NOIP 模拟赛

    11.1 NOIP 模拟赛 期望得分:50:实际得分:50: 思路:暴力枚举 + 快速幂 #include <algorithm> #include <cstring> #in ...

  8. EZ 2018 06 17 NOIP2018 模拟赛(十九)

    这次的题目难得的水,但是由于许多哲学的原因,第二题题意表述很迷. 然后是真的猜题意了搞了. 不过这样都可以涨Rating我也是服了. Upt:链接莫名又消失了 A. 「NOIP2017模拟赛11.03 ...

  9. EZ 2018 06 10 NOIP2018 模拟赛(十八)

    好久没写blog&&比赛题解了,最近补一下 这次还是很狗的,T3想了很久最后竟然连并查集都忘写了,然后T2map莫名爆炸. Rating爆减......链接不解释 好了我们开始看题. ...

随机推荐

  1. org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'needDao' defined in URL

    这个是我修改过后的mapper,是我的mapper中的空间地址写错了呢

  2. smile domain name www.bn-nd.com for sell. Please contact boyanzheng at foxmail.com 微笑的域名。请联系邮箱。

  3. 汇编3栈帧,参数传递,串操作,混合汇编,x64,asm文件

    基础知识2 选择结构 通过判断 + 条件跳转指令来实现 循环结构 通过判断 + 条件跳转指令来实现(会有一个向上跳转的语句) 函数调用约定 C调用约定: 由外部平衡栈 标准调用约定 : 由函数内部平衡 ...

  4. Animate.css_css3动画库介绍

    插件描述:Animate.css内置了很多典型的css3动画,兼容性好使用方便. Animate.css是一个有趣的,跨浏览器的css3动画库.很值得我们在项目中引用. 用法 1.首先引入animat ...

  5. SQL Server数据库的除法默认向下取整,要返回小数的解决方法

    num1; / 1000.0 num2; * 1.0 num3; num4; 结果:

  6. treetable

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  7. win10x64下的redis安装与使用

    先引用百度百科的一段话吧,具体可以到百科查看吧. Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年 ...

  8. C++友元函数和运算符重载

    非成员友元函数.成员友元函数和友元类 1.友元的作用: (1)友元提供了不同类的成员函数之间.类的成员函数与一般函数之间进行了数据共享的机制: 2.友元的优点和缺点 优点:提高程序的运行效率: 缺点: ...

  9. Mysql 查询多个字段去重复

    今天需要统计信息,但是有过个重复的数据,需要去除,找了如下方法: SELECT *, COUNT(DISTINCT phone ) FROM apply_info GROUP BY phone

  10. 13. OPTIMIZER_TRACE

    13. OPTIMIZER_TRACE OPTIMIZER_TRACE表提供由跟踪语句的优化程序跟踪功能生成的信息. 要启用跟踪,请使用optimizer_trace系统变量. 有关详细信息,请参阅M ...