2018 11.2 PION模拟赛
期望: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模拟赛的更多相关文章
- 2018.11.7 PION 模拟赛
期望:100 + 80 + 75 = 255 实际:0 + 80 + 60 = 140 唉~一天比一天犯的错误智障,感觉noip要凉啊... 吓得我赶紧吃几颗药补补脑子. 奶一下大佬: lgj AK ...
- 2018.11.6 PION 模拟赛
期望:100 + 40 + 50 = 190 实际:60 + 10 + 50 = 120 考得好炸啊!!T1数组开小了炸掉40,T2用 int 读入 long long ,int存储 long lon ...
- 2018.11.5 PION模拟赛
期望:30 + 40 + 50 = 120 实际:30 + 50 + 40 = 120 ‘’ 思路:最重要的是发现 是完全没有用的,然后这个题目就可以转成DP来做. /* 期望的分:30 */ #in ...
- 2018.11.3 PION模拟赛
期望:100 实际:100 #include<cstdio> #include<cstring> #include<iostream> #include< ...
- 2018 11.1 PION 模拟赛
期望:250 100+100+50 实际:210 80+100+30 期望:100 实际:80 最后:两个点T了.可能是求逆元的方法太慢了,也可能是闲的又加了一个快速乘的原因. #inclu ...
- 11.7 NOIP模拟赛
目录 2018.11.7 NOIP模拟 A 序列sequence(two pointers) B 锁lock(思路) C 正方形square(埃氏筛) 考试代码 B C 2018.11.7 NOIP模 ...
- 11/1 NOIP 模拟赛
11.1 NOIP 模拟赛 期望得分:50:实际得分:50: 思路:暴力枚举 + 快速幂 #include <algorithm> #include <cstring> #in ...
- EZ 2018 06 17 NOIP2018 模拟赛(十九)
这次的题目难得的水,但是由于许多哲学的原因,第二题题意表述很迷. 然后是真的猜题意了搞了. 不过这样都可以涨Rating我也是服了. Upt:链接莫名又消失了 A. 「NOIP2017模拟赛11.03 ...
- EZ 2018 06 10 NOIP2018 模拟赛(十八)
好久没写blog&&比赛题解了,最近补一下 这次还是很狗的,T3想了很久最后竟然连并查集都忘写了,然后T2map莫名爆炸. Rating爆减......链接不解释 好了我们开始看题. ...
随机推荐
- 洛谷 U10206 Cx的治疗
题目背景 「Cx的故事」众所周知,Cx是一个宇宙大犇.由于Cx在空中花园失足摔下,导致他那蕴含着无穷智慧的大脑受到了严重的损伤,许多的脑神经断裂.于是,Cx的wife(有么?)决定请巴比伦最好的医师治 ...
- EOS Dawn 3.0 智能合约 -- 新格式
1.简介 随着EOS Dawn 3.0发布,智能合约的坑又要重新踩了o(╥﹏╥)o:3.0不仅将原来本身就在链里的基础合约独立出来,简单的介绍见3.0合约改变,合约的书写方式也有巨大变化,相比之前更加 ...
- 几个有关整数的证明(from信息安全数学基础的作业)
1. 设m,n为正整数,m为奇数,求证2m-1和2n+1互素 反证法:假设d=(2m-1,2n+1)≥2,则存在x,y∈z,2m=dx+1,和2n=dy-1 则存在u,v∈z,2mn=du+1,2nm ...
- ibatis经验
1.insert,update,delete 返回值(1).insert 返回的为插入的主键值,但必须在配置文件中加入<selectKey/> 如果主键值为String<sele ...
- css控制超出部分自动省略...
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 洛谷 P2858 奶牛零食
https://www.luogu.org/problemnew/show/P2858 毫无疑问区间dp. ![区间dp入门] 我们定义dp[i][j]表示从i到j的最大收益,显然我们需要利用比较小的 ...
- MySQL多版本并发控制(MVCC)
MVCC是行级锁的一个变种,但是它在很多的情况下避免了加锁操作,因此开销更低.MySQL,包括Oracle.PostgreSQL都实现了MVCC,虽然每个关系数据库实现不一样,但大都是实现了非阻塞的读 ...
- 自定义函数导致的sql性能问题
同事说,某某报表跑的很慢,让我调查一下 优化前:该报表整体需要跑4小时以上. sql代码如下 SELECT /*省略多数查询字段*/ REP_FUN_REFCODEVALUE /*自定义函数*/ (P ...
- Linux启动流程CentOS6和7的区别
目 录 Linux启动流程 I 第1章 CentOS6启动流程 1 1.1 BIOS 1 1.2 MBR 1 1.3 GRUB 1 1.4 kernel(加载内核) ...
- html/css:简单网页
html: <!DOCTYPE html> <html> <head> <meta http-equiv=“content-type” content=“te ...