usaco 2017 February platinum

1.一条路,两边都是一个1到n的全排列,可以把其中一个全排列的起始位置改变(比如123可以变成231或者312)

然后把相同的数连起来,求小交叉数。

先算一下交叉数,然后直接一步步移动,O1更新一下状态就可以了。注意两边都要算过去。

#include<iostream>
#include<cstdio>
#define ll long long
#define N 131072
using namespace std;
int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}return x*f;
}int T[N*2+5];
int n;
int s2[N];
int s[N],pos[N];
int pos2[N];
int up[N],down[N];
ll tot=0,tot2;
ll minn;void renew(int x,int ad)
{T[x+=N]=ad;for(x>>=1;x;x>>=1){T[x]=T[x<<1]+T[(x<<1)+1];}
}int query(int l,int r)
{int sum=0;for(l+=N-1,r+=N+1;l^r^1;l>>=1,r>>=1){if(~l&1) sum+=T[l+1];if( r&1) sum+=T[r-1];}return sum;
}int main()
{freopen("mincross.in","r",stdin);freopen("mincross.out","w",stdout);n=read();for(int i=1;i<=n;i++){s[i]=read();pos2[s[i]]=i;}for(int i=1;i<=n;i++){s2[i]=read();pos[s2[i]]=i;}for(int i=1;i<=n;i++){up[i]=query(1,pos[s[i]]);down[i]=i-1-up[i];renew(pos[s[i]],1);tot+=(ll)down[i];}minn=tot2=tot;for(int i=n;i>1;i--){tot-=n-pos[s[i]];tot+=pos[s[i]]-1;tot2-=n-pos2[s2[i]];tot2+=pos2[s2[i]]-1;minn=min(minn,min(tot,tot2));}cout<<minn;return 0;
}

 

2.有一条路,路两边都有一个随意顺序的1-n n个点。如果|a-b|<=4 那么这两个点可以连边。

现在要让所有边边两两不交叉,求最多可以连多少边。

有一道金组的一样的题目 n<=1000  直接dp即可

这道题则加大了数据 n<=100000 

所以优化一下,边最多9*n条,我们可以在左边从上到下做,在右边用一个线段树第i个位置表示只和1-i部分的点连线,最多可以连几条。

那么每次用每条边更新一下答案就行了。复杂度nlogn*9

#include<iostream>
#include<cstdio>
#define ll long long
#define N 131072
using namespace std;
int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}return x*f;
}
int n;
int s[N],pos[N];
int f[N];
int T[N*2+5];void renew(int x,int ad)
{T[x+=N]=ad;for(x>>=1;x;x>>=1){T[x]=max(T[x<<1],T[(x<<1)+1]);}
}int query(int l,int r)
{int sum=0;for(l+=N-1,r+=N+1;l^r^1;l>>=1,r>>=1){if(~l&1) sum=max(sum,T[l+1]);if( r&1) sum=max(sum,T[r-1]);}return sum;
}int main()
{freopen("nocross.in","r",stdin);freopen("nocross.out","w",stdout);n=read();for(int i=1;i<=n;i++){s[i]=read();}for(int i=1;i<=n;i++){int x=read();pos[x]=i;}for(int i=1;i<=n;i++){for(int j=max(1,s[i]-4);j<=min(n,s[i]+4);j++){f[pos[j]]=max(f[pos[j]],query(1,pos[j]-1)+1);}for(int j=max(1,s[i]-4);j<=min(n,s[i]+4);j++)renew(pos[j],f[pos[j]]);}printf("%d\n",query(1,n));return 0;
}

3.还是这样一条路,路两旁还是1到n的全排列,这时候给定k 只有|a-b|<=k a和b才是友善的。

现在左右两边相同数字连边,求不友善的交叉的个数。n,k<=100000

查交叉个数可以用一个权值线段树在nlogn内查,这道题也可以用一个二维线段树做....

但是这显然太复杂了,我们考虑用cdq分治来解决这个问题。

基本思路:按照1-n的顺序,插入点,每次插入一个点m,就查一下m+k+1的答案。

所以把询问和插入节点按照时间戳进行cdq分治

每次计算答案时,将左边的插入操作和右边的查询操作按照左边的出现顺序排序,并且用线段树的做法查询答案就行了。

所以正着做一次反着做一次....复杂度nlog^2n

