Problem C: 多线程

Description

多线程是一种常见的加速手段,利用多个线程同时处理不同的任务可以一定程度上减少总耗时,达到提高效率的目的。然而,多个线程间的执行顺序是完全不可控的,这常常会导致一些意料之外的问题。

一个简单的例子,如果三个线程分别输出A,B,C, 你同时启动这三个线程,最终的输出可能是ACB也可能是CBA等等。更极端的例子,如果两个线程分别输出AB和ab,你甚至可能看到类似AaBb和aABb的输出。

当你拿到一串输出而他们属于多个线程的时候,反推出每个线程的输出是一件非常麻烦的事情(甚至有时候完全不可能),很不幸,接下来你的任务就是这样一件麻烦事。

【题意描述】

现在有两个线程同时在输出数列,线程A输出一个单调递增数列,而线程B输出一个单调递减数列。

距离来说,如果线程A输出的是11,33,55,而线程B输出的是44,22,那么你可能看到以下的结果:

11 33 55 44 22

44 22 11 33 55

11 44 33 22 55

......

我们假设单个数的输出是不会被打断的(这个性质往往称为“原子操作”),你不必担心两个数被同时输出从而混合成一个新的数。换言之,如果A输出x个数而B输出y个数,你最后一定会得到这x+y个数,只是顺序不确定。

特别的,某个线程的输出可能是空,你需要考虑到这一点。

现在你得到了最终的输出,你需要反推出哪些数来自于线程A而哪些数来自于线程B。由于可能有多种情况,我们只要求你输出方案数对1000000007取模的结果。

Input

第一行一个正整数T,表示测试数据组数。

接下来T行,每行描述一组测试数据:

第一个整数n,表示最终的输出包含n个整数

接下来n个整数ci,表示最终的输出。

这些整数两两不同。

Output

共T行,每行一个整数,表示可能的情况数。

特别的,如果无解,你需要输出一个0。

HINT

对于100%的数据,1<=T<=10。

对于20%的数据,n<=20。

对于50%的数据,n<=1000。

对于80%的数据,n<=50000。

对于100%的数据,0<=n<=500000。

对于100%的数据,ci的绝对值不超过2000000000,且同一组数据内ci两两不同。


正解在我这种菜的人来说简直不可做,我大概也说不清楚...

谈一下想法好了。这种类型的题本质是在挖掘状态中间的特殊性,就像莫名其妙看出这个是凸的一样,这个题可以发现一些状态在区间上连续,一些转移在值域上单调,然后通过势能均摊分析,可以得到非常玄妙的复杂度。这种题现在我反正是做不来的,就慢慢见识见识吧。


Code:

#include <cstdio>
const int N=5e5+10;
const int inf=0x7fffffff,mod=1e9+7;
struct node
{
int val,cnt;
node(){}
node(int val,int cnt){this->val=val,this->cnt=cnt;}
}s0[N],s1[N];
int T,n,a[N],tot0,tot1;
int main()
{
scanf("%d",&T);
while(T--)
{
int sum0=1,sum1=1;
scanf("%d",&n);
if(!n) {puts("1");continue;}
for(int i=1;i<=n;i++) scanf("%d",a+i);
s0[tot0=0]=node(inf,1);//增
s1[tot1=0]=node(-inf,1);
for(int i=2;i<=n;i++)
if(a[i]>a[i-1])//得把那个s1推了
{
int t0=a[i]>s1[0].val?s1[0].cnt:0;
int t1=a[i]<s0[0].val?s0[0].cnt:0;
while(tot1) (t0+=a[i]>s1[tot1].val?s1[tot1].cnt:0)%=mod,--tot1;
s0[++tot0]=node(a[i-1],t0);
s1[tot1=0]=node(a[i-1],t1);
(sum0+=t0)%=mod,sum1=t1;
}
else
{
int t0=a[i]>s1[0].val?s1[0].cnt:0;
int t1=a[i]<s0[0].val?s0[0].cnt:0;
while(tot0) (t1+=a[i]<s0[tot0].val?s0[tot0].cnt:0)%=mod,--tot0;
s0[tot0=0]=node(a[i-1],t0);
s1[++tot1]=node(a[i-1],t1);
sum0=t0,(sum1+=t1)%=mod;
}
printf("%d\n",(sum0+sum1)%mod);
}
return 0;
}

2019.1.1

