【stoi】2010 国王

测评的一天...

放道学校测评(stoi2010某题)题解吧...

嗯,就是这么无聊...

这是T3...

(嗯,T2的高精度和T4的拓扑排序我都不会)...

题目:

网址:没有...

大意:区间加法,求各个数

嗯,看到区间,又是T3,肯定是线段树...

再看数据范围——

...

线段树便开始打了起来...

其实也只是区间求和...

思路:线段树区间加法,然后输出时全部扫一遍,遇到根结点输出

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 int sum[800000]={0},add[800000]={0};//嗯,数组开大些
 5 void xiugai(int rt){
 6     sum[rt]=sum[rt*2]+sum[rt*2+1];
 7 }
 8 void biaoji(int l,int r,int rt){
 9     if(add[rt]){
10         add[rt*2]+=add[rt];
11         add[rt*2+1]+=add[rt];
12         sum[rt*2]+=add[rt]*l;
13         sum[rt*2+1]+=add[rt]*r;
14         add[rt]=0;
15     }
16 }
17 void jia(int x,int y,int c,int l,int r,int rt){
18     if(x<=l&&r<=y){
19         sum[rt]+=(r-l+1)*c;
20         add[rt]+=c;
21         return ;
22     }
23     int m=(l+r)/2;
24     if(x<=m)jia(x,y,c,l,m,rt*2);
25     if(m<y)jia(x,y,c,m+1,r,rt*2+1);
26     xiugai(rt);
27 }
28 void out(int l,int r,int rt){
29     if(l==r){//根结点
30         printf("%d ",sum[rt]);
31         return ;
32     }
33     int m=(l+r)/2;
34     biaoji(l-m+1,r-m,rt);
35     out(l,m,rt*2);
36     out(m+1,r,rt*2+1);
37 }
38 int main(){
39     int n,m,b,c,cc,ccc;
40     scanf("%d%d",&n,&m);
41     for(b=0;b<m;b++){
42         scanf("%d%d%d",&c,&cc,&ccc);//区间加法
43         jia(c,cc,ccc,1,n,1);
44     }
45     out(1,n,1);//访问各个根结点逐个输出
46 }

king

就这样提交上去了...

嗯,A了...

线段树裸题...

然而正解...

是另外一种神奇解法...

有点前缀和思想...

copy一下解题报告——

说到二重过不了,然而还能捞60分...

其实主要思路就是前缀和...

学老师一样画张图吧(当然不会手画)...

首先呢,整个序列都是0

假设下n=5,m=2

第一次增加,1~3加上1,那么根据报告的解法,a[1]+=1,a[4]-=1,也就是得到了那一段序列,而在之后的操作中,是第n个数=第n-1个数+a[n](前缀和思想),因此就现在而论,第1个数是1,第2个数=第(2-1=)1个数+a[2](=0)=1,以此类推,第三个数也会是1,而第4个数a[4]=-1,因此到了第4个数,就会=第(4-1=)3个数+a[4](-1)=0,所以第4个数就是0,第5个数也就会等于0(然而这都是针对第一次增加而言)

第二次增加,3~5加上2,那么还是a[3]+=2,a[6]-=2,因为第6个数不会弄到,因此不用管它,这样的话,就又是一段数列

最后,a[n]=a[n-1]+a[n],用sum代替a[n-1]...

来一重循环,一开始sum=0,a[1]=1,因此第一个数就是1,a[2]=0,因此第二个数也是1,a[3]=2,因此sum+=a[3],所以第三个数等于3,紧接着-1,+0,也就得到了最后的答案1 1 3 2 2

神奇解法的代码——

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 int main(){
 5     int n,m,b,c,cc,ccc,sum=0,a[100001]={0};
 6     scanf("%d%d",&n,&m);
 7     for(b=0;b<m;b++){
 8         scanf("%d%d%d",&c,&cc,&ccc);
 9         a[c]+=ccc;
10         a[cc+1]-=ccc;
11     }
12     for(b=1;b<=n;b++){
13         sum+=a[b];
14         printf("%d ",sum);
15     }
16 }

king

嗯,和我又臭又长的代码形成强烈反差对比...

至于其他解法,嗯,本jr都不会...

又水了一篇博客...

时间: 2024-10-11 20:55:04

【stoi】2010 国王的相关文章

计蒜客NOIP模拟赛(3)D1T3 任性的国王

