汕头市队赛 SRM16

T3

C-2 SRM 16

描述

给一个数列,给出两种数字, 询问在多少个非空区间中这两种数字出现次数相同。

输入格式

第一行:一个数字n,q,n表示数列长度,q表示q组询问

第二行n个数字表示数列A

接下来q行每行2个数字表示询问

输出格式

输出q行分别对应每个问题的答案

样例输入

2 1

1 2

1 2

样例输出

1

数据范围与约定

n <= 5000,q <= 10000 其他数字在int范围内

样例解释

只有区间[1,2]符合

——————————————————————————

因为 符合的状态就是 a.r-a.l=b.r-b.l

转换一下就是 a.r-b.r=a.l-b.l

然后我们记录一下差然后瞎jb搞就好了

#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int M=1e4+7,mod=9875321;
int read(){
    int ans=0,f=1,c=getchar();
    while(c<‘0‘||c>‘9‘){if(c==‘-‘) f=-1; c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){ans=ans*10+(c-‘0‘); c=getchar();}
    return ans*f;
}
int n,q,k1,k2;
int s[M];
int f[2*M];
int main()
{
    n=read(); q=read();
    for(int i=1;i<=n;i++) s[i]=read();
    for(int i=1;i<=q;i++){
        for(int i=0;i<=2*n;i++) f[i]=0; f[n]=1;
        k1=read(); k2=read();
        int cnt1=0,cnt2=0;
        LL ans=0;
        for(int i=1;i<=n;i++){
            if(s[i]==k1) cnt1++;
            if(s[i]==k2) cnt2++;
            int now=cnt1-cnt2+n;
            ans+=f[now];
            f[now]++;
        }
        printf("%lld\n",ans);
    }
    return 0;
}

C-3 SRM 16

描述

给一个数列, 询问对于在数列中出现过的数字种类集合S。对于所有的x属于S,y属于S,询问在数列中有多少个区间,x,y这两种数字出现次数相同,对于所有的询问求和后输出。

输入格式

第一行:一个数字n

第二行n个数字表示数列A

输出格式

输出1行表示问题的答案

样例输入

2

1 2

样例输出

7

数据范围与约定

n <= 8000, 其他数字在int范围内

样例解释

一共有三种不同的询问

A 询问1,1 共有3个区间

B 询问1, 2共有1个区间

C 询问2,2共有3个区间

—————————————————————————————

这道题就n^2枚举区间 然后记录每个点的出现次数 以及每种出现次数的

就好了

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#define LL long long
using namespace std;
int read(){
    int ans=0,f=1,c=getchar();
    while(c<‘0‘||c>‘9‘){if(c==‘-‘) f=-1; c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){ans=ans*10+(c-‘0‘); c=getchar();}
    return ans*f;
}
const int M=1e4+7;
int n,s[M],sq,ss[M];
LL h[M],f[M],ans,sum;
int main()
{
    n=read();
    for(int i=1;i<=n;i++) s[i]=read(),ss[i]=s[i];
    sort(ss+1,ss+1+n);
    sq=unique(ss+1,ss+1+n)-ss-1;
    for(int i=1;i<=n;i++) s[i]=lower_bound(ss+1,ss+1+n,s[i])-ss;
    for(int i=1;i<=n;i++){
        memset(h,0,sizeof(h));
        memset(f,0,sizeof(f));
        sum=sq*(sq+1)/2;
        h[0]=sq;
        for(int j=i;j<=n;j++){
            sum=sum-h[f[s[j]]]+h[f[s[j]]+1]+1;
            ans+=sum;
            h[f[s[j]]]--; h[f[s[j]]+1]++;
            f[s[j]]++;
        }
    }printf("%lld\n",ans);
    return 0;
}

时间: 2024-11-07 12:06:28

汕头市队赛 SRM16的相关文章

汕头市队赛 SRM16 T2

描述 猫和老鼠,看过吧?猫来了,老鼠要躲进洞里.在一条数轴上,一共有n个洞,位置分别在xi,能容纳vi只老鼠.一共有m只老鼠位置分别在Xi,要躲进洞里,问所有老鼠跑进洞里的距离总和最小是多少. 输入格式 两个用空格隔开的整数m和n. 这一行m个数字分别表示老鼠的位置 接下来n行每行两个数字分别表示洞的位置和容纳量 输出格式 一个整数,表示最小的距离总和.(如果无解,输出-1) 样例输入 4 5 6 2 8 9 3 6 2 1 3 6 4 7 4 7 样例输出 11----------------

汕头市队赛 C KMP codeforces B. Image Preview

