SSLOJ 1298.网站计划

题目

题目描述

     Tyvj的Admin--zhq同学将在寒假开始实行Tyvj new web计划,把Tyvj打造成为中国一流的信息学在线评测系统。Tyvj的new web计划里一共有n项,编号1~n,每项的重要度为v[i],Admin—zhq同学共工作m次,第j次从编号为l[j]~r[j]的项目里选择重要度最大的一项任务完成,所获得的进展量为(l[j]+r[j])*该任务的重要度。完成该任务后该任务的重要度变为0。请问Admin在工作m次后可以有多少进展量呢?
注:数据保证初始情况下所有任务的重要度不同。

输入

第一行为n,m 
第二行n个整数v[i]。 
接下来m行,每行两个整数l,r,表示Admin这一次将会从编号为l~r的项目里选择(包括l,r)重要度最大的来完成。 

输出

最终的进展量。由于结果可能会比较大,你只需要输出mod2011之后的结果即可。

输入样例复制

5 3
1 2 3 4 5
1 3
2 3
1 5

输出样例复制

52

说明

对于50%的数据,1<=n,m<=1000 
对于100%的数据,1<=n,m<=200000,1<=L<=r<=n,1<=v[i]<=100000 

 

分析

  •      一个线段树+单点修改+区间查询

代码

 1 #include<iostream>
 2 #include<cstdio>
 3 #define ll long long
 4 using namespace std;
 5 struct sb
 6 {
 7     ll l,r,num,id;
 8 }t[1000001];
 9 ll n,m;
10 ll maxx,wz;
11 inline long long read()
12 {
13     char c;int d=1;long long f=0;
14     while(c=getchar(),!isdigit(c))if(c==45)d=-1;f=(f<<3)+(f<<1)+c-48;
15     while(c=getchar(),isdigit(c)) f=(f<<3)+(f<<1)+c-48;
16     return d*f;
17 }
18 void up(ll k)    //比较区间最大值
19 {
20     if (t[k*2].num>t[k*2+1].num)
21     {
22         t[k].num=t[k*2].num;
23         t[k].id=t[k*2].id;
24     }
25     else
26     {
27         t[k].num=t[k*2+1].num;
28         t[k].id=t[k*2+1].id;
29     }
30     return;
31 }
32 void build(ll a,ll b,ll k)  //建树
33 {
34     t[k].l=a; t[k].r=b;
35     if (a==b)
36     {
37         t[k].num=read();
38         t[k].id=t[k].l;
39         return;
40     }
41     ll mid=(a+b)/2;
42     build(a,mid,2*k);
43     build(mid+1,b,2*k+1);
44     up(k);
45 }
46 void find(ll a,ll b,ll k)    //查找
47 {
48     if (t[k].l==a&&t[k].r==b)
49     {
50         if (t[k].num>maxx)
51         {
52             maxx=t[k].num;
53             wz=t[k].id;
54         }
55         return;
56     }
57     ll mid=(t[k].l+t[k].r)/2;
58     if (b<=mid) find(a,b,k*2);
59     else if (a>mid) find(a,b,k*2+1);
60     else {
61         find(a,mid,k*2);
62         find(mid+1,b,k*2+1);
63     }
64 }
65 void change(ll wz,ll k)  //修改值
66 {
67     if (t[k].l==t[k].r)
68     {
69         t[k].num=0;
70         t[k].id=0;
71         return;
72     }
73     ll mid=(t[k].l+t[k].r)/2;
74     if (mid>=wz) change(wz,k*2);
75     else if (mid<wz) change(wz,k*2+1);
76     up(k);
77 }
78 int main ()
79 {
80     cin>>n>>m;
81     build(1,n,1);
82     ll ans=0;
83     for (ll i=1,x,y;i<=m;i++)
84     {
85         x=read();
86         y=read();
87         maxx=0;wz;
88         find(x,y,1);
89         change(wz,1);
90         ans+=(x+y)*maxx;
91         ans%=2011;
92     }
93     cout<<ans;
94 }

 

猜你喜欢

转载自www.cnblogs.com/zjzjzj/p/10461400.html