AGC 001 F Wide Swap (拓扑排序)
来源:互联网 发布:手机淘宝怎么开店铺 编辑:程序博客网 时间:2024/05/21 22:48
Description
给定一个
Solution
求得
对于
对应岛
显然这样连的边是
Code
#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<iostream>#include<algorithm>#include<queue>#include<vector>#include<set>#define For(i , j , k) for (int i = (j) , _##end_ = (k) ; i <= _##end_ ; ++ i)#define Fordown(i , j , k) for (int i = (j) , _##end_ = (k) ; i >= _##end_ ; -- i)#define Set(a , b) memset(a , b , sizeof(a))#define pb push_back#define INF (0x3f3f3f3f)#define Mod (1000000007)using namespace std;typedef long long LL;template <typename T> inline bool chkmax(T &a , T b) { return a < b ? (a = b , 1) : 0; }template <typename T> inline bool chkmin(T &a , T b) { return b < a ? (a = b , 1) : 0; }int _ , __;char c_;inline int read(){ for (_ = 0 , __ = 1 , c_ = getchar() ; !isdigit(c_) ; c_ = getchar()) if (c_ == '-') __ = -1; for ( ; isdigit(c_) ; c_ = getchar()) _ = (_ << 1) + (_ << 3) + (c_ ^ 48); return _ * __;}inline void file(){#ifdef hany01 freopen("permutation.in" , "r" , stdin); freopen("permutation.out" , "w" , stdout);#endif}const int maxn = 500010 , maxm = 10000000;int v[maxm] , in[maxn] , nex[maxm] , beg[maxn] , n , k , p[maxn] , e , ans[maxn];inline void add(int uu , int vv){ v[++ e] = vv; ++ in[vv]; nex[e] = beg[uu]; beg[uu] = e;}inline void init(){ n = read(); k = read(); For(i , 1 , n) p[i] = read(); For(i , 1 , n) { For(j , max(i - k + 1 , 1) , i - 1) if (p[i] < p[j]) add(i , j); For(j , i + 1 , min(i + k - 1 , n)) if (p[i] < p[j]) add(i , j); }}inline void toposort(){ priority_queue<int , vector<int> , greater<int> > q; For(i , 1 , n) if (!in[i]) q.push(i); int now = 0; while (!q.empty()) { int u = q.top(); q.pop(); ans[u] = ++ now; for (int i = beg[u] ; i ; i = nex[i]) { -- in[v[i]]; if (!in[v[i]]) q.push(v[i]); } }}inline void print(){ For(i , 1 , n) printf("%d\n" , ans[i]);}int main(){ file(); init(); toposort(); print(); return 0;}
#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<iostream>#include<algorithm>#include<queue>#include<vector>#include<set>#define For(i , j , k) for (int i = (j) , _##end_ = (k) ; i <= _##end_ ; ++ i)#define Fordown(i , j , k) for (int i = (j) , _##end_ = (k) ; i >= _##end_ ; -- i)#define Set(a , b) memset(a , b , sizeof(a))#define pb push_back#define INF (0x3f3f3f3f)#define Mod (1000000007)using namespace std;typedef long long LL;template <typename T> inline bool chkmax(T &a , T b) { return a < b ? (a = b , 1) : 0; }template <typename T> inline bool chkmin(T &a , T b) { return b < a ? (a = b , 1) : 0; }int _ , __;char c_;inline int read(){ for (_ = 0 , __ = 1 , c_ = getchar() ; !isdigit(c_) ; c_ = getchar()) if (c_ == '-') __ = -1; for ( ; isdigit(c_) ; c_ = getchar()) _ = (_ << 1) + (_ << 3) + (c_ ^ 48); return _ * __;}inline void file(){#ifdef hany01 freopen("permutation.in" , "r" , stdin); freopen("permutation.out" , "w" , stdout);#endif}const int maxn = 500010 , maxm = 10000000;int v[maxm] , in[maxn] , nex[maxm] , beg[maxn] , n , k , p[maxn] , e , ans[maxn];inline void add(int uu , int vv){// printf("%d %d\n" , uu , vv); v[++ e] = vv; ++ in[vv]; nex[e] = beg[uu]; beg[uu] = e;}struct Item{ int key , pos; bool operator < (const Item &item) const { return key < item.key; }};typedef set<Item>::iterator It;It it;inline void init(){ n = read(); k = read(); For(i , 1 , n) p[i] = read(); set<Item> st; For(i , 1 , n) { if (i >= k + 1) st.erase((Item){p[i - k] , i - k}); it = st.upper_bound((Item){p[i] , i}); if (it != st.end()) add(i , (*it).pos);/* printf("%d:" , p[i]); for (it = st.begin() ; it != st.end() ; ++ it) printf(" %d" , (*it).key); putchar('\n');*/ st.insert((Item){p[i] , i}); } st.clear(); For(i , 1 , k - 1) st.insert((Item){p[i] , i});// putchar('\n'); For(i , 1 , n) { st.erase((Item){p[i] , i}); if (i + k - 1 <= n) st.insert((Item){p[i + k - 1] , i + k - 1}); it = st.upper_bound((Item){p[i] , i}); if (it != st.end()) add(i , (*it).pos);/* printf("%d:" , p[i]); for (it = st.begin() ; it != st.end() ; ++ it) printf(" %d" , (*it).key); putchar('\n');*/ st.erase((Item){p[i - k + 1] , i - k + 1}); }}inline void toposort(){ priority_queue<int , vector<int> , greater<int> > q; For(i , 1 , n) if (!in[i]) q.push(i); int now = 0; while (!q.empty()) { int u = q.top(); q.pop(); ans[u] = ++ now; for (int i = beg[u] ; i ; i = nex[i]) { -- in[v[i]]; if (!in[v[i]]) q.push(v[i]); } }}inline void print(){ For(i , 1 , n) printf("%d\n" , ans[i]);}int main(){ file(); init(); toposort(); print(); return 0;}
阅读全文
1 0
- AGC 001 F Wide Swap (拓扑排序)
- AGC001F-Wide Swap-拓扑排序
- Gym 100685F Flood(拓扑排序)
- Codeforces 825 F Minimal Labels(反向拓扑排序)
- atcoder agc001F Wide Swap
- webrtc(一) agc
- (AGC)C
- 拓扑排序 (java)
- 拓扑排序(转)
- 拓扑排序(图论)
- 拓扑排序(谢庆皇)
- HDU3342(拓扑排序)
- hdu1285(拓扑排序)
- 拓扑排序 (java)
- hdu1811(拓扑排序)
- poi(拓扑排序)
- 拓扑排序(图)
- 拓扑排序 (java)
- 源码目录下只有configure.ac文件和Makefile.am文件
- NC5审批流开发流程
- Codeforces Round #332 (Div. 2)-D Spongebob and Squares(枚举+递推)
- java 深拷贝与浅拷贝
- 推荐一个国产简洁易用前段框架
- AGC 001 F Wide Swap (拓扑排序)
- 如何在Eclipse中用Junit编写测试用例(转)
- 关系型数据库和非关系数据库区别
- 设计模式
- Android设置Button字母大小写
- final总结
- 深入Android渲染机制
- 复制含有随机指针节点的链表——C++实现
- File IO(NIO.2):路径类 和 路径操作