#include<iostream>
#include<cstdio>
#include<algorithm>
#define ll long long
#define N 131072
using namespace std;
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}return x*f;
} int n,k;ll ans=0;
int T[N*2+5];struct cow{int x,y,k;
}s[100005],q[200005],a[200005];bool cmp(cow x,cow y){return x.x<y.x||(x.x==y.x&&x.k<y.k);}void renew(int x,int ad)
{//cout<<"renew"<<x<<" "<<ad<<endl;T[x+=N]=ad;for(x>>=1;x;x>>=1) T[x]=T[x<<1]+T[(x<<1)+1];
}void query(int l,int r)
{
//    cout<<"query"<<l<<" "<<r<<endl;for(l+=N-1,r+=N+1;l^r^1;l>>=1,r>>=1){if(~l&1) ans+=T[l+1];if( r&1) ans+=T[r-1];    }
}void solve(int l,int r)
{int mid=(l+r)/2,m=0;for(int i=l;i<=mid;i++)   if(!q[i].k)a[++m]=q[i];for(int i=mid+1;i<=r;i++) if( q[i].k)a[++m]=q[i];sort(a+1,a+m+1,cmp);for(int i=1;i<=m;i++)if(a[i].k) query(a[i].y,n);    else renew(a[i].y,1);for(int i=1;i<=m;i++) if(!a[i].k) renew(a[i].y,0);
}void work(int l,int r)
{if(l<r){int mid=(l+r)/2;work(l,mid);work(mid+1,r);    solve(l,r);}
}int main()
{freopen("friendcross.in","r",stdin);freopen("friendcross.out","w",stdout);n=read();k=read();for(int i=1;i<=n;i++)s[read()].x=i;for(int i=1;i<=n;i++)s[read()].y=i;for(int i=1;i<=n-k-1;i++)q[(i<<1)-1]=s[i],q[i<<1]=s[i+k+1];    for(int i=1;i<=n-k+1;i++) q[i<<1].k=1;work(1,(n-k-1)<<1);for(int i=n,j=1;i>=k+2;--i,++j)q[(j<<1)-1]=s[i],q[j<<1]=s[i-k-1];    for(int i=1;i<=n-k+1;i++) q[i<<1].k=1;work(1,(n-k-1)<<1);cout<<ans;return 0;
}

 感想:怎么都有线段树。。???

转载于:https://www.cnblogs.com/FallDream/p/usaco2017Feb.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371493.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hessian 源码简单分析

Hessian 源码简单分析 Hessian 是一个rpc框架&#xff0c; 我们需要先写一个服务端&#xff0c; 然后在客户端远程的调用它即可。 服务端&#xff1a; 服务端通常和spring 做集成。 首先写一个接口&#xff1a; public interface HelloService { void sayHello(String n…

Java开发人员应该知道的三件事

对于那些长期关注JavaOne 2012会议的读者来说&#xff0c;这是一篇有趣的文章。 我最近对Java冠军Heinz Kabutz的采访引起了我的注意&#xff1b; 包括他的Java内存难题程序&#xff0c;从Java内存管理的角度来看&#xff0c;这很有启发性。 采访中有一个特别的部分吸引了我的注…

android怎么垂直居中且靠右,placeholder 靠右垂直居中/位置兼容

