1. 程式人生 > >汕頭市隊賽 SRM16

汕頭市隊賽 SRM16

記錄 -a 求和 etc str i++ getchar lose 範圍

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; }
View Code

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;
}
View Code

汕頭市隊賽 SRM16