orz lydrainbowcat

[Problem A]「艦これ市」70万幕后交易事件

排序机器=-=。重要的是相同的处理。

我们可以从小到大添加数字,然后维护一个位置的序列。每一种相等的数字都在一块。如果我们要添加一个新的数字,要把位置>它的数字全部弹出,而且要把小于它的数字(在队头)全部弹出,这样才能保证正确性和最优性。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std; #define maxn 1000010 int n, m, ans; int a[maxn]; vector<int> b[maxn]; int q[maxn]; int main(){
scanf("%d", &n);
for(int i = 1; i <= n; i ++){
scanf("%d", &a[i]);
b[a[i]].push_back(i);
m = max(m, a[i]);
}
int l = 1, r = 0;
for(int i = 1; i <= m; i ++){
int N = b[i].size();
for(int j = N - 1; j >= 0; j --){
int k = b[i][j];
while(l <= r && q[r] > k){
while(l <= r && a[q[l]] < a[q[r]])
l ++;
r --;
}
ans = max(ans, r - l + 1 + N - j);
}
for(int j = 0; j < b[i].size(); j ++)
q[++ r] = b[i][j];
}
printf("%d\n", n - ans);
return 0;
}

[Problem B]「NOIP市」神秘PY交易事件(前篇)  

题目意思好长。。

而且两个人同能力要相等的工资??

暴力都写炸了。。QAQ。。

bruteforce:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define maxn 100010
using namespace std; struct Edge{
int to, next, dis;
Edge(int v = 0, int nxt = 0, int d = 0){
to = v, next = nxt, dis = d;
}
}edge[maxn << 2]; int h[maxn], cnt, n;
void add(int u, int v, int d){
edge[++ cnt] = Edge(v, h[u], d); h[u] = cnt;
} int dis[maxn];
queue<int>Q;
bool vis[maxn];
void Spfa(){
int ans = 0;
for(int i = 1; i <= n; i ++)
add(0, i, 1);
Q.push(0);
memset(dis, 0x80, sizeof dis);
dis[0] = 0;
while(!Q.empty()){
int u = Q.front(); Q.pop();
for(int i = h[u]; i; i = edge[i].next){
int v = edge[i].to;
if(dis[v] < dis[u] + edge[i].dis){
dis[v] = dis[u] + edge[i].dis;
if(vis[v] == false)
vis[v] = true, Q.push(v);
}
}vis[u] = false;
}
for(int i = 1; i <= n; i ++)
ans += dis[i]; printf("%d\n", ans);
} int c[maxn]; Edge G[maxn << 2];
int H[maxn], CNT;
void Ins(int u, int v){
CNT ++;
G[CNT].to = v;
G[CNT].next = H[u];
H[u] = CNT;
} int main(){
scanf("%d", &n);
for(int i = 1; i <= n; i ++)
scanf("%d", &c[i]);
int u, v, m;
scanf("%d", &m);
for(int i = 1; i <= m; i ++){
scanf("%d%d", &u, &v);
Ins(u, v); Ins(v, u);
} for(int i = 1; i <= n; i ++){
for(int j = H[i]; j; j = G[j].next){
int v = G[j].to;
if(c[i] < c[v])
add(i, v, 1);
if(c[i] == c[v])
add(i, v, 0), add(v, i, 0);
for(int k = H[i]; k; k = G[k].next){
int u = G[k].to;
if(c[v] < c[u])
add(v, u, 1);
if(c[v] == c[u])
add(v, u, 0), add(u, v, 0);
}
}
}
Spfa();
return 0;
}

