noj 2068 爱魔法的露露 [线性扫一遍]


njczy2010

2068

Accepted

325MS

  8052K

1450Byte

G++

2014-11-13 11:20:40.0

爱魔法的露露

时间限制(普通/Java) : 1200 MS/ 4000 MS          运行内存限制 : 65536 KByte
总提交 : 47            测试通过 : 3

描述

仙灵女巫露露,对于魔法的热忱可是超出常人,要是发现了什么上古遗留下的魔法,她总是想方设法地获得,然后研究分析。而最近,他又从邪恶小法师维嘉那里获得了一个“奇怪”的魔法卷轴;

这个魔法卷轴上有一大串数字,而且根据卷轴上的描述,这个魔法的威力指数来自于这一串数字中“魔法区间”的数量;

所谓“魔法区间”指的是一段连续的闭区间,且这段区间上的所有数字均不相同;

现在,露露想知道这个魔法的威力指数,你能帮帮她么?

输入

先输入一个正整数T,表示样例个数,1≤T≤10。

对于每一个样例,先输入一个正整数n,表示卷轴上的数字个数(1≤n≤106);

再输入n个整数,第i个数ai,表示卷轴上第i个数(0≤ai≤106)。

输出

对于每个样例,输出一个正整数,即威力指数。

题目保证结果在int范围内。

样例输入

1
3
1 2 3

样例输出

6

提示

  1. 读入数据请使用 scanf();
  2. 对于样例,共有{1},{2},{3},{1,2},{2,3},{1,2,3},6个魔法区间,所以威力为6。

题目来源

yuman

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<string>
 6 #include<iostream>
 7 #include<set>
 8 #define maxi(a,b) (a)>(b)?(a):(b)
 9 #define mini(a,b) (a)<(b)?(a):(b)
10 #define N 1000005
11 #define mod 10000
12 #define ll long long
13
14 using namespace std;
15
16 int T;
17 int tot;
18 set<int> s;
19 int a[N];
20 int n;
21 int vis[N];
22
23 void ini()
24 {
25     int i;
26     tot=0;
27     //s.clear();
28     scanf("%d",&n);
29     for(i=1;i<=n;i++){
30         scanf("%d",&a[i]);
31     }
32     memset(vis,0,sizeof(vis));
33 }
34
35 void solve()
36 {
37     int i,j;
38     i=1;j=1;
39     for(j=1;j<=n;j++){
40        // if(s.find(a[j])==s.end()){
41         if(vis[ a[j] ]==0){
42             vis[ a[j] ]++;
43         }
44         else{
45             //j--;
46             break;
47         }
48     }
49    // tot+=j-i+1;
50     while(i<=n)
51     {
52         //s.erase(a[i]);
53         vis[ a[i] ]--;
54         tot+=j-i;
55         //printf(" i=%d j=%d tot=%d\n",i,j,tot);
56         i++;
57         for(;j<=n;j++){
58            // if(s.find(a[j])==s.end()){
59             if(vis[ a[j] ]==0){
60                 vis[ a[j] ]++;
61             }
62             else{
63                 //j--;
64                 break;
65             }
66         }
67     }
68 }
69
70 void out()
71 {
72     printf("%d\n",tot);
73 }
74
75 int main()
76 {
77    // freopen("data.in","r",stdin);
78     scanf("%d",&T);
79     while(T--)
80    // while(scanf("%I64d",&n)!=EOF)
81     {
82         ini();
83         solve();
84         out();
85     }
86     return 0;
87 }
时间: 2024-10-18 18:28:11

noj 2068 爱魔法的露露 [线性扫一遍]的相关文章

【极角排序+双指针线性扫】2017多校训练七 HDU 6127 Hard challenge

acm.hdu.edu.cn/showproblem.php?pid=6127 [题意] 给定平面直角坐标系中的n个点,这n个点每个点都有一个点权 这n个点两两可以连乘一条线段,定义每条线段的权值为线段两端点点权的乘积 现在要过原点作一条直线,要求这条直线不经过任意一个给定的点 在所有n个点两两连成的线段中,计算与这条直线有交点的线段的权值和 最大化这个权值和并输出 题目保证,给定的n个点不重合且任意两个点的连线不经过原点 [思路] 一条经过原点的直线把n个点分成两个半平面A,B 假设A中的点权

53.Maximum Subarray(法1线性扫面法2分治法)

