「SNOI2017」一个简单的询问
「SNOI2017」一个简单的询问
简单的解法
显然可以差分一下。
\]
因为都是1为起始,那么记两个cnt数组,表示前缀,然后可以分成四个区间,莫队。
#include <bits/stdc++.h>
#define rep(q, a, b) for (int q = a, q##_end_ = b; q <= q##_end_; ++q)
#define dep(q, a, b) for (int q = a, q##_end_ = b; q >= q##_end_; --q)
#define mem(a, b) memset(a, b, sizeof a)
#define debug(a) cerr << #a << ' ' << a << "___" << endl
using namespace std;
bool cur1;
char buf[10000000], *p1 = buf, *p2 = buf;
#define Getchar() p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 10000000, stdin), p1 == p2) ? EOF : *p1++
void in(int &r) {
static char c;
r = 0;
while (c = Getchar(), c < 48)
;
do
r = (r << 1) + (r << 3) + (c ^ 48);
while (c = Getchar(), c > 47);
}
const int mn = 50005;
int K, n, val[mn];
long long ans[mn];
struct node {
int l, r, id, ty;
bool operator<(const node &A) const {
return l / K == A.l / K ? (l / K & 1 ? r > A.r : r < A.r) : l / K < A.l / K;
}
} an[mn * 4];
int cnt[mn], cnt1[mn];
long long mid_ans;
bool cur2;
int main() {
// cerr<<(&cur2-&cur1)/1024.0/1024<<endl;
in(n);
K = sqrt(n) + 1;
rep(q, 1, n) in(val[q]);
int Q;
in(Q);
int l, r, l1, r1;
int ct = 0;
rep(q, 1, Q) {
in(l), in(r), in(l1), in(r1);
an[++ct] = { r, r1, q, 1 };
if (l > 1) {
an[++ct] = { l - 1, r1, q, -1 };
if (l1 > 1)
an[++ct] = { l1 - 1, l - 1, q, 1 };
}
if (l1 > 1)
an[++ct] = { l1 - 1, r, q, -1 };
}
sort(an + 1, an + ct + 1);
l = 0, r = 0;
rep(q, 1, ct) {
while (l > an[q].l) mid_ans -= cnt1[val[l]], --cnt[val[l--]];
while (r < an[q].r) mid_ans += cnt[val[++r]], ++cnt1[val[r]];
while (l < an[q].l) mid_ans += cnt1[val[++l]], ++cnt[val[l]];
while (r > an[q].r) mid_ans -= cnt[val[r]], --cnt1[val[r--]];
ans[an[q].id] += mid_ans * an[q].ty;
}
rep(q, 1, Q) printf("%lld\n", ans[q]);
return 0;
}
麻烦的解法
对于两个区间\([l,r],[l1,r1](l \leq l1)\),分三类容斥:
- 没有交
- \([l1,r1]\)被\([l,r]\)包含
- 两个区间相交且没有包含关系
对于1
\([l,r]\)值为K数有x,\([r+1,l1-1]\)值为K数有y,\([l1,r1]\)值为K数有z。
\]
因此可以拆成4个区间计算。
对于2
\([l,l1-1]\)值为K数有x,\([l1,r1]\)值为K数有y,\([r1+1,r]\)值为K数有z。
\]
因此可以拆成4个区间计算。
对于3
\([l,l1-1]\)值为K数有x,\([l1,r]\)值为K数有y,\([r+1,r1]\)值为K数有z。
\]
因此可以拆成4个区间计算。
综上
一遍莫队即可,计算区间中相同数个数的平方的和。
#include<bits/stdc++.h>
#define rep(q,a,b) for(int q=a,q##_end_=b;q<=q##_end_;++q)
#define dep(q,a,b) for(int q=a,q##_end_=b;q>=q##_end_;--q)
#define mem(a,b) memset(a,b,sizeof a )
#define debug(a) cerr<<#a<<' '<<a<<"___"<<endl
using namespace std;
bool cur1;
char buf[10000000],*p1=buf,*p2=buf;
#define Getchar() p1==p2&&(p2=(p1=buf)+fread(buf,1,10000000,stdin),p1==p2)?EOF:*p1++
void in(int &r) {
static char c;
r=0;
while(c=Getchar(),c<48);
do r=(r<<1)+(r<<3)+(c^48);
while(c=Getchar(),c>47);
}
const int mn=50005;
int K,n,val[mn];
long long ans[mn];
struct node{
int l,r,id,ty;
bool operator <(const node &A)const{
return l/K==A.l/K?(l/K&1?r>A.r:r<A.r):l/K<A.l/K;
}
}an[mn*4];
int cnt[mn];
long long mid_ans;
bool cur2;
int main(){
// cerr<<(&cur2-&cur1)/1024.0/1024<<endl;
in(n);
K=sqrt(n)+1;
rep(q,1,n)in(val[q]);
int Q;
in(Q);
int l,r,l1,r1;
int ct=0;
rep(q,1,Q){
in(l),in(r),in(l1),in(r1);
if(l>l1)swap(l,l1),swap(r,r1);
if(r<l1){
an[++ct]={l,r1,q,1};
an[++ct]={l,l1-1,q,-1};
an[++ct]={r+1,r1,q,-1};
if(l1-1>=r+1)an[++ct]={r+1,l1-1,q,1};
}else if(r1<=r){
an[++ct]={l,r1,q,1};
an[++ct]={l1,r,q,1};
if(l<=l1-1)an[++ct]={l,l1-1,q,-1};
if(r1+1<=r)an[++ct]={r1+1,r,q,-1};
}else{
an[++ct]={l,r1,q,1};
an[++ct]={l1,r,q,1};
if(l<=l1-1)an[++ct]={l,l1-1,q,-1};
if(r+1<=r1)an[++ct]={r+1,r1,q,-1};
}
}
sort(an+1,an+ct+1);
mid_ans=1,cnt[val[1]]=1;
l=1,r=1;
rep(q,1,ct){
while(l>an[q].l)--l,mid_ans+=(cnt[val[l]]++)<<1|1;
while(r<an[q].r)++r,mid_ans+=(cnt[val[r]]++)<<1|1;
while(l<an[q].l)mid_ans-=(--cnt[val[l]])<<1|1,++l;
while(r>an[q].r)mid_ans-=(--cnt[val[r]])<<1|1,--r;
ans[an[q].id]+=mid_ans*an[q].ty;
}
rep(q,1,Q)printf("%lld\n",ans[q]>>1);
return 0;
}
「SNOI2017」一个简单的询问的更多相关文章
- loj #2254. 「SNOI2017」一个简单的询问
#2254. 「SNOI2017」一个简单的询问 题目描述 给你一个长度为 NNN 的序列 aia_iai,1≤i≤N1\leq i\leq N1≤i≤N,和 qqq 组询问,每组询问读入 l1 ...
- loj2254 「SNOI2017」一个简单的询问
ref #include <algorithm> #include <iostream> #include <cstdio> #include <cmath& ...
- [SNOI2017]一个简单的询问
[SNOI2017]一个简单的询问 题目大意: 给定一个长度为\(n(n\le50000)\)的序列\(A(1\le A_i\le n)\),定义\(\operatorname{get}(l,r,x) ...
- 【BZOJ5016】[Snoi2017]一个简单的询问 莫队
[BZOJ5016][Snoi2017]一个简单的询问 Description 给你一个长度为N的序列ai,1≤i≤N和q组询问,每组询问读入l1,r1,l2,r2,需输出 get(l,r,x)表示计 ...
- loj #2255. 「SNOI2017」炸弹
#2255. 「SNOI2017」炸弹 题目描述 在一条直线上有 NNN 个炸弹,每个炸弹的坐标是 XiX_iXi,爆炸半径是 RiR_iRi,当一个炸弹爆炸时,如果另一个炸弹所在位置 X ...
- loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点
loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点 链接 loj 思路 用交错关系建出图来,发现可以直接缩点,拓扑统计. 完了吗,不,瓶颈在于边数太多了,线段树优化建图. 细节 ...
- bzoj P5016[Snoi2017]一个简单的询问——solution
Description 给你一个长度为N的序列ai,1≤i≤N和q组询问,每组询问读入l1,r1,l2,r2,需输出 get(l,r,x)表示计算区间[l,r]中,数字x出现了多少次. Input ...
- LOJ——#2256. 「SNOI2017」英雄联盟
https://loj.ac/problem/2256 题目描述 正在上大学的小皮球热爱英雄联盟这款游戏,而且打的很菜,被网友们戏称为「小学生」.现在,小皮球终于受不了网友们的嘲讽,决定变强了,他变强 ...
- bzoj 5016: [Snoi2017]一个简单的询问
Description 给你一个长度为N的序列ai,1≤i≤N和q组询问,每组询问读入l1,r1,l2,r2,需输出 get(l,r,x)表示计算区间[l,r]中,数字x出现了多少次. Input 第 ...
随机推荐
- python学习第一天:window安装python开发环境完整篇
我是跟着廖雪峰老师的的博客来一步一步来进行学习和实践后记录下来的,讲的非常地详细,推荐大家一起学习https://www.liaoxuefeng.com/wiki/0014316089557264a6 ...
- 一文解析Apache Avro数据
摘要:本文将演示如果序列化生成avro数据,并使用FlinkSQL进行解析. 本文分享自华为云社区<[技术分享]Apache Avro数据的序列化.反序列&&FlinkSQL解析 ...
- Java初学者作业——编写Java程序,输入一个数字,实现该数字阶乘的计算。
返回本章节 返回作业目录 需求说明: 编写Java程序,输入一个数字,实现该数字阶乘的计算.一个数字的阶乘是所有小于及等于该数的正整数的积,自然数n的阶乘写作n! .例如,5的阶乘等于1*2*3*4* ...
- 编写Java程序,实现一个简单的echo程序(网络编程TCP实践练习)
首先启动服务端,客户端通过TCP的三次握手与服务端建立连接: 然后,客户端发送一段字符串,服务端收到字符串后,原封不动的发回给客户端. ECHO 程序是网络编程通信交互的一个经典案例,称为回应程序,即 ...
- Notepad++插件Base64编解码
我们平常进行Base64编码需要自己写代码转换, 或者使用其他人编写的小工具程序, 也可以使用在线base64编码工具, 现在我们还可以使用Notepad++自带的插件, 进行Base64编码和解码, ...
- 接口测试 再也不必来回切换,发现一个接口测试软件,可以替代 Swagger+Mock+Jmeter+Postman
前言 日常测试过程中,常常需要多种工具来接力完成自己的接口测试任务. 比如说, 使用swagger查看接口文档, 使用mock编造接口数据对前端页面做测试 使用postman测试后端接口, 用Jm ...
- JZOJ5409. Fantasy && Luogu2048 [NOI2010]超级钢琴
题目大意 给出一个序列和\(L, R\), 求前k大长度在\([L,R]\)之间的连续子序列的和的和. 解题思路 朴素的想法是对于一个左端点\(p\), 它的右区间取值范围是一个连续的区间即\([p+ ...
- Identity Server 4到今年年底就停止支持了,试一下使用Orchard Core 作为认证服务
Identity Server 4到今年年底就停止支持了,新的版本需要收费(好像目前是按企业规模,不过将来说不准).我们需要为这种情况做一些技术准备,至少需要为用户多准备一些可选方案.从目前成熟的开源 ...
- Ant <Delete> 如何只删掉文件夹下所有文件和文件夹
用 fileset 来过滤要删掉的目录和文件 <project name="ant-project" default="example"> < ...
- spring boot 打包war后 部署到外部 tomcat 的具体正确操作【包括修改端口 与 去除请求路径的工程名】
1.前言 工程做好了,总不能放在idea运行吧?不然怎么把项目放到云服务器呢?[这一篇随笔不讲解发布的云服务器的操作,在其他随笔有详细记载.] 解决的方案是把springboot 工程 打包成war文 ...