POJ2274【CEOI2003】The Race
来源:互联网 发布:什么是网络贷款诈骗 编辑:程序博客网 时间:2024/06/04 01:27
题目链接:http://poj.org/problem?id=2274
【分析】
第一问逆序对,树状数组或者归并排序随便过...
第二问堆维护。考虑到如果有三辆车a,b,c,a在b的前面,b在c的前面,后来a超过了c,那么之前要么b先超过了c,要么a先超过了b。也就是说只有位置相邻的车才有可能发生较早的超车。然后堆维护一下就好了。
PS:拍了三个晚上的第二问都是对的,然后交上去一直过不了,最终发现第一问中间算答案时没有取模爆int了......
【代码】
#include <cstdio>#include <cmath>#include <queue>#include <algorithm>using namespace std;typedef long long LL;const int maxn=250010,mod=1000000;const double eps=1e-8;struct Car{int id,x,v;}c[maxn],temp[maxn];struct Info{int idx,idy;double t,x;Info(int _idx,int _idy,double _t,double _x):idx(_idx),idy(_idy),t(_t),x(_x){}bool operator<(const Info &b) const {return t>b.t || (fabs(t-b.t)<eps && x>b.x);}};int Merge_Sort(int l,int r){if (l==r) return 0;int mid=(l+r)>>1,res=0;res+=Merge_Sort(l,mid);res+=Merge_Sort(mid+1,r);int x=l,y=mid+1;for (int i=l;i<=r;i++)if (x<=mid && (c[x].v<=c[y].v || y==r+1)) temp[i]=c[x++];else temp[i]=c[y++],res=(res+(mid-x+1))%mod;for (int i=l;i<=r;i++) c[i]=temp[i];return res%mod;}bool cmp(const Car &a,const Car &b) {return a.id<b.id;}inline double Time(int a,int b) {return double(c[b].x-c[a].x)/(c[a].v-c[b].v);}inline double DIS(int a,int b) {return c[a].x+c[a].v*Time(a,b);}priority_queue<Info> Q;int Loc[maxn];int n;void Work2(){sort(c+1,c+1+n,cmp);c[0].v=-1;c[n+1].v=110;for (int i=1;i<=n;i++) if (c[i].v>c[i+1].v) Q.push(Info(c[i].id,c[i+1].id,Time(i,i+1),DIS(i,i+1)));for (int cnt=0;cnt<10000 && !Q.empty();){Info now=Q.top();Q.pop();int px=Loc[now.idx],py=Loc[now.idy];if (py!=px+1) continue;cnt++;printf("%d %d\n",now.idx,now.idy);swap(c[px],c[py]);swap(Loc[now.idx],Loc[now.idy]);if (c[px-1].v>c[px].v) Q.push(Info(c[px-1].id,c[px].id,Time(px-1,px),DIS(px-1,px)));if (c[py].v>c[py+1].v) Q.push(Info(c[py].id,c[py+1].id,Time(py,py+1),DIS(py,py+1)));}}int main(){scanf("%d",&n);for (int i=1;i<=n;i++) scanf("%d%d",&c[i].x,&c[i].v),c[i].id=i,Loc[i]=i;printf("%d\n",Merge_Sort(1,n));Work2();return 0;}
0 0
- POJ2274【CEOI2003】The Race
- POJ2274[The Race]题解
- POJ2274——The Race
- Poj2274[The Race]题解--逆序对&二叉堆
- Day at the Race
- Lesson 69 The car race.
- poj 2274 The Race 小根堆
- [poj 2274] The Race 堆
- Race
- Codeforces 48C The Race 模拟题
- codeforces #328 C. The Big Race
- POJ 2274 [The Race]【堆+链表】
- poj 2274 The Race(逆序数+线段树)
- MultiRace-Efficient on-the-fly data race detection
- cf C. The Big Race (简单模拟)
- Codeforces 592C The Big Race 【GCD && LCM】
- Codeforces Round #328 (Div. 2) C. The Big Race
- Codeforces Round #328 (Div. 2)C. The Big Race
- https://leetcode.com/problems/candy/
- 高级部分 Volley框架的Post请求的使用
- 浅谈字符串匹配的KMP算法
- Longest Valid Parentheses (求最长有效匹配括号子串的长度)
- PHP中如何返回前一页并刷新页面
- POJ2274【CEOI2003】The Race
- eclipse无法访问genymotion模拟器下/data/data文件解决方案
- maven下log4j的配置
- 杭电ACM1203——I NEED A OFFER!~~01背包
- GDAL创建坐标系与坐标转换
- 灯闪烁功能(呼吸灯)
- android studio导入eclipse工程找不到图片
- 4.17
- android(8) ViewPager页面滑动切换