Find the contiguous subarray within an array (containing at least onenumber) which has the largest sum. For example, given the array [?2,1,?3,4,?1,2,1,?5,4], the contiguous subarray [4,?1,2,1] has thelargest sum = 6. click to showmore practice. HideT

HDU5056 BoringCount--线性扫一遍

11754936 2014-09-29 10:08:45 Accepted 5056 31MS 392K 1257 B G++ czy 好简单的思路,怎么就没想到呢..... Boring count Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 250    Accepted Submission(s): 98 Problem De

计蒜客 教科书般的亵渎

Description: 环境里有 nn 个怪物,他们的生命值用一个正整数表示.现在,你可以使用两种魔法,对怪物进行攻击.当怪物的生命值小于等于 00 时,他便被消灭了. 魔法箭,对摸个生物造成 kk 点伤害,对一个生物最多使用一次,但没有使用次数限制. 亵渎,对所有生物造成一点伤害,如果杀死了某个生物,则继续自动重新使用该法术.只能主动使用一次,且必须最后使用. 请问,最多能消灭多少个怪物?亵渎法术最多能释放几次? Input: 第一行两个整数 nn 和 kk ,表示怪物的数量和法术的伤害.第

关于基础DP

openjudge  8464 这道题其实很简单,算是DP的基础题,比较适合开拓DP思维. 题目比较有欺骗性,其实稍微想想就可以解决,因为题意说第一次卖出后才能买入,所以我们可以考虑枚举断点,所以题目一下变得简单,我们线性扫两遍,算最大值就好了. 具体为: 由于不能同时进行两次交易,所以枚举断点,一遍扫做1到n的前n个的最大值,由于最大值一定是单调递增的,所以每次读入新的a[i],判断是否有更优解就好了,同理,一遍扫n到1的后n个的最大值,做同样的事,然后枚举断点取最大值. 代码如下: 1 #i

CodeForces - 204C Little Elephant and Furik and Rubik

CodeForces - 204C Little Elephant and Furik and Rubik 个人感觉是很好的一道题 这道题乍一看我们无从下手,那我们就先想想怎么打暴力 暴力还不简单?枚举所有字串,再枚举所有位置,算出所有答案不就行了 我们自然不能无脑暴力,但是暴力可以给我们启发 我们知道所有对答案做出贡献的字符一定是相同的(废话) 所以我们可以O(n^2)首先枚举两个字符串中相同的字符然后再考虑如何贡献 然后计算出所有的方案下的值,再除以n*(n+1)*(2*n+1)/6 [不知

青云的机房组网方案(简单+普通+困难)(虚树+树形DP+容斥)

题目链接 1.对于简单的版本n<=500, ai<=50 直接暴力枚举两个点x,y,dfs求x与y的距离. 2.对于普通难度n<=10000,ai<=500 普通难度解法挺多 第一种,树形dp+LCA 比赛的时候,我猜测对于不为1的n个数,其中两两互质的对数不会很多,肯定达不到n^2 然后找出所有互质的对数,然后对为1的数进行特殊处理.(初略的估计了下,小于500的大概有50个质数,将n个数平均分到这些数中,最后大概有10000*50*200=10^7) 对所有的非1质数对,采用离

1686 第K大区间

1686 第K大区间 时间限制:1 秒 空间限制:131072 KB 定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. 众数(统计学/数学名词)_百度百科 Input 第一行两个数n和k(1<=n<=100000,k<=n*(n-1)/2) 第二行n个数,0<=每个数<2^31 Output 一个数表示答案. Input示例 4 2 1 2 3 2 Output示例 2思路:二分答案t,统计众数出现次数大于等于t的区间有多少个. 枚

17.2.10 NOIP模拟赛 聪哥的工资

聪哥的工资 (money/money.in/money.out) 时限1000ms 内存256MB 题目描述 lwher: 了体验劳苦大众的生活,聪哥在暑假参加了打零工的活动,这个活动分为n个工作日,每个工作日的工资为Vi.有m个结算工钱的时间,聪哥可以自由安排这些时间,也就是说什么时候拿钱,老板说的不算,聪哥才有发言权! (因为聪哥是土豪,他是老板的老板,你觉得老板敢给聪哥安排任务吗?所以聪哥的工作就是看心情去拿钱拿完就走人啦...) 聪哥不喜欢身上一次性有太多的钱,于是他想安排一下拿钱的时间