汕头市队赛题目传送门 codeforces题目传送门 这道题我的做法是 尝试先往左走然后往右走 或者先往右走然后往左走 然后注意一下枚举顺序就okay啦 #include<cstdio> #include<cstring> #include<algorithm> #define LL long long using namespace std; const int M=1e6+7; LL read(){ LL ans=0,f=1,c=getchar(); while(c

汕头市队赛SRM15

T1--czl SRM 15 众所周知,czl家养了一只可♂爱的***(已屏蔽),那只东西很贪吃,所以czl家很多零食仓库,然而这些仓库里有很多老鼠. 为了心爱的***,czl决定点燃纯艾条,用烟熏老鼠. 共有N个仓库,编号1-N. 假设陵陵在第i个仓库点燃艾条,烟雾就会充满该仓库,并向左右扩散Ai 的距离,接着所有|i-j|<=Ai 的仓库 j 的老鼠被消灭. 陵陵是个爱护环境的人,他想知道最少需要多少支艾条,才可以消灭所有老鼠. [输入格式] 第一行:一个正整数,代表 N. 第二行:N 个非

汕头市队赛 SRM13 T3

这道题可以贪心 维护一个答案队列 枚举位置 每次将比当前位置大的队尾全部替代掉 记录删了多少了就好了 #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<string> #define LL long long using namespace std; const int M=1e7+7; int n,k,cnt; char s[M]

汕头市队赛 SRM 09 A 撕书

A 撕书I-3 SRM 09 背景&&描述 琉璃在撕书.     书总共有n页,都悬浮在数轴上,第i页的位置为,上面写着一个数字.     琉璃从右往左撕书.假如看到了第i页,就把在第i页左边,且与之距离<=的书都撕掉.(第i页本身不撕)     夜子为了尽量地保全魔法书,决定偷偷在琉璃开始撕之前,增加一页.增加的这一页必须在所有书页的右边,数字随意.     夜子想知道,最少会有多少页书被撕毁. 输入格式 第一行一个整数n,表示书页数. 接下来n行,第i行的俩整数分别为和. 输出格

汕头市队赛 SRM 09 B 撕书

B 撕书II-3 SRM 09 背景&&描述 琉璃手头有一黑一白两本魔法书,一本是<缟玛瑙的不在证明>,另一本是<白色相簿1.5>     传说同时打开这两本书会有奇怪的事情发生.     琉璃打开一看,果然非常奇怪:两本书上都各自写着一个正整数(可能他买到盗版了),分别是a和b.     试图撕书的汀想借过来看看,但琉璃只告诉了他这俩数加起来的值x和异或起来的值y.     汀发现有很多种(a,b)满足琉璃告诉他的信息...你能帮他算出来有多少种吗? 输入格式 两

汕头市队赛 SRM13 T2

这道题很容易想到是二分 但是因为可能会爆LL 所以要加一波特判 #include<cstdio> #include<cstring> #include<algorithm> #define LL long long using namespace std; const LL M=1e6+7,mx=1e18; LL read(){ LL ans=0,c=getchar(); while(c<'0'||c>'9') c=getchar(); while(c>

汕头市队赛 SRM1X T2 ——扫描线

绵津见-终 SRM 13 背景 "西瓜也是可以种在海上的!"--绵津见 然而种在海上的西瓜最需要防范的,是时不时会涌向瓜田的阵阵海浪. 幸好,身为海神的绵津见可以释放魔法"水平如镜"来阻止海浪拍打西瓜. 然而,当西瓜一个接一个成熟之时,它们就要离开瓜田,飘向遥远的彼岸.绵津见的魔法无法保护离开瓜田的西瓜们,但至少,也得知道西瓜们遭遇了多大的风浪啊. 描述 我们用一个坐标系来描述大海,绵津见的瓜田位于x轴下方,每当有一个西瓜成熟时,它会从x轴上一点出发,沿一条平行y轴

汕头市队赛 SRM 06 C 秀恩爱

C 秀恩爱 SRM 06 背景&&描述 KPM坐在直升机上俯瞰小渔村景象. 渔村可看作二维平面,密密麻麻地到处都是单身狗,KPM当前所在坐标为(sx,sy). KPM的后宫团们自发地聚集在一起为他送行,从空中看,后宫团形成了一个多边形. 当然了KPM是不在那个多边形内的. 直升机突然开始原地转圈,后宫团们因为想看着KPM的正脸,所以也跟着以KPM所在坐标为中心旋转. 后宫团所经之处单身狗尸横遍野.赶来救治伤员的医护人员想知道,多边形扫过的面积是多少. 注意,本题不保证横坐标互不相同.纵坐标