Problem C: 多线程 解题报告的更多相关文章

  1. ZOJ Problem Set - 1025解题报告

    ZOJ Problem Set - 1025 题目分类:基础题 原题地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=10 ...

  2. ACM: A Simple Problem with Integers 解题报告-线段树

    A Simple Problem with Integers Time Limit:5000MS Memory Limit:131072KB 64bit IO Format:%lld & %l ...

  3. BestCoder18 1002.Math Problem(hdu 5105) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5105 题目意思:给出一个6个实数:a, b, c, d, l, r.通过在[l, r]中取数 x,使得 ...

  4. Problem - 433C - Codeforces解题报告

    对于这题本人刚开始的时候的想法是:先把最大两数差的位置找到然后merge计算一个值再与一连串相同的数做merge后计算一个值比较取最大值输出:可提交后发现不对,于是本人就搜了一下正解发现原来这题的正确 ...

  5. Problem A: 选举 解题报告

    Problem A: 选举 题意 给出一个投票过程.有\(n\)个选民和\(m\)个候选人,每个选民\(i\)有个不重且有序的可投集合\(\{a_i\}\). 对于第一轮投票,选民\(i\)会投给\( ...

  6. Problem A: 种树 解题报告

    Problem A: 种树 Description 很久很久以前,一个蒟蒻种了一棵会提问的树,树有\(n\)个节点,每个节点有一个权值,现在树给出\(m\)组询问,每次询问两个值:树上一组点对\((x ...

  7. Problem A: 踢罐子 解题报告

    Problem A: 踢罐子 Description 平面上有\(n\)个点,其中任意2点不重合,任意3点不共线. 我们等概率地选取一个点A,再在剩下的\(n-1\)个点中等概率地选取一个点B,再在剩 ...

  8. Problem B: 专家系统 解题报告

    Problem B: 专家系统 Description 一个专家系统是指,你雇佣了\(n\)个专家,他们每个人会做出一个结果,然后你从中选取较多的专家的结果组合而成最终的结果.专家系统广泛应用于传统机 ...

  9. Problem C Dist 解题报告

    Problem C Dist Description 有一个\(n\)个点带边权的连通无向图,边集用\(k\)个集合\(s_1,s_2,\dots,s_k\)和\(k\)个整数\(w_1,w_2,\d ...

随机推荐

  1. mysql事务,select for update,及数据的一致性处理

    在MySQL的InnoDB中,预设的Tansaction isolation level 为REPEATABLE READ(可重读) 在SELECT 的读取锁定主要分为两种方式: SELECT ... ...

  2. 20155331《网络对抗》Exp7 网络欺诈防范

    20155331<网络对抗>Exp7 网络欺诈防范 实验内容 本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法.具体实践有: 简单应用SET工具建立冒名网站 et ...

  3. python 井字棋(Tic Tac Toe)

    说明 用python实现了井字棋,整个框架是本人自己构思的,自认为比较满意.另外,90%+的代码也是本人逐字逐句敲的. minimax算法还没完全理解,所以参考了这里的代码,并作了修改. 特点 可以选 ...

  4. webVR全景图多种方案实现(pannellum,aframe,Krpano,three,jquery-vrview)

    前言 有一篇文章我说了H5实现全景图预览,全景视频播放的原理,有需要的小伙伴可以自行去看一下 今天我就拿出我的实践干货出来,本人实测实测过 需求 老板:我需要可以上传全景图片,然后手机网站上都可以36 ...

  5. JavaScript快速入门-简介

    一.JavaScript历史(摘自w3school) JavaScript 是因特网上最流行的脚本语言,它存在于全世界所有 Web 浏览器中,能够增强用户与 Web 站点和 Web 应用程序之间的交互 ...

  6. 01-docker简介

    如今Docker的使用已经非常普遍,特别在一线互联网公司.使用Docker技术可以帮助企业快速水平扩展服务,从而到达弹性部署业务的能力.在云服务概念兴起之后,Docker的使用场景和范围进一步发展,如 ...

  7. Vigenere加密

    Vigenere加密法原理很简单,实现起来也不难.与普通的单码加密法不同,明文经过加密之后,每个字母出现的频率就不会有高峰和低峰. 密钥中字母代表行和明文中的字母代表行.在vigenere表中找到对应 ...

  8. Beta阶段事后分析

    1. 设想和目标 1.1 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们在Beta阶段任务主要分为两部分,一类是对原功能的扩展,一类是新的博文功能.我们通过规 ...

  9. PAT甲题题解-1036. Boys vs Girls (25)-找最大最小,大水题

    题意:给出n个人的姓名.性别.ID.分数,让你找出其中哪个妹纸分数最高.哪个汉子分数最低.以及他们的差如果没有妹纸或者汉子,则对应输出Absent,差用NA代替. 就是for一遍找最大最小值,水题 # ...

  10. Linux内核分析——第二周学习笔记

    20135313吴子怡.北京电子科技学院 chapter 1 知识点梳理 (一)计算机是如何工作的?(总结)——三个法宝 ①存储程序计算机工作模型,计算机系统最最基础性的逻辑结构: ②函数调用堆栈,高 ...