1.input输入框文字靠右垂直居中。2.placehoder提示同样靠右垂直居中。( placeholder是HTML5 input的新属性&#xff0c;英文意思是占位符&#xff0c;它一般表示input输入框的默认提示值。)css代码input {text-align: right;font-size:0.3rem;width:100%;height:0.78rem;line-…

Python-Matplotlib 18 注释

Python-Matplotlib 18 注释 EG1: import numpy as np import matplotlib.pyplot as plty np.arange(-5, 6,1) plt.plot(y, y*y) plt.annotate(Annotate , xy(0,1) , xytext(0,5) ,arrowpropsdict(facecolorr , frac0.2 ))plt.show()转载于:https://www.cnblogs.com/zsr0401/p/…

while和for循环

循环结构图&#xff1a; 循环结构主要分为两种&#xff1a;有while和for两种循环&#xff0c;while又分为do{...}while和while{...},do...while表示先执行后判断&#xff0c;而while循坏表示先判断后执行&#xff0c;如果循环条件都不满足的情况下&#xff0c;do...while至少执…

通过beforeClass和afterClass设置增强Spring Test Framework

如何允许实例方法作为JUnit BeforeClass行为运行 JUnit允许您在所有测试方法调用之前和之后一次在类级别上设置方法。 但是&#xff0c;通过有意设计&#xff0c;他们将其限制为仅使用BeforeClass和AfterClass批注的静态方法。 例如&#xff0c;此简单的演示显示了典型的Junit设…

华为鸿蒙出来正当时,关于华为鸿蒙操作系统,中兴率先表态

原标题&#xff1a;关于华为鸿蒙操作系统&#xff0c;中兴率先表态 来源&#xff1a;科技数码迷进入2021年之后中兴这个品牌的存在感越来越强了&#xff0c;并且还学会了借势营销。每当国内智能手机领域有大事之时总会看到中兴或红魔手机的身影。这说明在5G过渡期中兴要借个机会…

条件变量(Condition Variable)详解

转载于&#xff1a;http://blog.csdn.net/erickhuang1989/article/details/8754357 条件变量(Condtion Variable)是在多线程程序中用来实现“等待->唤醒”逻辑常用的方法。举个简单的例子&#xff0c;应用程序A中包含两个线程t1和t2。t1需要在bool变量test_cond为true时才能…

C++中的深拷贝和浅拷贝 QT中的深拷贝,浅拷贝和隐式共享

下面是C中定义的深&#xff0c;浅拷贝 当用一个已初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候&#xff0c;拷贝构造函数就会被自动调用。也就是说&#xff0c;当类的对象需要拷贝时&#xff0c;拷贝构造函数将会被调用。以下情况都会调用拷贝构造函数&#…

使用PowerMock模拟构造函数

我认为&#xff0c;依赖项注入的主要好处之一是可以将模拟和/或存根对象注入代码中&#xff0c;以提高可测试性&#xff0c;增加测试覆盖率并编写更好&#xff0c;更有意义的测试。 但是&#xff0c;有时候您会遇到一些不使用依赖注入的传统代码&#xff0c;而是通过组合而不是…

Brackets (区间DP)

个人心得&#xff1a;今天就做了这些区间DP&#xff0c;这一题开始想用最长子序列那些套路的&#xff0c;后面发现不满足无后效性的问题&#xff0c;即&#xff08;&#xff0c;&#xff09;的配对 对结果有一定的影响&#xff0c;后面想着就用上一题的思想就慢慢的从小一步一步…

android生成aar无效,android studio生成aar包并在其他工程引用aar包的方法

1.aar包是android studio下打包android工程中src、res、lib后生成的aar文件&#xff0c;aar包导入其他android studio 工程后&#xff0c;其他工程可以方便引用源码和资源文件2.生成aar包步骤&#xff1a;①.用android studio打开一个工程&#xff0c;然后新建一个Module&#…

《剑指offer》— JavaScript(3)从尾到头打印链表

从尾到头打印链表 题目描述 输入一个链表&#xff0c;从尾到头打印链表每个节点的值。 实现代码 /*function ListNode(x){this.val x;this.next null; }*/ function printListFromTailToHead(head) {var res[];while(head){res.unshift(head.val);headhead.next;}return res;…

JUnit测试Spring Service和DAO(带有内存数据库)

这篇文章描述了如何为Spring Web Application的Services和DAO实现JUnit测试。 它建立在Spring MVC-Service-DAO-Persistence Architecture Example的基础上 。 从Github的Spring-Web-JPA-Testing目录中可以找到该示例。 提醒 测试装置 –固定状态&#xff0c;用作运行测试的基…

c# 正则获取html标签内容,c# – 使用正则表达式在多个HTML标记之间获取文本

使用正则表达式,我希望能够在多个DIV标记之间获取文本.例如,以下内容&#xff1a;first html taganother tag输出&#xff1a;first html taganother tag我使用的正则表达式模式只匹配我的最后一个div标签并错过了第一个.码&#xff1a;static void Main(string[] args){string…

Android之外部存储(SD卡)

*手机的外部存储空间&#xff0c;这个我们可以理解成电脑的外接移动硬盘&#xff0c;U盘也行。所有的Android设备都有两个文件存储区域&#xff1a;“内部”和“外部”存储器。这两个名称来自早期的Android&#xff0c;当时大多数设备都提供内置的固定的内存&#xff08;内置存…

通用并发对象池

在本文中&#xff0c;我们将介绍如何在Java中创建对象池。 近年来&#xff0c;JVM的性能成倍增加&#xff0c;大多数类型的对象几乎都变得多余&#xff0c;从而提高了对象池的性能。 从本质上讲&#xff0c;对象的创建不再像以前那样昂贵。 但是&#xff0c;有些对象在创建时肯…

圆周率的代码表示,以及对其的理解。

转载的简书&#xff0c;for 记录以及记忆。 http://www.jianshu.com/p/7208e4a58310 Thanks again&#xff01; 转载于:https://www.cnblogs.com/xiapeng0701/p/7538281.html

华为NOVa8Pr0是用鸿蒙系统吗,华为Nova8即将发布,采用麒麟芯片,高端平板适配鸿蒙系统...

大家好&#xff0c;我是老孙自从华为Mate40系列发布后&#xff0c;下一步新机动态备受外界关注&#xff0c;华为究竟会不会继续生产手机呢&#xff1f;答案是肯定&#xff0c;华为Nova8系列将于本月发布&#xff0c;华为P50系列也在积极筹备&#xff0c;而且都少不了麒麟芯片&a…

使用路标的Scala和Java的Twitter REST API

如果您已阅读此博客上的其他文章&#xff0c;您可能会知道我喜欢创建各种数据集的可视化。 我刚刚开始一个小项目&#xff0c;在这里我想可视化来自Twitter的一些数据。 为此&#xff0c;我想直接从Twitter检索有关关注者的信息和个人资料信息。 我实际上开始寻找一组所有推特帐…