[CometOJ] CometOJ # 8 문제 해결 보고서

대회를 입력하려면 여기를 클릭

\ (A \) : 킬러 퀸 ( 문제의 표면을 보려면 여기를 클릭 )

대략 질문의 의미 : 사전 식 작은 문자열을 찾을 수 있습니다.

하위 주제를 보낼 수있는 게임은 항상있다. . .

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
using namespace std;
int n;string s;
int main()
{
    RI i;string st;for(cin>>n>>s,i=2;i<=n;++i) cin>>st,st<s&&(s=st,0);//读入,求字典序最小字符串
    return cout<<s<<endl,0;//输出
}

\ (B의 \) : 지원시 ( 문제의 표면을 보려면 여기를 클릭 )

일반적으로 문제의 의미 각각에 대해 \ (X \) 추구 \ (\ sum_ 1} ^ {N-I = (A_I-a_x) ^ 2 \.) .

사각형의 철거 :

\ [\ Sum_ I = {1} ^ N (A_I '2-2a_ia_x a_x + 2) = \ sum_ {I} = 1'na_i 2-2a_x \ sum_ {I = 1} ^ + na_i na_x 2 \ ]

찾기 어려울만큼 전처리로서 \ (\ sum_ {I = 1 } ^ na_i ^ 2 \) 와 \ (\ sum_ = {I}. 1 na_i ^ \) , 각 \ (X \) 일 수 직접 \ (O (1) \) 를 산출한다.

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 100000
#define LL long long
using namespace std;
int n,a[N+5];
int main()
{
    RI i;LL s=0,s2=0;for(scanf("%d",&n),i=1;i<=n;++i) scanf("%d",a+i),s+=a[i],s2+=1LL*a[i]*a[i];//预处理和及平方和
    for(i=1;i<=n;++i) printf("%lld ",s2-2*s*a[i]+1LL*n*a[i]*a[i]);return 0;//计算答案并输出
}

\ (C \) : 룬 에너지 ( 표면 타이틀을 보려면 여기를 클릭 )

일반적으로, 질문의 의미 두 배열 \ (A, B \) , 인터벌 기간이 선택 될 수있다 \ ([L, R & LT] \) 이므로 \ (L \ 르 I \ 르 R \) 모든 \ (A_I, b_i \) 에 의해 승산 \ (K \) 추구 \ (\ sum_ I = {2 } A_I \) ^ {nb_ I-1} 최소값이다.

이 직접 할 수 있습니다 \ (DP \) .

우리는 설정 \는 (F_i \) 선택에있어서의 대표 \ (I는 \)\ (I는 \)를 최소 변화 값이 얻어 질 수있는 부분의 기간의 끝이 아니다.

전송 시간의 부 하나 케이스 논의 하나는 \ (I는 \) 내부 영역에, 다른 하나는 \ (나는 \) 간격의 시작 :

\ [F_i = 분 (F_ {I - 1} + {CL I-1} A_I (Q ^ 2-1), CL-1 {I} A_I (K-1)) \]

동시에 우리가 사용할 때마다 (내가 \) \ 사건의 끝은 값에서 가장 작은 변화를 업데이트 :

\ [Mn이 분 (N, I-F_ {1} + B_ {I-1} A_I (K-1)) \]

마지막 대답은 원래의 값을 더한 최소한의 변화에 ​​대한 답변입니다.

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 100000
#define LL long long
#define min(x,y) ((x)<(y)?(x):(y))
#define Gmin(x,y) (x>(y)&&(x=(y)))
using namespace std;
int n,k,a[N+5],b[N+5];LL f[N+5];
int main()
{
    RI i;LL Mn=0,ans=0;for(scanf("%d%d",&n,&k),i=1;i<=n;++i) scanf("%d%d",a+i,b+i);//读入
    for(i=1;i<=n+1;++i) Gmin(Mn,f[i-1]+b[i-1]*a[i]*(k-1)),//更新最小变化值
        ans+=b[i-1]*a[i],f[i]=min(b[i-1]*a[i]*(k-1),f[i-1]+b[i-1]*a[i]*(k*k-1));//计算原先答案,并动态规划转移f[i]
    return printf("%lld",ans+Mn),0;//输出答案
}

\ (D \) : 카이 카이 야채 ( 문제의 표면을 보려면 여기를 클릭 )

대략 질문의 의미 유향 그래프, 값들의 범위를 요구마다 직접 오른쪽 및 범위 내에서 연결되는 다른 지점 간격과 지점을 찾기.

우리는 정의 \이 (L_i \)\ (나는 \) 보다 작은 번호의 포인트 연결 \ (나는 \) 의 최대 수, \을 (r_i \)\ (나는 \) 보다 큰 수의 점을 연결 \ (I \) 최소 수.

현재 쿼리 간격 세트 \을 ([L, R & LT] \)은 그것이 만족 경우만 및 다음 포인트는 질의 기여 :

\ [l_i <L \ 르 I \ 르 R <r_i \]

즉 :

\ [L_i + 1 \ W \ C \ R 그 \ r_i -1- \]

그리고 우리가 오프라인으로 고려할 수, 당신이하라는 메시지가 표시됩니다 \ (L의 \) 종류.

그럼 우리가 열거 \ (L의 \) 모두를 위해, 때마다 \ (l_i + 1 = L의 \ ) 입니다 \ (내가 \) , 그들은, 그래서 유지 보수 펜윅 트리의 조건을 충족 \ (I \ 심 r_i-을 1 \) 위치를 추가합니다 \ (A_I \) .

한편, \. (1-L의 \) 이 위치 심문 범위를 초과하고 있으므로 \ (L-1 \ SIM R_ {L-1} -1- \) 위치 감산 \ (A_ {L-1} \) .

물었을 때, 물어 \ (a_R \) 위치로 값을.

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 1000000
#define swap(x,y) (x^=y^=x^=y)
#define Gmin(x,y) (x>(y)&&(x=(y)))
#define Gmax(x,y) (x<(y)&&(x=(y)))
using namespace std;
int n,m,Qt,a[N+5],l[N+5],r[N+5],L[N+5],R[N+5];
vector<int> s[N+5],q[N+5];vector<int>::iterator it;
class FastIO
{
    private:
        #define FS 100000
        #define tc() (A==B&&(B=(A=FI)+fread(FI,1,FS,stdin),A==B)?EOF:*A++)
        #define tn (x<<3)+(x<<1)
        #define D isdigit(c=tc())
        char c,*A,*B,FI[FS];
    public:
        I FastIO() {A=B=FI;}
        Tp I void read(Ty& x) {x=0;W(!D);W(x=tn+(c&15),D);}
        Ts I void read(Ty& x,Ar&... y) {read(x),read(y...);}
}F;
class TreeArray//树状数组
{
    private:
        #define lowbit(x) (x&-x)
        int v[N+5];
        I void Upt(RI x,CI y) {W(x<=n) v[x]+=y,x+=lowbit(x);}//修改后缀
    public:
        I void Add(CI l,CI r,CI v) {Upt(l,v),Upt(r+1,-v);}//区间修改,差分
        I int Qry(RI x,RI t=0) {W(x) t+=v[x],x-=lowbit(x);return t;}//单点询问
}T;
int main()
{
    RI i,x,y;long long ans=0;
    for(F.read(n,m,Qt),i=1;i<=n;++i) F.read(a[i]),l[i]=0,r[i]=n+1;//初始化
    for(i=1;i<=m;++i) F.read(x,y),x>y?Gmax(l[x],y):Gmin(r[x],y);//预处理l,r
    for(i=1;i<=n;++i) s[l[i]].push_back(i);//对于l[i]开桶,方便后面的操作
    for(i=1;i<=Qt;++i) F.read(L[i],R[i]),q[L[i]].push_back(i);//读入询问,并桶排
    for(i=1;i<=n;++i)//枚举L
    {
        i^1&&(T.Add(i-1,r[i-1]-1,-a[i-1]),0);//删去L-1的贡献
        for(it=s[i-1].begin();it!=s[i-1].end();++it) T.Add(*it,r[*it]-1,a[*it]);//对于所有l[i]+1=L的i,加上其贡献
        for(it=q[i].begin();it!=q[i].end();++it) ans^=1LL*(*it)*T.Qry(R[*it]);//枚举R询问
    }return printf("%lld",ans),0;
}

\ (E \) : 매직 기능 ( 문제의 표면을 보려면 여기를 클릭 )

일반적으로 질문의 의미 : \ (또는, D (X) \)\ (X는 \) 보다 큰 \ (1 \) 최소 요소, \ (F (X) = 케이스 그 \ 시작 {1} = X & \\ D 1 (X를 ) F (\ X FRAC {D (X) ^ 2}) D (X) ^ 2 | X \\ F (\ X FRAC {D (X)}) 및 기타 케이스를 끝 {} \ \) , 추구하는 \ (\ sum_ = {I}. ^ 1 NF (I) \) .

우리는 설정 \ (X = \ sum_ {I를 =. 1} ^ tp_i ^ {C_I} \) 다음 \ (F (X) = \ sum_ {I = 1} ^ tp_i ^ {\ lfloor의 \의 FRAC {C_I} 2 \ } rfloor \) . 다음과 같이 인증 :

경우 a (P_i \) \ , 만약 \ (C_I \ GE 2 \) 에 의해, \ (F (X) = D (x)는 F (\ FRAC의 X {D (X) ^ 2}) \ (d (X ) ^ 2 | X) \) 제거한다 \) (X를 \을\ (P_i \) 주고, (F를 \을 (X) \)\ (1 \) \ (P_i \) , 즉 \ (C_I \) 숫자로 나눈 \ (2 \) .

그리고 만약 \. (1 C_I = \) 에 의해 \ (F (X) = F (\ FRAC의 X {D (X)}) \ 기타 \) 풋 것 (P_i \)는 \ 이외에 사라지고, 즉, 에서 두 사람은 내림.

그리고, \ (F (N- 형) \) 명백하게 \ (O (\ SQRT N) \) 레벨.

그래서 우리는 열거 할 수 \을 (F (I) \) 제공 \ (g (x)는 \) 대표 \는 (\ n은 1 \ SIM) 광장 - 자유의 카운트 수, 대답은 :

\ [\ sum_ I = {1} ^ {\의 SQRT 않음} I \ cdot g (\ lfloor의 \의 FRAC N {I ^ 2} \ rfloor) \]

상기 식에서 \ (G \) 의미는 사각형 요소가 포함 된 수의 경우이다 \ (K ^ 2 \)는 다음의 \ (F \) 값이 될 것입니다 \ (IK \) ,이 요인 제곱 포함 할 수 없습니다.

그런 고려 \ (G \) 사용될 수있다 포함 및 배제의 값을 찾기위한 방법 및 음량 계수가 발수성 인 \ (\ MU \) . 그래서 :

\ [MU (I) \ g (X) = \ sum_ I = {1} ^ {\의 SQRT의 X} \ lfloor \ FRAC N {I ^ 2} \ rfloor \]

여기에 위의 대답, 그리고 들어 \ (G \) , 우리는 빠르게 부문은 상대적으로 평가를 차단하는 데 사용할 수 있지만 붙어있는 것 같다. . .

그래서 우리는 아웃 사전이 \ (X의 \의 le10 ^ 7 \ ) 의 \ (G (X 축)을 \) , 우리가 할 수 있도록 전.

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define LS 10000000
#define LL long long
using namespace std;
LL n;
template<int SZ> class LinearSieve//线性筛
{
    private:
        int Pt,P[SZ+5],mu[SZ+5];
    public:
        LL smu[SZ+5],smu2[SZ+5];
        I LinearSieve()
        {
            RI i,j;for(mu[1]=1,i=2;i<=LS;++i)
                for(!P[i]&&(mu[P[++Pt]=i]=-1),j=1;j<=Pt&&1LL*i*P[j]<=SZ;++j)
                    if(P[i*P[j]]=1,i%P[j]) mu[i*P[j]]=-mu[i];else break;
            for(i=1;i<=LS;++i) smu[i]=smu[i-1]+mu[i],smu2[i]=smu2[i-1]+mu[i]*mu[i];//筛mu和以及平方和
        }
};LinearSieve<LS> L;
I LL G(Con LL& x)
{
    if(x<=LS) return L.smu2[x];RI l,r,sx=sqrt(x);LL res=0;//x较小时直接返回答案
    for(l=1;l<=sx;l=r+1) r=sqrt(x/(x/(1LL*l*l))),res+=x/(1LL*l*l)*(L.smu[r]-L.smu[l-1]);//除法分块
    return res;//返回答案
}
int main()
{
    RI Tt,l,r,sn;LL ans=0;scanf("%d",&Tt);W(Tt--)
    {
        scanf("%lld",&n),sn=sqrt(n),ans=0;//读入
        for(l=1;l<=sn;l=r+1) r=sqrt(n/(n/(1LL*l*l))),ans+=G(n/(1LL*l*l))*(l+r)*(r-l+1)>>1;//除法分块
        printf("%lld\n",ans);//输出答案
    }return 0;
}

\ (F \) : 골드 경험 ( 문제의 표면을 보려면 여기를 클릭 )

그래서 어려운 주제, 나는 분명하지 않습니다. . .

구덩이를 떠나는 것이 가득합니다.

추천

출처www.cnblogs.com/chenxiaoran666/p/CometOJ8.html