X 国的地图可以被看作一个两行 nn 列的网格状图.现在 X 国需要修建铁路,然而该国的国王非常小气,他只想保证位于某两列之间的所有城市互相可以到达就行了,在此基础上,他希望所花费的代价最小. 铁路可以建在任何两个相邻的点之间,使他们可以互相到达.可以作为工作人员,你已经整理出了为每一对相邻城市架设铁路所需要的花费.你需要准备好回答国王如下形式的问题. 对于 (i,j)(i,j):当前情况下,使第 ii 列到第 jj 列之间的所有城市连通的最小代价是多少(列下标从 11 开始)?注意不能用其他列

部署FIM 2010 R2&mdash;&mdash;6安装和配置PCNS

部署FIM 2010 R2--6安装和配置PCNS 在所有域控安装安装PCNS 1. 如果第一次安装PSNS需要扩展构架,如果之前安装过PCNS,略过此步骤,扩展构建需要在CMD进入PCNS安装目录中运行"Password Change Notification Service.msi" SCHEMAONLY=TRUE 下载PCNS安装包,首先在每台DC上扩展架构, msiexec /i "C:\Users\Administrator\Desktop\Password Cha

部署FIM 2010 R2&mdash;5配置Synchronization Service

部署FIM 2010 R2-配置Synchronization Service 配置多有域环境账户密码同步 在各个域创建ADMA账户,并赋予对域的复制目录更改和复制目录更改所有项权限:和对用户的密码重置和解锁密码权限: 在fim01所使用的DNS服务器上,建立同步密码目标域的DNS条件转发:并测试能正常解析目标域: 确保fim01到目标域的域控制器的TCP和UDP端口389.88.464能双向正常通信: 1.打开Synchronization Service窗口, 2.选择Management

部署FIM 2010 R2&mdash;4安装FIM 2010 R2 Synchronization Service

部署FIM 2010 R2-4安装FIM 2010 R2 Synchronization Service 1.打开FIM2010 R2安装控制台,选择"Install Synchronization Service" 2.选择"下一步", 同意许可,选择"下一步", 保持默认, 3.为FIM同步服务指定数据库和实例, 4.为FIM同步服务指定服务账户,如下图,(注:Domain必须写为contoso,而不是contoso.com) 5.使用默认组

部署FIM 2010 R2&mdash;3安装FIM 2010 R2 Service and Portal

部署FIM 2010 R2-3安装FIM 2010 R2 Service and Portal 1.打开FIMSplash文件,如下图, 选择"Install Service and Portal", 2.选择"下一步", 选择"下一步", 选择"下一步", 3.选择要安装的角色,这里我们全部安装, 4.为FIM服务器指定SQL 2008数据库服务器名称以及FIM数据库名称,这里使用本地数据库服务,数据库名称使用默认名称, 5

部署FIM 2010 R2&mdash;2服务账号和其他准备

部署FIM 2010 R2-2服务账号和其他准备 Create an e-mail-enabled domain service account to run the FIM Service component. 为fimmail账号启用邮箱, 2. Create a domain service account to run the FIM Synchronization Service. 3. Create a FIM Service Management Agent account. 4.

部署FIM 2010 R2&mdash;1先决条件准备

下面的章节中,我们主要介绍FIM2010 R2在俩个林之间进行密码同步,完美的解决了互联网公司内网开发环境和外网办公环境回来修改密码的问题. 为互联网公司IT环境带来很大的便捷,大大节省了IT管理的成本,提高了IT人员的工作效率和公司网络环境的安全性! 环境介绍: Contoso DC: 10.0.0.1 Contoso Client: 10.0.0.250 Zyliday DC: 20.0.0.1 Zyliday Client: 20.0.0.3 FIM 2010 R2: 10.0.0.29

Exchange 2016集成ADRMS系列-12:域内outlook 2010客户端测试

接下来,我们来到域内安装了office 2010的机器上进行测试. 首先我们在客户端上强制刷新组策略,把我们刚才设置的策略刷新下来. 然后我们可以运行gpresult /h result.html来看看策略是不是已经下来了. 策略下来之后,我们打开客户端上面的outlook 2010,然后查看一下,可以看到默认已经可以使用RMS的权限模板了.

Lesson9 Exchange 2010 Management Skills

Lesson9 Exchange 2010 Management Skills 1-安装 安装好先决条件容易遗漏的一件事: 下面这个服务一定要改为自动 2-委派安装 从第二台Exchange 2010服务器开始,管理员就可以将域用户添加到delegated setup组中,委派域用户完成 Exchange 2010 的部署 委派组: 先在第一台 exchangerun下面的命令 就是让第二台exchange server加入到组织中 回到第二台exchange server上安装exchange