然而正解是这样的。。对于相邻的人,如果能力值相同那么工资一定相同。这样工资相同的人可能会组成一些强连通分量,我们如果把这些scc缩掉就会形成一个DAG。(这个可以用并查集实现)。跑差分约束(最长路)或者拓扑排序都可。然后对于每一个点相邻的sort一遍,由于相邻的人的的能力值都不同,所以可以在相邻点之间连边即可(建边优化)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#include <stack>
#define maxn 100010
using namespace std; vector<int> G[maxn]; int c[maxn]; bool cmp(int i, int j){return c[i] < c[j];} struct Edge{
int to, next;
Edge(int v = 0, int nxt = 0){
to = v, next = nxt;
}
}edge[maxn << 4];
int h[maxn], cnt, n, In[maxn];
void add(int u, int v){
edge[++ cnt] = Edge(v, h[u]);
h[u] = cnt; ++ In[v];
} int fa[maxn];
int getfa(int x){return x == fa[x] ? x : fa[x] = getfa(fa[x]);}
inline void Union(int x, int y){
x = getfa(x), y = getfa(y);
fa[x] = y;
} stack<int> S; int ans[maxn], ct[maxn]; int main(){
scanf("%d", &n);
for(int i = 1; i <= n; i ++)
scanf("%d", &c[i]), fa[i] = i;
int u, v, m;
scanf("%d", &m);
for(int i = 1; i <= m; i ++){
scanf("%d%d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
if(c[u] == c[v])
Union(u, v);
} for(int i = 1; i <= n; i ++){
sort(G[i].begin(), G[i].end(), cmp);
for(int j = 1; j < G[i].size(); j ++)
if(c[G[i][j]] == c[G[i][j-1]])
Union(G[i][j], G[i][j-1]);
} for(int i = 1; i <= n; i ++){
for(int j = 0; j < G[i].size(); j ++)
if(c[i] < c[G[i][j]])
add(getfa(i), getfa(G[i][j]));
for(int j = 1; j < G[i].size(); j ++)
if(getfa(G[i][j-1]) != getfa(G[i][j]))
add(getfa(G[i][j-1]), getfa(G[i][j]));
} for(int i = 1; i <= n; i ++)
if(In[i] == 0 && getfa(i) == i)
S.push(i); for(int i = 1; i <= n; i ++)
ct[getfa(i)] ++, ans[i] = 1;
long long ret = 0;
while(!S.empty()){
int u = S.top(); S.pop();
ret += 1ll * ct[u] * ans[u];
for(int i = h[u]; i; i = edge[i].next){
int v = edge[i].to;
In[v] --;
ans[v] = max(ans[v], ans[u] + 1);
if(In[v] == 0) S.push(v);
}
} printf("%lld\n", ret);
return 0;
}

  

Contest Hunter Round #70 - 连续两大交易事件杯省选模拟赛的更多相关文章

  1. 模拟赛小结:2017 China Collegiate Programming Contest Final (CCPC-Final 2017)

    比赛链接:传送门 前期大顺风,2:30金区中游.后期开题乏力,掉到银尾.4:59绝杀I,但罚时太高卡在银首. Problem A - Dogs and Cages 00:09:45 (+) Solve ...

  2. Codeforces Beta Round #70 (Div. 2)

    Codeforces Beta Round #70 (Div. 2) http://codeforces.com/contest/78 A #include<bits/stdc++.h> ...

  3. Gartner 2018 数据库系列报告发布 巨杉数据库连续两年入选

    近期,Gartner陆续发布了2018年的数据库系列报告,包括<数据库魔力象限><数据库核心能力>以及<数据库推荐报告>.其中,SequoiaDB巨杉数据库作为业界 ...

  4. 首先java中集合类主要有两大分支

    本文仅分析部分原理和集合类的特点,不分析源码,旨在对java的集合类有一个整体的认识,理解各个不同类的关联和区别,让大家在不同的环境下学会选择不同的类来处理. Java中的集合类包含的内容很多而且很重 ...

  5. [转帖] 中国SaaS死或生之二: ERP两大邪术,尽出歪门邪路 ---- 挺好玩的

    中国SaaS死或生之二: ERP两大邪术,尽出歪门邪路   http://www.cniteyes.com/archives/33753   文章摘要:在数字化浪潮中,油腻ERP大叔的那些“歪门邪术” ...

  6. BCH硬分叉在即,Bitcoin ABC和NChain两大阵营PK

    混迹币圈,我们都知道,BTC分叉有了BCH,而近期BCH也将面临分叉,这次分叉将是Bitcoin ABC和NChain两大阵营的较量,最后谁能成为主导,我们拭目以待. 比特币现金(BCH)的价格自上周 ...

  7. Contest Hunter 3101

    题目 Contest Hunter 3101 阶乘分解 原题传送门 题目分析 这里介绍一个本蒟蒻自己\(yy\)出来的方法. 我们发现,对于某一个单个的整数\(n\),若\(n\)能被某一个数\(x\ ...

  8. 【题解】Comet OJ Round 70 简要题解

    [题解]Comet OJ Round 70 简要题解 A 将放在地上的书按照从小到大排序后,问题的本质就变成了合并两个序列使得字典序最小.可以直接模拟归并排序.直接用循环和std::merge实现这个 ...

  9. 痞子衡嵌入式:串行NAND Flash的两大特性导致其在i.MXRT FlexSPI下无法XiP

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是串行NAND Flash的两大特性导致其在i.MXRT FlexSPI下无法XiP. 在嵌入式世界里,当我们提起XiP设备(支持代码原地 ...

随机推荐

  1. Linux 查看网络连接状态

    CLOSED:无连接是活动的或正在进行ESTABLISED:已建立连线的状态:SYN_SENT:发出主动连线 (SYN 标志) 的连线封包:SYN_RECV:接收到一个要求连线的主动连线封包:FIN_ ...

  2. 代码风格与树形DP

    Streaming很惨,不过因为比赛之间没有提交过就没掉(或掉了)rating.第二题是一个树形DP,但是我都在想第一题了,简直作死. 看着神犇的代码我也是醉了...各种宏,真是好好写会死系列. 看到 ...

  3. 使用XmlWriter写Xml

    假定创建了XmlWriter的实例变量xmlWriter,下文中将使用此实例变量写Xml 1.如何使用XmlWriter写Xml文档声明 ? // WriteStartDocument方法可以接受一个 ...

  4. asp.net日志跟踪方法

    1. 页面级的配置 要在页面级启用跟踪功能,就要在@Page指令中设置Trace属性.如下所示: *************************************************** ...

  5. 一些Linux的路径

    系统引导时启动        /etc/rc.d/rc.local

  6. mysql sql维护常用命令

    mysql修改表名,列名,列类型,添加表列,删除表列 alter table test rename test1; --修改表名 alter table test add  column name v ...

  7. 《ASP.NET1200例》嵌套在DataLisT控件中的其他服务器控件---DropDownList控件的数据绑定

    aspx <script type="text/javascript"> function CheckAll(Obj) { var AllObj = document. ...

  8. firefox30浏览器,在使用quit()方法退出时,plugin-container.exe崩溃的问题

    如题,崩溃截图如下: 解决办法: 对于版本号大于29的firefox,需要在其安装目录下,删除plugin-container.exe,不然使用webdriver的quit()方法关闭浏览器时会报错. ...

  9. 如何使用box2d做碰撞检测

    cocos2dx3.0+vs2012编译通过. 主要是通过body->SetTransform来设置body的位置和角度,然后自己写个ContactListener来监听碰撞事件 源代码下载 # ...

  10. [Android Pro] Android签名与认证详细分析之一(CERT.RSA剖析)

    转载自:http://www.thinksaas.cn/group/topic/335450/ 一.Android签名概述 我们已经知道的是:Android对每一个Apk文件都会进行签名,在Apk文件 ...