#
  用  户  名  公园 计划 抽卡   总分 
19
859乔屹 100

03:15:05
40

03:14:01
  140

03:15:05

emm

怎么讲

  T2我把自己优化掉了40分

优化前:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define cin(a) scanf("%d",&a)
using namespace std;
const int maxn=1e5+5;
int dui[maxn],siz,now,last;
int a[maxn];
int m,n,qu;
int ri[maxn];
int len[maxn];
int sum[maxn];
long long ans[maxn];
struct node{
int l,r,k;
}t[maxn];
__attribute((always_inline))int h233(const node &a,const node &b)
{return a.r==b.r?a.l<b.l:a.r<b.r;}
int main()
{
// freopen("ans.in","r",stdin);
// freopen("a.out","w",stdout);
cin(n),cin(m),cin(qu);
for(int q=1;q<=n;q++)
cin>>a[q];
for(int q=1;q<=n;q++)
{
while(siz<m&&now<n)
{
++now;
if(!dui[a[now]])
++siz;
++dui[a[now]];
}
if(siz>=m)
ri[q]=now;
else
{
last=q;
break;
}
dui[a[q]]--;
if(!dui[a[q]])
--siz;
}
/*for(int q=1;q<=last;q++)
cout<<ri[q]<<" ";
cout<<endl;*/
/*for(int q=1;q<=qu;q++)
{
cin(t[q].l),cin(t[q].r),t[q].k=q;
}
sort(t+1,t+qu+1,h233);*/
/*for(int q=1;q<=qu;q++)
cout<<t[q].l<<" "<<t[q].r<<endl;*/
for(int q=1,x,y;q<=qu;q++)
{
cin(x),cin(y);
long long ans=0;
for(int w=x;w<=y;w++)
{
//cout<<w<<" "<<y<<" "<<(ri[w]+y-2*w)*(y-ri[w]+1)/2<<endl;
ans+=max(0,(ri[w]+y-2*w)*(y-ri[w]+1)/2);
}
cout<<ans<<endl;
}
/*
int tmp=0;
for(int q=1;q<=qu;q++)
{
if(tmp==t[q].r)
ans[t[q].k]=sum[t[q].l];
else
{
//cout<<t[q].l<<" "<<t[q].r<<endl;
sum[t[q].r+1]=0;
for(int w=t[q].r;w>=t[q].l;w--)
sum[w]=sum[w+1]+max(0,(ri[w]+t[q].r-2*w)*(t[q].r-ri[w]+1)/2);
tmp=t[q].r;
ans[t[q].k]=sum[t[q].l];
for(int w=t[q].l;w<=t[q].r;w++)
cout<<sum[w]<<" ";
cout<<endl<<endl;
}
}*/
/*for(int q=1;q<=qu;q++)
cout<<ans[q]<<endl;*/
}

 显然是$\Theta (n+qn)$的

 $n\leq10000$,$q\leq10000$

 时限2s

 可以过的对吧

 然而我忘了时限是2s

 强行玄学优化:

 

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define cin(a) scanf("%d",&a)
using namespace std;
const int maxn=1e5+5;
int dui[maxn],siz,now,last;
int a[maxn];
int m,n,qu;
int ri[maxn];
int len[maxn];
int sum[maxn];
long long ans[maxn];
struct node{
int l,r,k;
}t[maxn];
__attribute((always_inline))int h233(const node &a,const node &b)
{return a.r==b.r?a.l<b.l:a.r<b.r;}
int main()
{
// freopen("ans.in","r",stdin);
// freopen("a.out","w",stdout);
cin(n),cin(m),cin(qu);
for(int q=1;q<=n;q++)
cin>>a[q];
for(int q=1;q<=n;q++)
{
while(siz<m&&now<n)
{
++now;
if(!dui[a[now]])
++siz;
++dui[a[now]];
}
if(siz>=m)
ri[q]=now;
else
{
last=q;
break;
}
dui[a[q]]--;
if(!dui[a[q]])
--siz;
}
/*for(int q=1;q<=last;q++)
cout<<ri[q]<<" ";
cout<<endl;*/
for(int q=1;q<=qu;q++)
{
cin(t[q].l),cin(t[q].r),t[q].k=q;
}
sort(t+1,t+qu+1,h233);
/*for(int q=1;q<=qu;q++)
cout<<t[q].l<<" "<<t[q].r<<endl;*/
/*for(int q=1,x,y;q<=qu;q++)
{
cin(x),cin(y);
long long ans=0;
for(int w=x;w<=y;w++)
{
//cout<<w<<" "<<y<<" "<<(ri[w]+y-2*w)*(y-ri[w]+1)/2<<endl;
ans+=max(0,(ri[w]+y-2*w)*(y-ri[w]+1)/2);
}
cout<<ans<<endl;
}*/
int tmp=0;
for(int q=1;q<=qu;q++)
{
if(tmp==t[q].r)
ans[t[q].k]=sum[t[q].l];
else
{
//cout<<t[q].l<<" "<<t[q].r<<endl;
sum[t[q].r+1]=0;
for(int w=t[q].r;w>=t[q].l;w--)
sum[w]=sum[w+1]+max(0,(ri[w]+t[q].r-2*w)*(t[q].r-ri[w]+1)/2);
tmp=t[q].r;
ans[t[q].k]=sum[t[q].l];
/*for(int w=t[q].l;w<=t[q].r;w++)
cout<<sum[w]<<" ";
cout<<endl<<endl;*/
}
}
for(int q=1;q<=qu;q++)
cout<<ans[q]<<endl;
}

 于是WA40了

 以此铭记:

在打题之前,我们一定要看清时限

 以上

exam9.3的更多相关文章

  1. exam9.6&&7

    emmm 改题稍紧张,以后几篇并一起写 9.6 (前十并没有参加本次考试) 于是我就rank8了 一道题一道题来 先说T1: 显然是一个高精度GCD,于是打算用计算器算一下时间复杂度 众所周知gcd是 ...

  2. 【Mysql优化】索引覆盖

    索引覆盖 是指 如果查询的列恰好是索引的一部分,那么查询只需要在索引文件上进行,不需要回行到磁盘再找数据.这种查询速度非常快,称为”索引覆盖”,比平时的查询少一次到磁盘读数据的操作.(索引正好覆盖到查 ...

  3. 【Mysql优化】索引碎片与维护

    在长期的数据更改过程中, 索引文件和数据文件,都将产生空洞,形成碎片.(不停的删除修改导致) 解决办法: (1)我们可以通过一个nop操作(不产生对数据实质影响的操作), 来修改表. 比如: 表的引擎 ...

  4. MySQL导出数据库、数据库表结构、存储过程及函数【用】

    一.导出数据库 我的mysql安装目录是D:\Program Files\MySQL\MySQL Server 5.5\bin\,导出文件预计放在D:\sql\ 在mysql的安装目录执行命令: my ...

  5. 【存储过程】MySQL存储过程/存储过程与自定义函数的区别

    ---------------------------存储过程-------------------- 语法: 创建存储过程: CREATE [definer = {user|current_user ...

随机推荐

  1. C语言下进制的使用

    进制规则 十进制 以正常数字1-9开头,如123 八进制 以数字0开头,如0123 十六进制 以0x开头,如0X123 二进制 C语言不能直接书写二进制数 案例如下 int main() { int ...

  2. WEB学习路线2019完整版(附视频教程+网盘下载地址)

    WEB学习路线2019完整版(附视频教程+网盘下载地址).适合初学者的最新WEB前端学习路线汇总! 在当下来说web前端开发工程师可谓是高福利.高薪水的职业了.所以现在学习web前端开发的技术人员也是 ...

  3. Java CountDownLatch应用

    Java的concurrent包里面的CountDownLatch其实可以把它看作一个计数器,只不过这个计数器的操作是原子操作,同时只能有一个线程去操作这个计数器,也就是同时只能有一个线程去减这个计数 ...

  4. 括号匹配问题 —— Deque双端队列解法

    题目: 给定一个只包括 '(',')','{','}','[',']'?的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合.左括号必须以正确的顺序闭合.注意空字符串可 ...

  5. 将double转化成string,并保持N位小数

    double dumpSize = (1024000000.1415926535897932384 * 1.0) / 1024 / 1024; string tempStr = to_string(d ...

  6. C++报错:error C3874

    解决: 1.class 定义之后不要忘记分号 2.主函数写为int main() { }

  7. 3_PHP表达式_4_PHP运算符

    以下为学习孔祥盛主编的<PHP编程基础与实例教程>(第二版)所做的笔记. 3.4.1 算术运算符 <?php $num1 = -10; $num2 = -4; $num3 = $nu ...

  8. Django_rest_framework分页

    分页基本流程及配置 1.基于LimitOffsetPagination做分页,根据配置 from rest_framework.pagination import LimitOffsetPaginat ...

  9. 【转载】 C#使用string.Join快速用特定字符串串联起数组

    在C#中有时候我们的数组元素需要通过一些特定的字符串串联起来,例如将整形Int数组通过逗号快速串联起来成为一个字符串,可以使用String.Join方法.或者一个字符串string类型数组所有元素快速 ...

  10. Google的三大马车

    Google的三大马车Google fs + Map Reduce + Big Table 开源Java实现HDFS Hadoop Hbase 云盘实现用廉价的服务器提供与万级的数据库存储①廉价的服务 ...